From a05d0b80a21fef8e1a09a14b46cecc08596030b9 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Fri, 3 Apr 2026 13:22:30 +0800 Subject: [PATCH] feat: expand editor scripting asset and viewport flow --- AGENT.md | 395 +++--- CMakeLists.txt | 2 +- MVS/ui/README.md | 214 +-- README.md | 297 ++-- editor/CMakeLists.txt | 11 + editor/README.md | 326 +++-- editor/caidan.png | Bin 180 -> 0 bytes editor/color.png | Bin 51420 -> 0 bytes editor/color_xc.png | Bin 32137 -> 0 bytes editor/project.png | Bin 30046 -> 0 bytes editor/rename_color.py | 28 - editor/resources/Icons/camera_gizmo.png | Bin 0 -> 672 bytes editor/resources/Icons/main_light_gizmo.png | Bin 0 -> 1166 bytes editor/resources/Icons/mesh_icon.png | Bin 10719 -> 232 bytes editor/resources/Icons/mesh_icondd.png | Bin 0 -> 10719 bytes editor/resources/Icons/view_move.png | Bin 0 -> 657 bytes editor/resources/Icons/view_orbit.png | Bin 0 -> 381 bytes editor/src/Actions/EditorActions.h | 8 + editor/src/Actions/HierarchyActionRouter.h | 53 +- editor/src/Actions/MainMenuActionRouter.h | 21 + editor/src/Application.cpp | 126 ++ editor/src/Application.h | 16 + editor/src/Commands/EntityCommands.h | 28 + editor/src/Commands/ProjectCommands.h | 29 + .../AssetReferenceEditorUtils.h | 2 +- .../ComponentEditorRegistry.cpp | 2 + .../ComponentEditors/ScriptComponentEditor.h | 515 +++++++ .../ScriptComponentEditorUtils.h | 125 ++ editor/src/Core/EditorEvents.h | 18 + editor/src/Core/EventBus.h | 19 +- editor/src/Core/IProjectManager.h | 9 + editor/src/Core/PlaySessionController.cpp | 116 ++ editor/src/Core/PlaySessionController.h | 10 + editor/src/Managers/ProjectManager.cpp | 109 ++ editor/src/Managers/ProjectManager.h | 1 + .../Scripting/EditorScriptAssemblyBuilder.cpp | 372 +++++ .../Scripting/EditorScriptAssemblyBuilder.h | 21 + .../EditorScriptAssemblyBuilderUtils.h | 106 ++ .../src/Scripting/EditorScriptRuntimeStatus.h | 17 + editor/src/UI/Widgets.h | 30 +- editor/src/Viewport/IViewportHostService.h | 10 + .../Passes/SceneViewportEditorOverlayPass.cpp | 1255 +++++++++++++++++ .../Passes/SceneViewportEditorOverlayPass.h | 89 ++ .../Viewport/SceneViewportCameraController.h | 26 +- .../Viewport/SceneViewportEditorOverlayData.h | 144 ++ .../src/Viewport/SceneViewportMoveGizmo.cpp | 208 +-- editor/src/Viewport/SceneViewportMoveGizmo.h | 22 +- .../Viewport/SceneViewportOverlayBuilder.cpp | 431 ++++++ .../Viewport/SceneViewportOverlayBuilder.h | 25 + .../SceneViewportOverlayHandleBuilder.h | 543 +++++++ .../Viewport/SceneViewportOverlayHitTester.h | 186 +++ .../Viewport/SceneViewportOverlayRenderer.cpp | 302 +--- .../Viewport/SceneViewportOverlayRenderer.h | 8 +- .../src/Viewport/SceneViewportRotateGizmo.cpp | 221 ++- .../src/Viewport/SceneViewportRotateGizmo.h | 25 +- .../src/Viewport/SceneViewportScaleGizmo.cpp | 120 +- editor/src/Viewport/SceneViewportScaleGizmo.h | 15 +- .../SceneViewportTransformGizmoFrameBuilder.h | 323 +++++ .../Viewport/ViewportHostRenderFlowUtils.h | 2 + editor/src/Viewport/ViewportHostService.h | 273 ++++ editor/src/panels/GameViewPanel.cpp | 158 ++- editor/src/panels/InspectorPanel.h | 61 + editor/src/panels/MenuBar.cpp | 13 +- editor/src/panels/ProjectPanel.cpp | 216 ++- editor/src/panels/ProjectPanel.h | 9 + editor/src/panels/SceneViewPanel.cpp | 650 +++++---- editor/src/panels/SceneViewPanel.h | 12 + editor/src/panels/ViewportPanelContent.h | 1 + editor/tab.png | Bin 2442 -> 0 bytes editor/unity.png | Bin 804969 -> 0 bytes editor/unity_grid.png | Bin 119665 -> 0 bytes engine/CMakeLists.txt | 4 + .../XCEngine/Components/MeshFilterComponent.h | 3 + .../Components/MeshRendererComponent.h | 2 + .../XCEngine/Core/Asset/AssetDatabase.h | 30 +- .../XCEngine/Core/Asset/AssetImportService.h | 38 + .../XCEngine/Core/Asset/ProjectAssetIndex.h | 37 + .../XCEngine/Core/Asset/ResourceManager.h | 7 +- engine/include/XCEngine/Input/InputManager.h | 6 + .../XCEngine/Rendering/CameraRenderRequest.h | 1 + .../XCEngine/Scripting/IScriptRuntime.h | 23 + .../Scripting/Mono/MonoScriptRuntime.h | 2 + .../XCEngine/Scripting/NullScriptRuntime.h | 2 + .../XCEngine/Scripting/ScriptComponent.h | 1 + .../include/XCEngine/Scripting/ScriptEngine.h | 8 + engine/src/Components/MeshFilterComponent.cpp | 39 +- .../src/Components/MeshRendererComponent.cpp | 71 +- engine/src/Core/Asset/AssetDatabase.cpp | 22 + engine/src/Core/Asset/AssetImportService.cpp | 88 ++ engine/src/Core/Asset/ProjectAssetIndex.cpp | 173 +++ engine/src/Core/Asset/ResourceManager.cpp | 61 +- engine/src/Input/InputManager.cpp | 64 +- engine/src/Rendering/CameraRenderer.cpp | 19 + .../src/Resources/Material/MaterialLoader.cpp | 174 +++ .../src/Scripting/Mono/MonoScriptRuntime.cpp | 152 +- engine/src/Scripting/NullScriptRuntime.cpp | 6 + engine/src/Scripting/ScriptComponent.cpp | 13 + engine/src/Scripting/ScriptEngine.cpp | 79 ++ managed/CMakeLists.txt | 89 ++ managed/GameScripts/InputProbe.cs | 52 + managed/GameScripts/LifecycleProbe.cs | 4 + managed/GameScripts/TickLogProbe.cs | 48 + managed/XCEngine.ScriptCore/Input.cs | 94 ++ managed/XCEngine.ScriptCore/InternalCalls.cs | 48 + managed/XCEngine.ScriptCore/KeyCode.cs | 93 ++ managed/XCEngine.ScriptCore/Time.cs | 1 + .../test_mesh_render_components.cpp | 63 +- tests/Input/test_input_manager.cpp | 43 +- tests/Scene/test_scene.cpp | 11 +- tests/Scene/test_scene_runtime.cpp | 6 + tests/TEST_SPEC.md | 315 +++-- tests/core/Asset/test_resource_manager.cpp | 77 + tests/editor/CMakeLists.txt | 35 +- tests/editor/test_action_routing.cpp | 75 + .../test_editor_script_assembly_builder.cpp | 113 ++ ...t_editor_script_assembly_builder_utils.cpp | 74 + tests/editor/test_play_session_controller.cpp | 116 ++ ...test_play_session_controller_scripting.cpp | 641 +++++++++ .../test_scene_viewport_camera_controller.cpp | 8 +- .../test_script_component_editor_utils.cpp | 135 ++ tests/scripting/CMakeLists.txt | 20 + tests/scripting/test_mono_script_runtime.cpp | 303 ++++ .../test_project_script_assembly.cpp | 87 ++ tests/scripting/test_script_engine.cpp | 84 ++ 124 files changed, 10397 insertions(+), 1737 deletions(-) delete mode 100644 editor/caidan.png delete mode 100644 editor/color.png delete mode 100644 editor/color_xc.png delete mode 100644 editor/project.png delete mode 100644 editor/rename_color.py create mode 100644 editor/resources/Icons/camera_gizmo.png create mode 100644 editor/resources/Icons/main_light_gizmo.png create mode 100644 editor/resources/Icons/mesh_icondd.png create mode 100644 editor/resources/Icons/view_move.png create mode 100644 editor/resources/Icons/view_orbit.png create mode 100644 editor/src/ComponentEditors/ScriptComponentEditor.h create mode 100644 editor/src/ComponentEditors/ScriptComponentEditorUtils.h create mode 100644 editor/src/Scripting/EditorScriptAssemblyBuilder.cpp create mode 100644 editor/src/Scripting/EditorScriptAssemblyBuilder.h create mode 100644 editor/src/Scripting/EditorScriptAssemblyBuilderUtils.h create mode 100644 editor/src/Scripting/EditorScriptRuntimeStatus.h create mode 100644 editor/src/Viewport/Passes/SceneViewportEditorOverlayPass.cpp create mode 100644 editor/src/Viewport/Passes/SceneViewportEditorOverlayPass.h create mode 100644 editor/src/Viewport/SceneViewportEditorOverlayData.h create mode 100644 editor/src/Viewport/SceneViewportOverlayBuilder.cpp create mode 100644 editor/src/Viewport/SceneViewportOverlayBuilder.h create mode 100644 editor/src/Viewport/SceneViewportOverlayHandleBuilder.h create mode 100644 editor/src/Viewport/SceneViewportOverlayHitTester.h create mode 100644 editor/src/Viewport/SceneViewportTransformGizmoFrameBuilder.h delete mode 100644 editor/tab.png delete mode 100644 editor/unity.png delete mode 100644 editor/unity_grid.png create mode 100644 engine/include/XCEngine/Core/Asset/AssetImportService.h create mode 100644 engine/include/XCEngine/Core/Asset/ProjectAssetIndex.h create mode 100644 engine/src/Core/Asset/AssetImportService.cpp create mode 100644 engine/src/Core/Asset/ProjectAssetIndex.cpp create mode 100644 managed/GameScripts/InputProbe.cs create mode 100644 managed/GameScripts/TickLogProbe.cs create mode 100644 managed/XCEngine.ScriptCore/Input.cs create mode 100644 managed/XCEngine.ScriptCore/KeyCode.cs create mode 100644 tests/editor/test_editor_script_assembly_builder.cpp create mode 100644 tests/editor/test_editor_script_assembly_builder_utils.cpp create mode 100644 tests/editor/test_play_session_controller_scripting.cpp create mode 100644 tests/editor/test_script_component_editor_utils.cpp create mode 100644 tests/scripting/test_project_script_assembly.cpp diff --git a/AGENT.md b/AGENT.md index 11be9597..55fcf007 100644 --- a/AGENT.md +++ b/AGENT.md @@ -1,211 +1,242 @@ # XCEngine Agent Guide -这个文件面向进入当前仓库的开发者 / Codex / Agent。目标不是介绍项目,而是快速建立对“当前工程状态、真实约束、推荐入口与协作方式”的统一认知。 +这个文件面向在当前仓库里工作的 coding agent / 开发者。它不负责介绍项目卖点,而是给出当前 checkout 的真实工程状态、优先入口、硬约束和推荐验证方式。 -项目介绍与目录总览看 [README.md](README.md);设计原则与当前测试规则以本文为准。 +如果 README、旧文档和当前文件树 / `CMakeLists.txt` / 测试 target 冲突,以当前 checkout 为准,并在本次工作里顺手修正文档。 -## 1. 先看什么 +## 1. 先建立的事实 -进入仓库后,优先读这几份文档: +- 顶层 `CMakeLists.txt` 当前纳入 `engine/`、`editor/`、`managed/`、`mvs/RenderDoc/` 和 `tests/`。 +- `engine/` 构建静态库 `XCEngine`;`editor/` 构建 `XCEditor`,但输出文件名仍是 `editor/bin//XCEngine.exe`。 +- editor 默认把仓库内的 `project/` 识别为工程根目录,也支持 `--project ` 覆盖。 +- 当前工程不再只是 `Assets/` 目录:已经真实使用 `Assets/ + .meta + Library/` 的工程布局。 +- Mono 运行时与 editor 脚本类发现都从 `/Library/ScriptAssemblies/` 加载程序集。 +- `engine/CMakeLists.txt` 当前对 Vulkan 是硬依赖;`editor/` 和 `tests/` 首次配置会拉取 `ImGui` 和 `googletest`。 + +## 2. 优先阅读顺序 + +进入仓库后,优先看这些文档和入口文件: 1. [AGENT.md](AGENT.md) 2. [README.md](README.md) 3. [docs/plan/end/RHI模块设计与实现/RHI模块总览.md](docs/plan/end/RHI模块设计与实现/RHI模块总览.md) -4. [docs/plan/Renderer模块设计与实现.md](docs/plan/Renderer模块设计与实现.md) -5. [tests/TEST_SPEC.md](tests/TEST_SPEC.md) +4. [docs/plan/Shader与Material系统下一阶段计划.md](docs/plan/Shader与Material系统下一阶段计划.md) +5. [docs/plan/SceneViewport_Overlay_Gizmo_Rework_Plan.md](docs/plan/SceneViewport_Overlay_Gizmo_Rework_Plan.md) +6. [tests/TEST_SPEC.md](tests/TEST_SPEC.md) -其中: +额外规则: -- `RHI模块总览.md` 是 RHI 设计原则基线 -- `Renderer模块设计与实现.md` 是当前渲染层演进方向 -- `TEST_SPEC.md` 是测试组织、GT 图规则和 CMake/CTest 入口基线 +- 如果任务落在某个模块里,先读该模块的 `CMakeLists.txt` 和最近的测试目录。 +- `tests/TEST_SPEC.md` 仍然适合作为 GT 图规则和 RHI 边界说明,但 target 名称与目录变化时,始终以当前 `tests/CMakeLists.txt` 和子模块 `CMakeLists.txt` 为准。 -## 2. 当前工程状态 +## 3. 当前工程状态 -### 2.1 引擎整体 +### 3.1 Engine 与工程布局 -当前仓库已经不再处于“先把底层跑起来”的阶段,而是处于: +当前仓库已经不在“先把底层 sample 跑起来”的阶段,而是已经形成: -- `RHI` 已具备可维护的三后端基线 -- `Rendering` 已形成正式模块,不再只是零散 sample 代码 -- `Editor` 已能通过引擎渲染链路驱动 viewport -- `Scripting` 已具备 Mono 托管程序集构建和基础运行时测试 +- `RHI` +- `Rendering` +- `Editor viewport` +- `AssetDatabase / Library` +- `Mono scripting` -当前主线工作不应继续封闭式堆 RHI,而应在不破坏测试基线的前提下,继续推进渲染、编辑器和脚本三者的对接。 +这几条主线之间的真实对接。 -### 2.2 RHI +`Core/Asset/AssetDatabase` 现在是当前工程的重要基线,不是预研代码。它已经负责: -当前正式支持的后端: +- 扫描 `Assets/` +- 为资源生成 `.meta` +- 维护 `Library/SourceAssetDB/assets.db` +- 维护 `Library/ArtifactDB/artifacts.db` +- 维护哈希化 `Library/Artifacts/` -- `D3D12` -- `OpenGL` -- `Vulkan` +因此: -当前 RHI 的基本判断: +- `project/Library/` 虽然可重建,但在当前 workflow 里不是可以随手忽略的“垃圾目录”。 +- 涉及资源导入、meta、artifact、脚本程序集发现时,不要擅自删除 `project/Library/` 或 `.meta` 文件来“清环境”。 -- 抽象层已经可用 -- 后端差异路径已经被一轮轮集成测试逼出了很多真实问题并修过 -- 但它仍然不是“完全封顶”的模块 +### 3.2 Rendering -看到上层新问题时,不要本能地用“测试特判 / 测试绕过 / include 私有头”来糊过去;优先判断是不是 RHI 根因。 - -### 2.3 Rendering - -当前 `engine/include/XCEngine/Rendering/` 与 `engine/src/Rendering/` 已经落地: +当前 `engine/include/XCEngine/Rendering/` 与 `engine/src/Rendering/` 已经形成正式主链: +- `SceneRenderer` +- `CameraRenderer` +- `RenderPipeline` - `RenderSceneExtractor` - `RenderResourceCache` +- `SceneRenderRequestPlanner` - `RenderSurface` -- `CameraRenderer` -- `SceneRenderer` -- `BuiltinForwardPipeline` -- `RenderMaterialUtility` + +当前已经落地并应被视为正式能力的内容包括: + +- 内建 forward 主几何渲染 +- `ObjectId` 渲染与 editor picking +- `BuiltinInfiniteGridPass` +- `BuiltinObjectIdOutlinePass` +- `CameraRenderRequest::overlayPasses` + +当前 Renderer 的下一阶段主线不是 render graph,而是: + +- shader asset contract +- material GPU binding +- builtin pass contract +- renderer-owned feature contract + +对应设计文档是 [docs/plan/Shader与Material系统下一阶段计划.md](docs/plan/Shader与Material系统下一阶段计划.md)。 + +### 3.3 Editor + +当前 editor 的事实: + +- 它仍然是 `D3D12` 宿主应用。 +- Scene/Game viewport 已经通过引擎 `Rendering + RHI` 输出离屏纹理。 +- `ViewportHostService` 是 editor 与 renderer 的关键接线层。 +- object-id picking、selection outline、scene icon / gizmo overlay 已经进入正规化收口阶段。 + +当前 `editor/src/Viewport/` 已经存在: + +- `SceneViewportOverlayBuilder` +- `SceneViewportEditorOverlayPass` +- `SceneViewportPicker` +- `SceneViewportMoveGizmo` +- `SceneViewportRotateGizmo` +- `SceneViewportScaleGizmo` 这意味着: -- 当前已经存在正式的场景渲染运行时 -- 不要再把真实渲染逻辑塞回 `mvs/` 样例里长期存活 -- 新渲染功能优先落在 `Rendering` 模块与配套测试中 +- editor 是宿主,不是第二套 renderer。 +- 新的世界空间 overlay,不应继续堆回 `SceneViewPanel.cpp` 的 ImGui world overlay 路径。 +- 优先沿 `overlayPasses -> overlay builder -> canonical frame data -> overlay pass` 方向扩展。 -### 2.4 Editor +### 3.4 Scripting -当前 editor 的关键事实: +当前脚本链路由三部分组成: -- 它仍然是 `D3D12` 宿主应用 -- Scene/Game viewport 已通过离屏纹理接入引擎 `SceneRenderer` -- `editor/src/Viewport/ViewportHostService.h` 当前直接依赖 `RHI::D3D12Device` -- Scene view 相机控制已经有独立控制器与单测 +- `managed/XCEngine.ScriptCore/` +- `managed/GameScripts/` +- `project/Assets/**/*.cs` -因此当前要注意: +构建结果分两类: -- 引擎渲染逻辑应继续收敛在 `engine/Rendering` -- editor 只是宿主,不应复制一套独立 renderer -- editor 侧若要继续做 viewport 能力,应尽量围绕 `RenderSurface` 和引擎场景渲染入口扩展 +- `xcengine_managed_assemblies` 生成引擎示例程序集 +- `xcengine_project_managed_assemblies` 生成项目脚本程序集,并复制到 `project/Library/ScriptAssemblies/` -### 2.5 Scripting +`ScriptEngine` 当前已经具备: -当前脚本链路: +- 脚本类发现 +- 字段元数据读取 +- 默认值读取 +- stored override 管理 +- 运行时 managed field 同步 -- `managed/XCEngine.ScriptCore/`:托管 API -- `managed/GameScripts/`:托管测试 / 示例脚本 -- `engine/include/XCEngine/Scripting/` 与 `engine/src/Scripting/`:原生运行时桥接 +Inspector 侧已经存在 `ScriptComponentEditor`,因此脚本相关改动通常同时影响: -当前脚本构建依赖: +- `engine/src/Scripting/` +- `managed/` +- `project/Assets/Scripts/` +- `editor/src/ComponentEditors/` +- `tests/Scripting/` +- `tests/Editor/test_script_component_editor_utils.cpp` -- .NET SDK -- `参考/Fermion/Fermion/external/mono` 下的 Mono 依赖 +### 3.5 Tests -如果环境不完整,可以通过 `-DXCENGINE_ENABLE_MONO_SCRIPTING=OFF` 暂时关闭。 +当前测试主目录包括: -## 3. 当前测试基线 - -### 3.1 测试树 - -当前主要测试模块: - -- `tests/Core/` -- `tests/Memory/` -- `tests/Threading/` -- `tests/Debug/` - `tests/Components/` +- `tests/Core/` +- `tests/Debug/` +- `tests/Editor/` +- `tests/Input/` +- `tests/Memory/` +- `tests/Rendering/` +- `tests/Resources/` +- `tests/RHI/` - `tests/Scene/` - `tests/Scripting/` -- `tests/Rendering/` -- `tests/RHI/` -- `tests/Resources/` -- `tests/Input/` -- `tests/Editor/` +- `tests/Threading/` -### 3.2 RHI 测试分层 +需要特别记住的聚合 target: -`tests/RHI/` 当前分为五块: +- `rhi_all_tests` +- `rendering_all_tests` +- `rendering_phase_regression` +- `editor_tests` +- `scripting_tests` -- `tests/RHI/unit/` -- `tests/RHI/integration/` -- `tests/RHI/D3D12/` -- `tests/RHI/OpenGL/` -- `tests/RHI/Vulkan/` +## 4. 不可忽视的硬约束 -边界规则: +### 4.1 文档服从真实 checkout -- `tests/RHI/unit/` 和 `tests/RHI/integration/` 只能依赖公共 RHI 抽象 -- 后端私有 API / 原生句柄 / 后端特有断言,只能进对应后端目录 -- 如果抽象层测试必须 include 后端头才能过,优先修 RHI +如果文档与当前目录结构、target 名称、代码事实冲突: -### 3.3 RHI 抽象层集成测试 +- 先信当前 checkout +- 再更新文档 -当前抽象层场景: +不要沿用“计划中但未落地”的旧说法。 -- `minimal` -- `triangle` -- `quad` -- `sphere` -- `backpack` +### 4.2 RHI 抽象层与后端层必须分层 -必须遵守: +`tests/RHI/unit/` 与 `tests/RHI/integration/` 只能依赖公共 RHI 抽象。 -1. 每个场景目录只维护一张 `GT.ppm` -2. `D3D12 / OpenGL / Vulkan` 都与同一张 `GT.ppm` 做比对 -3. 运行输出可以按后端区分命名,但 GT 不能拆成多份 -4. 场景测试代码只能使用公共 RHI 接口 +不要为了让抽象层测试通过而: -### 3.4 Rendering 测试 +- include 后端私有头 +- 直接使用原生句柄 +- 给单一后端写抽象层特判 -当前 `tests/Rendering/` 已经存在: +如果必须这么做,优先修 RHI,而不是污染测试边界。 -- `unit/` -- `integration/backpack_scene` -- `integration/textured_quad_scene` -- `integration/transparent_material_scene` -- `integration/cull_material_scene` -- `integration/depth_sort_scene` -- `integration/material_state_scene` -- `integration/offscreen_scene` +### 4.3 Editor 是宿主,不是第二套渲染器 -结论: - -- 新渲染功能不需要再从零搭测试体系 -- 直接往现有 `tests/Rendering` 扩展即可 - -## 4. 已知关键约束 - -### 4.1 始终遵循 RHI 设计文档 - -涉及 RHI 抽象、后端收敛、接口新增时,始终以: - -- [docs/plan/end/RHI模块设计与实现/RHI模块总览.md](docs/plan/end/RHI模块设计与实现/RHI模块总览.md) - -作为原则基线,而不是局部方便优先。 - -### 4.2 功能正确优先于抽象表面整洁 - -允许为了功能正确做必要重构,但不允许: - -- 测试特判掩盖真实后端缺陷 -- 为了不改底层而污染抽象层测试 -- 为了“少动代码”保留明显错误的对象边界 - -### 4.3 backpack 资源导入行为必须统一 - -这是当前仓库里已经踩过的真实坑。 - -规则: - -- editor / runtime / rendering tests / rhi abstraction tests 的 backpack 导入行为必须保持一致 -- 不要只在某个测试路径里额外加 `MeshImportFlags::FlipUVs` -- 否则很容易出现 editor 显示正确、测试里 UV 错乱的假分叉 - -### 4.4 editor 是宿主,不是第二套渲染器 - -如果 editor viewport 有问题,优先判断: +如果 viewport、outline、picking 或 gizmo 有问题,优先判断: - 是 `Rendering` 模块问题 - 是 `RenderSurface` / RHI 输出问题 - 还是 editor 宿主接线问题 -不要把问题简单归因为“editor 特殊”,然后在 editor 里复制一份独立渲染逻辑。 +不要因为 editor 当前是 D3D12 host,就把问题草率地塞回 editor 私有渲染逻辑。 -## 5. 推荐构建入口 +### 4.4 不要再扩写 ImGui world overlay + +当前 viewport overlay / gizmo 已有明确收口方向。新功能若仍然继续堆在: + +- `SceneViewPanel.cpp` +- `SceneViewportOverlayRenderer.cpp` 的 ImGui world draw 路径 + +通常就是逆着当前架构方向在走。 + +优先入口是: + +- `CameraRenderRequest::overlayPasses` +- `SceneViewportOverlayBuilder` +- `SceneViewportEditorOverlayPass` + +### 4.5 backpack 导入行为必须统一 + +这是仓库里已经踩过的真实坑。 + +`backpack` 相关资源在以下路径中的导入行为必须保持一致: + +- editor +- runtime +- rendering tests +- rhi abstraction tests + +不要只在局部路径里额外加 `MeshImportFlags::FlipUVs` 之类的补丁。 + +### 4.6 `mvs/` 不是长期主线模块 + +`mvs/` 里有样例、研究和工具,但当前正式引擎逻辑的长期落点应优先是: + +- `engine/` +- `editor/` +- `managed/` +- `tests/` + +不要把正式渲染逻辑重新堆回 sample 子树长期存活。 + +## 5. 推荐构建与验证入口 ### 5.1 配置 @@ -213,7 +244,7 @@ cmake -S . -B build -A x64 ``` -如果缺 Mono: +如果当前任务不需要 Mono: ```bash cmake -S . -B build -A x64 -DXCENGINE_ENABLE_MONO_SCRIPTING=OFF @@ -223,69 +254,45 @@ cmake -S . -B build -A x64 -DXCENGINE_ENABLE_MONO_SCRIPTING=OFF ```bash cmake --build build --config Debug --target XCEngine -cmake --build build --config Debug --target XCVolumeRendererUI2 +cmake --build build --config Debug --target XCEditor cmake --build build --config Debug --target xcengine_managed_assemblies +cmake --build build --config Debug --target xcengine_project_managed_assemblies cmake --build build --config Debug --target rhi_all_tests -cmake --build build --config Debug --target rendering_unit_tests +cmake --build build --config Debug --target rendering_all_tests +cmake --build build --config Debug --target rendering_phase_regression cmake --build build --config Debug --target editor_tests cmake --build build --config Debug --target scripting_tests ``` -补充: +### 5.3 按改动类型选择验证 -- 编辑器 target 名称是 `XCVolumeRendererUI2` -- 输出文件名是 `editor/bin//XCEngine.exe` +- 改 `engine/RHI`:先跑 `rhi_abstraction_tests` 或 `rhi_backend_tests`,再决定是否扩展到 `rhi_all_tests` +- 改 `engine/Rendering`:先跑 `rendering_unit_tests` 和最相关的 `rendering_integration_*`,必要时再跑 `rendering_phase_regression` +- 改 `editor/Viewport` 或 Inspector:先跑 `editor_tests` +- 改 `engine/Scripting`、`managed/`、`project/Assets/Scripts/`:先构建 `xcengine_project_managed_assemblies`,再跑 `scripting_tests` +- 改资源导入、`.meta`、artifact 相关逻辑:优先跑 `tests/Resources/` 里的对应 target -## 6. 推荐验证入口 - -### 6.1 全量 +### 5.4 全量测试入口 ```bash ctest --test-dir build -C Debug --output-on-failure ``` -### 6.2 RHI +## 6. 按任务找入口 -```bash -cmake --build build --config Debug --target rhi_abstraction_tests -cmake --build build --config Debug --target rhi_backend_tests -``` +- RHI 抽象与后端:`engine/include/XCEngine/RHI/`、`engine/src/RHI/`、`tests/RHI/` +- Rendering 主链与 pass:`engine/include/XCEngine/Rendering/`、`engine/src/Rendering/`、`tests/Rendering/` +- Editor viewport / gizmo / picking:`editor/src/Viewport/`、`editor/src/panels/SceneViewPanel.cpp`、`tests/Editor/` +- 资源导入与工程布局:`engine/include/XCEngine/Core/Asset/`、`engine/src/Core/Asset/`、`editor/src/Managers/ProjectManager.cpp`、`project/Assets/`、`project/Library/` +- 脚本运行时与程序集:`engine/include/XCEngine/Scripting/`、`engine/src/Scripting/`、`managed/`、`project/Assets/Scripts/`、`tests/Scripting/` +- 默认工程与项目描述:`project/Project.xcproject`、`editor/src/Core/ProjectRootResolver.h`、`editor/src/Utils/ProjectFileUtils.h` -### 6.3 Rendering +## 7. 适合当前仓库的工作方式 -```bash -cmake --build build --config Debug --target rendering_unit_tests -cmake --build build --config Debug --target rendering_integration_backpack_scene -``` +1. 先读当前模块的 `CMakeLists.txt`、最近测试和设计文档,再动代码。 +2. 优先在既有模块边界里解决问题,不要绕开系统回到 sample 式实现。 +3. 先跑与改动最相关的最小验证,再决定是否扩大全量验证。 +4. 目录、target、入口、文档名改了,就同步更新 README / AGENT / 相关说明。 +5. 如果任务会有意重建 `project/Library/`、脚本程序集或 `.meta`,在结果里明确说明哪些文件是有意生成的。 -### 6.4 Editor / Scripting - -```bash -cmake --build build --config Debug --target editor_tests -cmake --build build --config Debug --target scripting_tests -``` - -## 7. 当前最合理的工作方式 - -适用于当前仓库的协作方式: - -1. 先在现有模块边界里定位问题,不要绕开体系补 sample 代码 -2. 改动后立即补或更新测试 -3. 先跑和改动最相关的测试,再决定是否扩大全量验证 -4. 每个阶段完成后尽快提交,保持工作区清晰 - -特别是涉及: - -- `RHI` -- `Rendering` -- `Editor viewport` -- `Scripting runtime` - -这些模块时,必须避免“表面修好了,但测试基线退化”的情况。 - -## 8. 文档入口 - -- 项目概览与目录树:[README.md](README.md) -- RHI 设计基线:[docs/plan/end/RHI模块设计与实现/RHI模块总览.md](docs/plan/end/RHI模块设计与实现/RHI模块总览.md) -- Renderer 设计文档:[docs/plan/Renderer模块设计与实现.md](docs/plan/Renderer模块设计与实现.md) -- 测试规范:[tests/TEST_SPEC.md](tests/TEST_SPEC.md) +这份文档的作用是给 agent 一个“当前真实工程长什么样”的基线。它本身也必须随着工程演进一起维护,不能再落回旧状态说明。 diff --git a/CMakeLists.txt b/CMakeLists.txt index ba9e3ce8..9ec8fc3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ set( "Path to the bundled Mono distribution used by the scripting runtime") add_subdirectory(engine) -add_subdirectory(Editor) +add_subdirectory(editor) add_subdirectory(managed) add_subdirectory(mvs/RenderDoc) add_subdirectory(tests) diff --git a/MVS/ui/README.md b/MVS/ui/README.md index 55e935f7..80b6e109 100644 --- a/MVS/ui/README.md +++ b/MVS/ui/README.md @@ -1,183 +1,87 @@ -# UI Editor +# Legacy UI Prototype -Unity 风格的编辑器 UI,使用 ImGui 实现,作为 XCEngine 游戏引擎编辑器的一部分。 +`mvs/ui/` 是仓库里保留的早期 ImGui + D3D12 编辑器原型。它主要用于保留原始 UI 骨架、交互想法和历史实现参考,不是当前 XCEngine 的正式 editor 主线。 -## 简介 +当前正式 editor 在: -XCGameEngine UI 是一个仿 Unity 编辑器的桌面应用程序,提供场景管理、层级视图、属性检查器等功能。 +- [editor/README.md](D:\Xuanchi\Main\XCEngine\editor\README.md) -## 技术栈 +当前正式构建入口在仓库根目录: -- **渲染 API**: DirectX 12 -- **UI 框架**: ImGui -- **语言**: C++17 -- **构建系统**: CMake -- **依赖库**: DirectX 12 SDK +- [README.md](D:\Xuanchi\Main\XCEngine\README.md) +- [AGENT.md](D:\Xuanchi\Main\XCEngine\AGENT.md) -## 项目结构 +## 当前状态 -``` -ui/ +这个模块仍然可以单独构建,但它有几个需要明确的事实: + +- 顶层 `CMakeLists.txt` 当前并不会纳入 `mvs/ui/` +- 它使用独立的 `mvs/ui/CMakeLists.txt` +- target 名称仍然是历史遗留的 `XCVolumeRendererUI2` +- 它不是当前 `editor/` 目录下那套 `ViewportHostService + Rendering + Project.xcproject + ScriptAssemblies` 架构 +- 它不代表当前仓库的真实 editor 能力边界 + +因此: + +- 想用当前引擎编辑器,请进入 `editor/` +- 想研究早期 UI 原型、旧面板布局和最初的 ImGui 宿主结构,可以看这里 + +## 这个目录里有什么 + +```text +mvs/ui/ +├── CMakeLists.txt +├── README.md ├── src/ -│ ├── main.cpp # 程序入口 -│ ├── Application.cpp/h # 应用主类 -│ ├── Theme.cpp/h # 主题系统 │ ├── Core/ -│ │ ├── GameObject.h # 游戏对象 -│ │ └── LogEntry.h # 日志条目 │ ├── Managers/ -│ │ ├── LogSystem.cpp/h # 日志系统 -│ │ ├── ProjectManager.cpp/h # 项目管理 -│ │ ├── SceneManager.cpp/h # 场景管理 -│ │ └── SelectionManager.cpp/h # 选择管理 -│ └── panels/ -│ ├── Panel.cpp/h # 面板基类 -│ ├── MenuBar.cpp/h # 菜单栏 -│ ├── HierarchyPanel.cpp/h # 层级面板 -│ ├── InspectorPanel.cpp/h # 检查器面板 -│ ├── SceneViewPanel.cpp/h # 场景视图 -│ ├── GameViewPanel.cpp/h # 游戏视图 -│ ├── ProjectPanel.cpp/h # 项目面板 -│ └── ConsolePanel.cpp/h # 控制台面板 -├── bin/Release/ # 输出目录 -│ ├── XCVolumeRendererUI2.exe # 可执行文件 -│ ├── imgui.ini # ImGui 配置 -│ └── Assets/ -│ └── Models/ -│ └── Character.fbx # 示例模型 -├── build/ # 构建目录 -└── CMakeLists.txt # CMake 配置 +│ ├── panels/ +│ ├── Application.cpp +│ ├── Application.h +│ ├── Theme.cpp +│ ├── Theme.h +│ └── main.cpp +├── build/ # 历史本地构建输出 +└── bin/ # 历史可执行文件输出 ``` -## 构建方法 +主要内容是: -### 前置要求 +- 早期 `Application` / `Theme` 实现 +- 基础 `Hierarchy / Scene / Game / Inspector / Project / Console` 面板骨架 +- 旧版 `SceneManager / ProjectManager / LogSystem` -- Windows 10/11 -- Visual Studio 2019 或更高版本 -- CMake 3.15+ +## 单独构建方式 -### 构建步骤 +如果你只是想启动这个原型,可以单独进入该目录配置: ```bash -cd ui -mkdir build && cd build -cmake .. -cmake --build . --config Release +cmake -S mvs/ui -B mvs/ui/build -A x64 +cmake --build mvs/ui/build --config Release ``` -### 运行 +输出可执行文件通常位于: ```bash -# 运行编译好的可执行文件 -.\bin\Release\XCGameEngineUI.exe +.\mvs\ui\bin\Release\XCVolumeRendererUI2.exe ``` -## 功能特性 +## 与当前正式 editor 的区别 -### 编辑器面板 +当前正式 editor 具备而这个原型没有正式接入的能力包括: -#### 菜单栏(MenuBar) -- 文件菜单(新建、打开、保存等) -- 编辑菜单(撤销、重做等) -- 视图菜单(面板显示/隐藏) -- 帮助菜单 +- `engine/Rendering` 主链驱动的 scene/game viewport +- `ViewportHostService` +- object-id picking 与 outline +- `Project.xcproject` +- `Assets + .meta + Library` +- `project/Library/ScriptAssemblies` +- `ScriptComponent` Inspector 与脚本类发现 -#### 层级面板(Hierarchy Panel) -- 显示场景中所有游戏对象 -- 树形结构展示父子关系 -- 支持对象选择 -- 对象重命名 +所以这个目录更适合被理解为: -#### 检查器面板(Inspector Panel) -- 显示选中对象的属性 -- 支持组件编辑 -- 变换组件(位置、旋转、缩放) -- 材质组件 +- 历史设计参考 +- 原型实现存档 +- 某些 UI 想法的对照样本 -#### 场景视图(Scene View) -- 3D 场景预览 -- 相机控制(平移、旋转、缩放) -- 对象选择 -- 辅助工具(网格、轴心) - -#### 游戏视图(Game View) -- 游戏运行时的画面预览 -- 分辨率设置 -- 宽高比选择 - -#### 项目面板(Project Panel) -- 项目文件浏览器 -- 资源组织 -- 搜索过滤 - -#### 控制台面板(Console Panel) -- 日志输出 -- 警告和错误显示 -- 日志级别过滤 -- 清空日志 - -### 管理系统 - -#### 日志系统(LogSystem) -- 分级日志(Info、Warning、Error) -- 时间戳 -- 日志持久化 - -#### 项目管理(ProjectManager) -- 项目创建/打开 -- 资源路径管理 - -#### 场景管理(SceneManager) -- 场景加载/保存 -- 对象生命周期管理 - -#### 选择管理(SelectionManager) -- 当前选中对象追踪 -- 多选支持 - -### 主题系统 - -- 深色主题(Dark Theme) -- 可自定义配色方案 - -## 窗口布局 - -默认布局采用经典的 Unity 编辑器风格: - -``` -+----------------------------------------------------------+ -| 菜单栏 | -+----------+------------------------+----------------------+ -| | | | -| 项目 | 场景视图 | 检查器 | -| 面板 | | | -| | | | -+----------+------------------------+----------------------+ -| 层级面板 | 游戏视图 | -| | | -+------------------------------------+----------------------+ -| 控制台面板 | -+----------------------------------------------------------+ -``` - -## 依赖说明 - -- ImGui - 跨平台 GUI 库 -- DirectX 12 - 渲染 API -- Windows SDK - 窗口管理 - -## 扩展开发 - -### 添加新面板 - -1. 在 `panels/` 目录下创建新的面板类 -2. 继承 `Panel` 基类 -3. 实现 `Render()` 方法 -4. 在 `Application` 中注册新面板 - -### 添加新组件 - -1. 定义组件类 -2. 在 `GameObject` 中注册组件类型 -3. 在 `InspectorPanel` 中添加属性编辑器 +而不是当前 XCEngine editor 的入口。 diff --git a/README.md b/README.md index 2b1f71a1..aeed9f89 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,39 @@ # XCEngine -XCEngine 是一个正在持续开发中的模块化 C++ 游戏引擎。当前仓库已经形成了较完整的底座: +XCEngine 是一个 Windows 优先、编辑器优先的模块化 C++ 游戏引擎工作区。当前主线已经形成 `RHI -> Rendering -> Editor Viewport -> AssetDatabase/Library -> Mono Scripting` 的可运行闭环,不再只是示例代码集合。 -- `RHI` 抽象层已稳定覆盖 `D3D12 / OpenGL / Vulkan` -- `Rendering` 模块已经落地最小可用的场景渲染链路 -- `editor/` 已接入基于引擎渲染链路的 Scene/Game viewport -- `managed/` 已具备基于 Mono 的 C# 运行时与托管程序集构建链路 -- `tests/` 已形成按模块分层的单元测试与集成测试体系 +这份 README 面向引擎用户:关注怎么进入项目、怎么构建、当前仓库各目录分别负责什么。面向构建本引擎的 coding agent,请看 [AGENT.md](AGENT.md)。 -如果你是第一次进入当前仓库,先看 [AGENT.md](AGENT.md)。它更偏向“当前工程状态、协作约束与推荐入口”。 +## 项目定位 -## 当前状态 - -- 核心引擎库位于 `engine/`,包含 Audio、Components、Core、Debug、Input、Memory、Platform、Rendering、Resources、RHI、Scene、Scripting、Threading。 -- RHI 当前正式支持 `D3D12 / OpenGL / Vulkan` 三后端,且抽象层与后端层测试都已经落地。 -- Rendering 当前已具备 `RenderSceneExtractor`、`RenderResourceCache`、`SceneRenderer`、`CameraRenderer`、`BuiltinForwardPipeline`。 -- Editor 当前是 `D3D12` 宿主应用,但场景绘制已通过引擎 `Rendering + RHI` 链路输出到离屏纹理,再接入 ImGui 面板。 -- Managed scripting 当前通过 `managed/XCEngine.ScriptCore` 与 `managed/GameScripts` 构建托管程序集;默认启用 Mono 运行时集成。 -- 默认示例工程位于 `project/`,已包含基础场景、背包模型与脚本资产目录。 +- `engine/` 提供静态库 `XCEngine`,包含 `RHI`、`Rendering`、`Resources`、`Scene`、`Scripting` 等核心模块。 +- `editor/` 提供桌面编辑器 `XCEditor`,输出文件名为 `XCEngine.exe`,默认打开仓库内的 `project/`。 +- `project/` 是当前随仓库维护的示例工程,已经采用 `Assets/ + .meta + Library/` 的工程布局。 +- `managed/` 负责 `XCEngine.ScriptCore.dll`、示例 `GameScripts.dll` 以及项目脚本程序集构建。 +- `tests/` 已覆盖 Engine、RHI、Rendering、Editor、Scripting 等主要模块。 ## 环境要求 -建议在 Windows 上构建当前仓库。 +当前推荐在 Windows 上使用和构建。 - Windows 10/11 - Visual Studio 2022 / MSVC v143 - CMake 3.15+ -- .NET SDK - Vulkan SDK +- .NET SDK - Git LFS -如果启用默认脚本构建,还需要: +启用 Mono 脚本运行时时,还需要: - `参考/Fermion/Fermion/external/mono` 下可用的 Mono 头文件、静态库与 `mscorlib.dll` -如果本地暂时没有 Mono 依赖,可以在配置时关闭脚本构建: +补充说明: -```bash -cmake -S . -B build -A x64 -DXCENGINE_ENABLE_MONO_SCRIPTING=OFF -``` +- `engine/CMakeLists.txt` 当前对 `Vulkan` 是硬依赖,未配置 Vulkan SDK 时无法完成配置。 +- `editor/` 和 `tests/` 首次配置会通过 `FetchContent` 从 Gitee 镜像拉取 `ImGui` 与 `googletest`;离线环境请确保已有可复用的 `_deps` 缓存。 +- 如果需要 `mvs/3DGS-Unity/room.ply` 这类大文件示例,请先执行 Git LFS 拉取。 -如果你需要 `mvs/3DGS-Unity/room.ply` 这类大文件样例,请确保已经执行过 Git LFS 拉取。 - -## 构建 +## 快速开始 ### 1. 配置 @@ -50,60 +41,92 @@ cmake -S . -B build -A x64 -DXCENGINE_ENABLE_MONO_SCRIPTING=OFF cmake -S . -B build -A x64 ``` -### 2. 全量编译 +如果本地暂时没有 Mono 依赖,可以先关闭脚本运行时: ```bash -cmake --build build --config Debug +cmake -S . -B build -A x64 -DXCENGINE_ENABLE_MONO_SCRIPTING=OFF ``` -### 3. 常用增量 target +### 2. 构建常用目标 ```bash cmake --build build --config Debug --target XCEngine -cmake --build build --config Debug --target XCVolumeRendererUI2 +cmake --build build --config Debug --target XCEditor cmake --build build --config Debug --target xcengine_managed_assemblies -cmake --build build --config Debug --target rhi_all_tests -cmake --build build --config Debug --target rendering_unit_tests -cmake --build build --config Debug --target editor_tests -cmake --build build --config Debug --target scripting_tests +cmake --build build --config Debug --target xcengine_project_managed_assemblies ``` 说明: -- 编辑器 CMake target 名称仍然是历史遗留的 `XCVolumeRendererUI2`,但输出文件名是 `XCEngine.exe` -- 顶层 CMake 当前会纳入 `engine/`、`editor/`、`managed/`、`mvs/RenderDoc/` 与 `tests/` +- `XCEngine` 是引擎静态库。 +- `XCEditor` 是编辑器 target,输出文件名仍为 `editor/bin//XCEngine.exe`。 +- `xcengine_managed_assemblies` 生成 `managed/` 示例托管程序集。 +- `xcengine_project_managed_assemblies` 会扫描 `project/Assets/**/*.cs`,并把结果输出到 `project/Library/ScriptAssemblies/`。 -## 测试 +### 3. 启动编辑器 -推荐始终通过 CMake / CTest 驱动测试。 +```bash +.\editor\bin\Debug\XCEngine.exe +``` -### 列出测试 +默认情况下,编辑器会自动把仓库内的 `project/` 识别为工程根目录。也可以显式指定其他工程: + +```bash +.\editor\bin\Debug\XCEngine.exe --project D:\Path\To\MyProject +``` + +如果 Inspector 里看不到 C# 脚本类,先确认 `project/Library/ScriptAssemblies/` 中已经生成: + +- `XCEngine.ScriptCore.dll` +- `GameScripts.dll` +- `mscorlib.dll` + +### 4. 当前推荐验证入口 ```bash ctest --test-dir build -N -C Debug -``` - -### 运行全部测试 - -```bash ctest --test-dir build -C Debug --output-on-failure ``` -### 常用测试 target +按模块常用的构建 / 验证 target: ```bash -cmake --build build --config Debug --target rhi_abstraction_tests -cmake --build build --config Debug --target rhi_backend_tests -cmake --build build --config Debug --target rendering_unit_tests +cmake --build build --config Debug --target rhi_all_tests +cmake --build build --config Debug --target rendering_all_tests +cmake --build build --config Debug --target rendering_phase_regression cmake --build build --config Debug --target editor_tests cmake --build build --config Debug --target scripting_tests ``` -更完整的测试规则见 [tests/TEST_SPEC.md](tests/TEST_SPEC.md)。 +## 当前仓库状态 -## 目录结构 +### Engine -下面的目录树用于表达当前仓库的实际入口结构与模块边界。 +- `RHI` 正式维护 `D3D12 / OpenGL / Vulkan` 三后端。 +- `Rendering` 已形成 `SceneRenderer -> CameraRenderer -> RenderPipeline` 主链,包含 `ObjectId`、`InfiniteGrid`、`Outline`、`overlayPasses` 等能力。 +- `Resources` 与 `Core/Asset` 已不只是简单加载器,当前已经具备 `Assets/.meta/Library` 风格的 `AssetDatabase` 与 artifact 缓存。 + +### Editor + +- 当前 editor 是 `D3D12` 宿主应用,但 Scene/Game viewport 已通过引擎 `Rendering + RHI` 链路渲染到离屏纹理,再接入 ImGui。 +- `Viewport` 相关代码已经进入 overlay/gizmo 正规化阶段,`SceneViewportOverlayBuilder`、`SceneViewportEditorOverlayPass`、`ObjectId` picking 都已落地。 +- Inspector 已支持 `ScriptComponent` 的脚本类选择、字段元数据读取、字段重置与基础编辑。 + +### Project & Scripting + +- 示例工程位于 `project/`,当前工程文件是 `Project.xcproject`,启动场景为 `Assets/Scenes/Main.xc`。 +- `project/Assets/` 现已包含 `.meta` 文件,`project/Library/` 则维护 `SourceAssetDB`、`ArtifactDB`、`Artifacts` 与 `ScriptAssemblies`。 +- `managed/` 会生成引擎脚本 API 与示例脚本程序集,项目资产下的 `.cs` 文件也会被单独编译为项目脚本程序集。 + +### Tests + +- `tests/` 已覆盖 `Core`、`Memory`、`Threading`、`Scene`、`Resources`、`RHI`、`Rendering`、`Editor`、`Scripting` 等模块。 +- `tests/Rendering/` 当前已包含 `backpack_scene`、`backpack_lit_scene`、`camera_stack_scene`、`offscreen_scene` 等集成场景。 +- `tests/RHI/` 同时维护抽象层测试与后端专用测试,`D3D12 / OpenGL / Vulkan` 都有独立子树。 + +## 完整目录结构 + +以下目录树以当前工程入口为准,保留了当前 workflow 已经实际使用的生成目录;省略 `.git/`、`build/_deps/` 与临时文件。 ```text XCEngine/ @@ -112,15 +135,33 @@ XCEngine/ ├── AGENT.md ├── CMakeLists.txt ├── README.md -├── build/ # 本地构建输出 +├── build/ # 本地 CMake 构建输出 ├── docs/ -│ ├── api/ # API 文档 -│ ├── issues/ # 跟踪中的设计 / 实现问题 -│ ├── plan/ # 设计文档、阶段规划、归档方案 -│ │ ├── Renderer模块设计与实现.md -│ │ └── end/ -│ │ └── RHI模块设计与实现/ -│ │ └── RHI模块总览.md +│ ├── api/ +│ │ ├── XCEngine/ +│ │ ├── _guides/ +│ │ ├── _meta/ +│ │ ├── _tools/ +│ │ └── main.md +│ ├── issues/ +│ ├── plan/ +│ │ ├── end/ +│ │ │ ├── RHI模块设计与实现/ +│ │ │ │ ├── RHIFence.md +│ │ │ │ └── RHI模块总览.md +│ │ │ └── 编辑器与运行时分层架构设计.md +│ │ ├── 开题报告和任务书/ +│ │ ├── 旧版题目/ +│ │ ├── API文档并行更新任务池_2026-04-02.md +│ │ ├── C#脚本模块的设计与实现.md +│ │ ├── Editor架构说明.md +│ │ ├── SceneViewport_Overlay_Gizmo_Rework_Plan.md +│ │ ├── Shader与Material系统下一阶段计划.md +│ │ ├── Unity SRP API参考文档.md +│ │ ├── Unity式Library资产导入与缓存系统重构方案.md +│ │ ├── Unity式Tick系统与PlayMode运行时方案.md +│ │ ├── Unity式Tick系统与PlayMode运行时方案-阶段进展.md +│ │ └── Unity绝区零开发文档还原版.md │ ├── used/ │ ├── api-skill.md │ ├── blueprint-skill.md @@ -143,13 +184,28 @@ XCEngine/ │ │ ├── UI/ │ │ ├── Utils/ │ │ ├── Viewport/ +│ │ │ ├── Passes/ +│ │ │ ├── SceneViewportOverlayBuilder.cpp +│ │ │ ├── SceneViewportOverlayBuilder.h +│ │ │ ├── SceneViewportOverlayRenderer.cpp +│ │ │ ├── SceneViewportOverlayRenderer.h +│ │ │ ├── SceneViewportPicker.cpp +│ │ │ ├── SceneViewportPicker.h +│ │ │ ├── SceneViewportMoveGizmo.cpp +│ │ │ ├── SceneViewportMoveGizmo.h +│ │ │ ├── SceneViewportRotateGizmo.cpp +│ │ │ ├── SceneViewportRotateGizmo.h +│ │ │ ├── SceneViewportScaleGizmo.cpp +│ │ │ ├── SceneViewportScaleGizmo.h +│ │ │ ├── ViewportHostRenderFlowUtils.h +│ │ │ └── ViewportHostService.h │ │ ├── Application.cpp │ │ ├── Application.h │ │ ├── EditorApp.rc │ │ ├── Theme.cpp │ │ ├── Theme.h │ │ └── main.cpp -│ └── bin/ # 编辑器输出目录,输出名为 XCEngine.exe +│ └── bin/ # 编辑器输出目录,输出名为 XCEngine.exe ├── engine/ │ ├── CMakeLists.txt │ ├── include/ @@ -167,17 +223,24 @@ XCEngine/ │ │ ├── Platform/ │ │ │ └── Windows/ │ │ ├── Rendering/ +│ │ │ ├── Passes/ │ │ │ ├── Pipelines/ -│ │ │ ├── CameraRenderRequest.h │ │ │ ├── CameraRenderer.h +│ │ │ ├── CameraRenderRequest.h +│ │ │ ├── ObjectIdEncoding.h +│ │ │ ├── ObjectIdPass.h │ │ │ ├── RenderCameraData.h │ │ │ ├── RenderContext.h │ │ │ ├── RenderMaterialUtility.h +│ │ │ ├── RenderPass.h │ │ │ ├── RenderPipeline.h │ │ │ ├── RenderPipelineAsset.h │ │ │ ├── RenderResourceCache.h │ │ │ ├── RenderSceneExtractor.h +│ │ │ ├── RenderSceneUtility.h │ │ │ ├── RenderSurface.h +│ │ │ ├── SceneRenderRequestPlanner.h +│ │ │ ├── SceneRenderRequestUtils.h │ │ │ ├── SceneRenderer.h │ │ │ └── VisibleRenderObject.h │ │ ├── Resources/ @@ -189,29 +252,7 @@ XCEngine/ │ │ ├── RHI/ │ │ │ ├── D3D12/ │ │ │ ├── OpenGL/ -│ │ │ ├── Vulkan/ -│ │ │ ├── RHIBuffer.h -│ │ │ ├── RHICapabilities.h -│ │ │ ├── RHICommandList.h -│ │ │ ├── RHICommandQueue.h -│ │ │ ├── RHIDescriptorPool.h -│ │ │ ├── RHIDescriptorSet.h -│ │ │ ├── RHIDevice.h -│ │ │ ├── RHIEnums.h -│ │ │ ├── RHIFactory.h -│ │ │ ├── RHIFence.h -│ │ │ ├── RHIFramebuffer.h -│ │ │ ├── RHIPipelineLayout.h -│ │ │ ├── RHIPipelineState.h -│ │ │ ├── RHIRenderPass.h -│ │ │ ├── RHIResource.h -│ │ │ ├── RHIResourceView.h -│ │ │ ├── RHISampler.h -│ │ │ ├── RHIScreenshot.h -│ │ │ ├── RHIShader.h -│ │ │ ├── RHISwapChain.h -│ │ │ ├── RHITexture.h -│ │ │ └── RHITypes.h +│ │ │ └── Vulkan/ │ │ ├── Scene/ │ │ ├── Scripting/ │ │ │ └── Mono/ @@ -230,6 +271,7 @@ XCEngine/ │ │ ├── Platform/ │ │ │ └── Windows/ │ │ ├── Rendering/ +│ │ │ ├── Passes/ │ │ │ └── Pipelines/ │ │ ├── Resources/ │ │ │ ├── AudioClip/ @@ -255,28 +297,45 @@ XCEngine/ │ └── renderdoc_parser/ ├── managed/ │ ├── CMakeLists.txt -│ ├── GameScripts/ # 示例 / 验证脚本程序集源码 -│ └── XCEngine.ScriptCore/ # 引擎托管 API +│ ├── GameScripts/ +│ └── XCEngine.ScriptCore/ ├── mvs/ -│ ├── 3DGS-Unity/ # Unity 侧 3DGS 参考与资源 +│ ├── 3DGS-Unity/ │ ├── D3D12/ │ ├── Music fluctuations/ │ ├── OpenGL/ │ ├── RenderDoc/ │ ├── Res/ -│ ├── ui/ +│ ├── ui/ # 早期 ImGui + D3D12 UI 原型,非当前正式 editor │ └── VolumeRenderer/ ├── project/ │ ├── .xceditor/ -│ │ └── imgui_layout.ini +│ │ ├── imgui_layout.ini +│ │ └── thumbs/ │ ├── Assets/ │ │ ├── Materials/ │ │ ├── Models/ │ │ │ └── backpack/ +│ │ ├── New Folder/ +│ │ ├── New Folder 1/ │ │ ├── Scenes/ +│ │ │ ├── Backpack.xc │ │ │ └── Main.xc │ │ └── Scripts/ +│ │ ├── ProjectScriptProbe.cs +│ │ └── Textures/ +│ ├── Library/ +│ │ ├── ArtifactDB/ +│ │ ├── Artifacts/ +│ │ ├── ScriptAssemblies/ +│ │ │ ├── GameScripts.dll +│ │ │ ├── mscorlib.dll +│ │ │ └── XCEngine.ScriptCore.dll +│ │ └── SourceAssetDB/ +│ ├── Assets.meta │ └── Project.xcproject +├── scripts/ +│ └── Run-RendererPhaseRegression.ps1 ├── tests/ │ ├── CMakeLists.txt │ ├── TEST_SPEC.md @@ -293,7 +352,9 @@ XCEngine/ │ ├── Memory/ │ ├── Rendering/ │ │ ├── integration/ +│ │ │ ├── backpack_lit_scene/ │ │ │ ├── backpack_scene/ +│ │ │ ├── camera_stack_scene/ │ │ │ ├── cull_material_scene/ │ │ │ ├── depth_sort_scene/ │ │ │ ├── material_state_scene/ @@ -308,66 +369,44 @@ XCEngine/ │ │ ├── Shader/ │ │ └── Texture/ │ ├── RHI/ -│ │ ├── CMakeLists.txt │ │ ├── D3D12/ │ │ │ ├── integration/ │ │ │ └── unit/ -│ │ ├── OpenGL/ -│ │ │ ├── integration/ -│ │ │ └── unit/ -│ │ ├── Vulkan/ -│ │ │ ├── integration/ -│ │ │ ├── unit/ -│ │ │ └── TEST_SPEC.md │ │ ├── integration/ │ │ │ ├── backpack/ │ │ │ ├── fixtures/ │ │ │ ├── minimal/ │ │ │ ├── quad/ │ │ │ ├── sphere/ -│ │ │ ├── triangle/ -│ │ │ ├── compare_ppm.py -│ │ │ ├── README.md -│ │ │ └── run_integration_test.py -│ │ └── unit/ +│ │ │ └── triangle/ +│ │ ├── OpenGL/ +│ │ │ ├── integration/ +│ │ │ └── unit/ +│ │ ├── unit/ +│ │ └── Vulkan/ +│ │ ├── integration/ +│ │ └── unit/ │ ├── Scene/ │ ├── Scripting/ │ └── Threading/ ├── 参考/ -│ └── TransformGizmo/ +│ ├── Fermion/ +│ ├── TransformGizmo/ +│ ├── unity editor/ +│ ├── unity-editor-icons/ +│ ├── unity-icons/ +│ └── UnityRuntimeSceneGizmo-master/ └── .vscode/ ``` -## 模块概览 - -### Engine - -- `RHI`:统一图形 API 抽象,当前三后端并行维护 -- `Rendering`:位于 Scene/Resources 与 RHI 之间,负责把场景提取成真实 draw path -- `Resources`:Mesh / Texture / Material / Shader / AudioClip 导入与加载 -- `Scene + Components`:游戏对象、相机、灯光、网格与脚本组件 -- `Scripting`:原生脚本运行时与 Mono 托管桥接 - -### Editor - -- 当前是 D3D12 桌面宿主应用 -- Scene/Game viewport 已走引擎离屏渲染链路 -- 包含 Actions、Commands、Panels、Viewport、Managers 等编辑器子系统 - -### Tests - -- `tests/RHI/`:RHI 抽象层与三后端测试 -- `tests/Rendering/`:渲染链路单元与场景级集成测试 -- `tests/Scripting/`:脚本运行时与托管程序集集成测试 -- `tests/Editor/`:编辑器动作路由与 Scene viewport 相机控制测试 - ## 关键文档入口 -- 当前工程协作入口:[AGENT.md](AGENT.md) -- RHI 核心设计文档:[docs/plan/end/RHI模块设计与实现/RHI模块总览.md](docs/plan/end/RHI模块设计与实现/RHI模块总览.md) -- Renderer 规划与实现说明:[docs/plan/Renderer模块设计与实现.md](docs/plan/Renderer模块设计与实现.md) +- 协作基线与 coding agent 入口:[AGENT.md](AGENT.md) +- RHI 基线设计:[docs/plan/end/RHI模块设计与实现/RHI模块总览.md](docs/plan/end/RHI模块设计与实现/RHI模块总览.md) +- 当前 Shader / Material 主线:[docs/plan/Shader与Material系统下一阶段计划.md](docs/plan/Shader与Material系统下一阶段计划.md) +- Scene viewport overlay 重构:[docs/plan/SceneViewport_Overlay_Gizmo_Rework_Plan.md](docs/plan/SceneViewport_Overlay_Gizmo_Rework_Plan.md) - 测试规范:[tests/TEST_SPEC.md](tests/TEST_SPEC.md) ## 许可证 -当前仓库根目录未看到单独的顶层许可证文件;涉及第三方库时请分别遵循对应依赖目录中的许可证说明。 +当前仓库根目录未看到独立的顶层许可证文件。涉及第三方库时,请分别遵循其所在目录中的许可证或随附说明。 diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index 078ac87d..846b077e 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -49,6 +49,9 @@ if(NOT TARGET XCEngine) add_subdirectory("${XCENGINE_ENGINE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/engine_dependency") endif() +file(TO_CMAKE_PATH "${XCENGINE_ROOT_DIR}" XCENGINE_ROOT_DIR_CMAKE) +file(TO_CMAKE_PATH "${XCENGINE_MONO_ROOT_DIR}" XCENGINE_MONO_ROOT_DIR_CMAKE) + set(IMGUI_SOURCES ${imgui_SOURCE_DIR}/imgui.cpp ${imgui_SOURCE_DIR}/imgui_demo.cpp @@ -63,6 +66,7 @@ add_executable(${PROJECT_NAME} WIN32 src/EditorApp.rc src/main.cpp src/Application.cpp + src/Scripting/EditorScriptAssemblyBuilder.cpp src/Theme.cpp src/Core/UndoManager.cpp src/Core/PlaySessionController.cpp @@ -101,6 +105,13 @@ target_include_directories(${PROJECT_NAME} PRIVATE target_compile_definitions(${PROJECT_NAME} PRIVATE UNICODE _UNICODE) target_compile_options(${PROJECT_NAME} PRIVATE /utf-8) +if(XCENGINE_ENABLE_MONO_SCRIPTING) + target_compile_definitions(${PROJECT_NAME} PRIVATE + XCENGINE_ENABLE_MONO_SCRIPTING + XCENGINE_EDITOR_REPO_ROOT="${XCENGINE_ROOT_DIR_CMAKE}" + XCENGINE_EDITOR_MONO_ROOT_DIR="${XCENGINE_MONO_ROOT_DIR_CMAKE}") +endif() + if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /FS) set_property(TARGET ${PROJECT_NAME} PROPERTY diff --git a/editor/README.md b/editor/README.md index 55e935f7..3977c85d 100644 --- a/editor/README.md +++ b/editor/README.md @@ -1,183 +1,205 @@ -# UI Editor +# XCEditor -Unity 风格的编辑器 UI,使用 ImGui 实现,作为 XCEngine 游戏引擎编辑器的一部分。 +`editor/` 是 XCEngine 当前随仓库维护的桌面编辑器模块。它不是一套独立渲染器,而是 `D3D12` 宿主应用,用来承接引擎 `Rendering + RHI + Scene + Scripting` 主链。 -## 简介 +当前 editor 已经具备: -XCGameEngine UI 是一个仿 Unity 编辑器的桌面应用程序,提供场景管理、层级视图、属性检查器等功能。 +- Scene / Game viewport 离屏渲染接入 +- object-id picking 与选中描边 +- scene overlay / gizmo 正规化收口 +- 项目根目录解析与 `Project.xcproject` 加载 +- `Assets + .meta + Library` 风格项目目录接入 +- `ScriptComponent` 的脚本类与字段编辑入口 -## 技术栈 +## 当前定位 -- **渲染 API**: DirectX 12 -- **UI 框架**: ImGui -- **语言**: C++17 -- **构建系统**: CMake -- **依赖库**: DirectX 12 SDK +如果你想理解当前 editor,先把它当成三层: -## 项目结构 +1. `Win32 + D3D12` 宿主窗口与 ImGui backend +2. `ViewportHostService` 对引擎渲染链路的接线 +3. `panels/`、`Managers/`、`ComponentEditors/` 这些编辑器业务层 -``` -ui/ -├── src/ -│ ├── main.cpp # 程序入口 -│ ├── Application.cpp/h # 应用主类 -│ ├── Theme.cpp/h # 主题系统 -│ ├── Core/ -│ │ ├── GameObject.h # 游戏对象 -│ │ └── LogEntry.h # 日志条目 -│ ├── Managers/ -│ │ ├── LogSystem.cpp/h # 日志系统 -│ │ ├── ProjectManager.cpp/h # 项目管理 -│ │ ├── SceneManager.cpp/h # 场景管理 -│ │ └── SelectionManager.cpp/h # 选择管理 -│ └── panels/ -│ ├── Panel.cpp/h # 面板基类 -│ ├── MenuBar.cpp/h # 菜单栏 -│ ├── HierarchyPanel.cpp/h # 层级面板 -│ ├── InspectorPanel.cpp/h # 检查器面板 -│ ├── SceneViewPanel.cpp/h # 场景视图 -│ ├── GameViewPanel.cpp/h # 游戏视图 -│ ├── ProjectPanel.cpp/h # 项目面板 -│ └── ConsolePanel.cpp/h # 控制台面板 -├── bin/Release/ # 输出目录 -│ ├── XCVolumeRendererUI2.exe # 可执行文件 -│ ├── imgui.ini # ImGui 配置 -│ └── Assets/ -│ └── Models/ -│ └── Character.fbx # 示例模型 -├── build/ # 构建目录 -└── CMakeLists.txt # CMake 配置 -``` +当前不应再把 editor 视为旧式“UI sample”。它已经是引擎工作区的正式入口之一。 -## 构建方法 +## 构建 + +推荐直接在仓库根目录构建,而不是单独进入 `editor/` 目录。 ### 前置要求 - Windows 10/11 -- Visual Studio 2019 或更高版本 +- Visual Studio 2022 / MSVC v143 - CMake 3.15+ +- Vulkan SDK -### 构建步骤 +如果需要启用 Mono 脚本运行时,还需要: + +- .NET SDK +- `参考/Fermion/Fermion/external/mono` 下的 Mono 依赖 + +### 配置 ```bash -cd ui -mkdir build && cd build -cmake .. -cmake --build . --config Release +cmake -S .. -B ..\build -A x64 ``` -### 运行 +更常见的做法是直接在仓库根目录运行: ```bash -# 运行编译好的可执行文件 -.\bin\Release\XCGameEngineUI.exe +cmake -S . -B build -A x64 ``` -## 功能特性 +如果本地暂时没有 Mono,可以先关闭: -### 编辑器面板 - -#### 菜单栏(MenuBar) -- 文件菜单(新建、打开、保存等) -- 编辑菜单(撤销、重做等) -- 视图菜单(面板显示/隐藏) -- 帮助菜单 - -#### 层级面板(Hierarchy Panel) -- 显示场景中所有游戏对象 -- 树形结构展示父子关系 -- 支持对象选择 -- 对象重命名 - -#### 检查器面板(Inspector Panel) -- 显示选中对象的属性 -- 支持组件编辑 -- 变换组件(位置、旋转、缩放) -- 材质组件 - -#### 场景视图(Scene View) -- 3D 场景预览 -- 相机控制(平移、旋转、缩放) -- 对象选择 -- 辅助工具(网格、轴心) - -#### 游戏视图(Game View) -- 游戏运行时的画面预览 -- 分辨率设置 -- 宽高比选择 - -#### 项目面板(Project Panel) -- 项目文件浏览器 -- 资源组织 -- 搜索过滤 - -#### 控制台面板(Console Panel) -- 日志输出 -- 警告和错误显示 -- 日志级别过滤 -- 清空日志 - -### 管理系统 - -#### 日志系统(LogSystem) -- 分级日志(Info、Warning、Error) -- 时间戳 -- 日志持久化 - -#### 项目管理(ProjectManager) -- 项目创建/打开 -- 资源路径管理 - -#### 场景管理(SceneManager) -- 场景加载/保存 -- 对象生命周期管理 - -#### 选择管理(SelectionManager) -- 当前选中对象追踪 -- 多选支持 - -### 主题系统 - -- 深色主题(Dark Theme) -- 可自定义配色方案 - -## 窗口布局 - -默认布局采用经典的 Unity 编辑器风格: - -``` -+----------------------------------------------------------+ -| 菜单栏 | -+----------+------------------------+----------------------+ -| | | | -| 项目 | 场景视图 | 检查器 | -| 面板 | | | -| | | | -+----------+------------------------+----------------------+ -| 层级面板 | 游戏视图 | -| | | -+------------------------------------+----------------------+ -| 控制台面板 | -+----------------------------------------------------------+ +```bash +cmake -S . -B build -A x64 -DXCENGINE_ENABLE_MONO_SCRIPTING=OFF ``` -## 依赖说明 +### 构建 editor -- ImGui - 跨平台 GUI 库 -- DirectX 12 - 渲染 API -- Windows SDK - 窗口管理 +```bash +cmake --build build --config Debug --target XCEditor +``` -## 扩展开发 +说明: -### 添加新面板 +- target 名称是 `XCEditor` +- 输出文件名仍然是 `XCEngine.exe` +- 输出目录是 `editor/bin//` -1. 在 `panels/` 目录下创建新的面板类 -2. 继承 `Panel` 基类 -3. 实现 `Render()` 方法 -4. 在 `Application` 中注册新面板 +## 运行 -### 添加新组件 +```bash +.\editor\bin\Debug\XCEngine.exe +``` -1. 定义组件类 -2. 在 `GameObject` 中注册组件类型 -3. 在 `InspectorPanel` 中添加属性编辑器 +默认情况下,editor 会自动把仓库内的 `project/` 识别为工程根目录。也可以显式指定工程: + +```bash +.\editor\bin\Debug\XCEngine.exe --project D:\Path\To\Project +``` + +如果需要 C# 脚本类发现与 Inspector 字段编辑,先构建: + +```bash +cmake --build build --config Debug --target xcengine_project_managed_assemblies +``` + +该 target 会把程序集放到: + +- `project/Library/ScriptAssemblies/XCEngine.ScriptCore.dll` +- `project/Library/ScriptAssemblies/GameScripts.dll` +- `project/Library/ScriptAssemblies/mscorlib.dll` + +## 当前目录结构 + +```text +editor/ +├── CMakeLists.txt +├── README.md +├── resources/ +│ └── Icons/ +├── src/ +│ ├── Actions/ # 编辑器动作路由 +│ ├── Commands/ # 命令与实体操作 +│ ├── ComponentEditors/ # Inspector 组件编辑器 +│ ├── Core/ # 应用生命周期、日志、项目根解析、撤销等 +│ ├── Layers/ # EditorLayer 等高层组装 +│ ├── Layout/ +│ ├── Managers/ # SceneManager / ProjectManager +│ ├── panels/ # Hierarchy / Scene / Game / Inspector / Project / Console +│ ├── Platform/ # Win32 host、D3D12 backend 辅助 +│ ├── UI/ # ImGui bridge 与通用 widget +│ ├── Utils/ +│ ├── Viewport/ +│ │ ├── Passes/ # editor viewport overlay pass +│ │ ├── SceneViewportOverlayBuilder.* +│ │ ├── SceneViewportPicker.* +│ │ ├── SceneViewportMoveGizmo.* +│ │ ├── SceneViewportRotateGizmo.* +│ │ ├── SceneViewportScaleGizmo.* +│ │ ├── ViewportHostRenderFlowUtils.h +│ │ └── ViewportHostService.h +│ ├── Application.cpp +│ ├── Application.h +│ ├── EditorApp.rc +│ ├── Theme.cpp +│ ├── Theme.h +│ └── main.cpp +└── bin/ +``` + +## 关键模块 + +### Application + +- `src/Application.cpp` +- `src/Application.h` + +负责: + +- editor 初始化与关闭 +- resource root 设置 +- scripting runtime 初始化 +- ImGui backend 初始化 +- `ViewportHostService` 接线 + +### Project Root + +- `src/Core/ProjectRootResolver.h` +- `src/Utils/ProjectFileUtils.h` + +负责: + +- 自动识别仓库内 `project/` +- 解析 `--project` +- 读写 `Project.xcproject` + +### Viewport + +- `src/Viewport/ViewportHostService.h` +- `src/Viewport/ViewportHostRenderFlowUtils.h` +- `src/Viewport/SceneViewportOverlayBuilder.*` +- `src/Viewport/Passes/SceneViewportEditorOverlayPass.*` + +负责: + +- 组装 scene/game viewport 渲染请求 +- 把 editor overlay 接入 `CameraRenderRequest::overlayPasses` +- object-id picking、outline、overlay pass 等 editor 视口能力 + +### Panels + +当前主要面板: + +- `HierarchyPanel` +- `SceneViewPanel` +- `GameViewPanel` +- `InspectorPanel` +- `ProjectPanel` +- `ConsolePanel` + +### Component Editors + +`ComponentEditors/` 当前不仅负责基础组件,也已经包含 `ScriptComponent` 的 Inspector 编辑入口。 + +## 开发约束 + +- editor 是宿主,不是第二套 renderer。 +- 新的世界空间 overlay / gizmo,不应继续堆到 ImGui world draw 路径。 +- viewport 相关问题优先检查 `engine/Rendering`、`RenderSurface` 与 `ViewportHostService` 的接线,而不是直接在 panel 里复制渲染逻辑。 +- 与项目资源、脚本程序集、`.meta`、`Library` 相关的问题,不要假设 editor 仍处于“无工程状态”的旧结构。 + +## 推荐验证 + +```bash +cmake --build build --config Debug --target editor_tests +cmake --build build --config Debug --target rendering_phase_regression +``` + +如果改动影响脚本类发现或 Inspector 脚本字段编辑,再补: + +```bash +cmake --build build --config Debug --target xcengine_project_managed_assemblies +cmake --build build --config Debug --target scripting_tests +``` diff --git a/editor/caidan.png b/editor/caidan.png deleted file mode 100644 index f0aa5ba940518042fb135ebdbd4709272fbbf0c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^+CZ$v!3HE_4=2e1DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMprEIxi(^QH``dF1c@G!}95|rzTmR3BhfmeF rPU4rUJbz|$-J?B+r<<-eAqZnKuCSOn%{sRnXefiHtDnm{r-UW|sw_N7 diff --git a/editor/color.png b/editor/color.png deleted file mode 100644 index b466e5db2ab3e3b04b68c68750948380fe697850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51420 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

j-WMCSJFI%&{hQ^(J1<9;`_X%orUd?1@3yG;O-< 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 {new_name}") - else: - print(f"File not found: {old_path}") - - -if __name__ == "__main__": - base = r"D:\Xuanchi\Main\XCEngine\editor" - rename_with_color(base) diff --git a/editor/resources/Icons/camera_gizmo.png b/editor/resources/Icons/camera_gizmo.png new file mode 100644 index 0000000000000000000000000000000000000000..48a411c10817249e09589383c6bc47f6f7473d95 GIT binary patch literal 672 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 literal 0 HcmV?d00001 diff --git a/editor/resources/Icons/view_orbit.png b/editor/resources/Icons/view_orbit.png new file mode 100644 index 0000000000000000000000000000000000000000..b690df89cc11cfbf2756eab60b4a50dbc74f103f GIT binary patch literal 381 zcmV-@0fPRCP)kdg0003*Nkl00bRLdh_VlUSn1Gfy(d{pd z=M@=)pv=(Mjb)iG-DO!frVWe9>Y+?C;uKNx{R zGz}~|5+Ow@kv3wYDFiXv_B;TwO6qHVQ9_sjFkF<@x}=UbPzGl7E+|ZDh9vyZgK(ow zYC;g*HCq)5(K3<`Y;Dwm5uha$CRL>rJxoFLG6h982NGp4>w%ckbL5V`^L$dzC{uN0 z!FhG+Wx_o1(z$mFFGJB1ii3E7Hs%&Qnczz|@00000NkvXXu0mjfqY|iC literal 0 HcmV?d00001 diff --git a/editor/src/Actions/EditorActions.h b/editor/src/Actions/EditorActions.h index c4c21884..a3310fd7 100644 --- a/editor/src/Actions/EditorActions.h +++ b/editor/src/Actions/EditorActions.h @@ -28,6 +28,14 @@ inline ActionBinding MakeSaveProjectAction(bool enabled = true) { return MakeAction("Save Project", nullptr, false, enabled); } +inline ActionBinding MakeRebuildScriptsAction(bool enabled = true) { + return MakeAction("Rebuild Script Assemblies", nullptr, false, enabled); +} + +inline ActionBinding MakeMigrateSceneAssetReferencesAction(bool enabled = true) { + return MakeAction("Migrate Scene AssetRefs", nullptr, false, enabled); +} + inline ActionBinding MakeNewSceneAction(bool enabled = true) { return MakeAction("New Scene", "Ctrl+N", false, enabled, true, Shortcut(ImGuiKey_N, true)); } diff --git a/editor/src/Actions/HierarchyActionRouter.h b/editor/src/Actions/HierarchyActionRouter.h index ea99105b..b77af805 100644 --- a/editor/src/Actions/HierarchyActionRouter.h +++ b/editor/src/Actions/HierarchyActionRouter.h @@ -168,6 +168,19 @@ inline void DrawHierarchySortOptionsPopup( } inline void DrawHierarchyCreateActions(IEditorContext& context, ::XCEngine::Components::GameObject* parent) { + const auto drawPrimitiveCreateAction = [&]( + const ActionBinding& action, + ::XCEngine::Resources::BuiltinPrimitiveType primitiveType) { + const char* label = ::XCEngine::Resources::GetBuiltinPrimitiveDisplayName(primitiveType); + DrawMenuAction(action, [&]() { + TraceHierarchyPopup(std::string("Hierarchy create clicked: ") + label); + auto* created = Commands::CreatePrimitiveEntity(context, primitiveType, parent); + TraceHierarchyPopup( + std::string("Hierarchy create result: ") + label + ", createdId=" + + std::to_string(created ? created->GetID() : 0)); + }); + }; + DrawMenuAction(MakeCreateEmptyEntityAction(), [&]() { TraceHierarchyPopup("Hierarchy create clicked: Empty Object"); auto* created = Commands::CreateEmptyEntity(context, parent, "Create Entity", "GameObject"); @@ -175,6 +188,16 @@ inline void DrawHierarchyCreateActions(IEditorContext& context, ::XCEngine::Comp std::string("Hierarchy create result: Empty Object, createdId=") + std::to_string(created ? created->GetID() : 0)); }); + + UI::DrawContextSubmenu("3D Object", [&]() { + drawPrimitiveCreateAction(MakeCreateCubeEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Cube); + drawPrimitiveCreateAction(MakeCreateSphereEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Sphere); + drawPrimitiveCreateAction(MakeCreateCapsuleEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Capsule); + drawPrimitiveCreateAction(MakeCreateCylinderEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Cylinder); + drawPrimitiveCreateAction(MakeCreatePlaneEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Plane); + drawPrimitiveCreateAction(MakeCreateQuadEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Quad); + }); + DrawMenuSeparator(); DrawMenuAction(MakeCreateCameraEntityAction(), [&]() { TraceHierarchyPopup("Hierarchy create clicked: Camera"); @@ -190,28 +213,6 @@ inline void DrawHierarchyCreateActions(IEditorContext& context, ::XCEngine::Comp std::string("Hierarchy create result: Light, createdId=") + std::to_string(created ? created->GetID() : 0)); }); - DrawMenuSeparator(); - DrawMenuAction(MakeCreateCubeEntityAction(), [&]() { - TraceHierarchyPopup("Hierarchy create clicked: Cube"); - auto* created = Commands::CreateEmptyEntity(context, parent, "Create Cube", "Cube"); - TraceHierarchyPopup( - std::string("Hierarchy create result: Cube, createdId=") + - std::to_string(created ? created->GetID() : 0)); - }); - DrawMenuAction(MakeCreateSphereEntityAction(), [&]() { - TraceHierarchyPopup("Hierarchy create clicked: Sphere"); - auto* created = Commands::CreateEmptyEntity(context, parent, "Create Sphere", "Sphere"); - TraceHierarchyPopup( - std::string("Hierarchy create result: Sphere, createdId=") + - std::to_string(created ? created->GetID() : 0)); - }); - DrawMenuAction(MakeCreatePlaneEntityAction(), [&]() { - TraceHierarchyPopup("Hierarchy create clicked: Plane"); - auto* created = Commands::CreateEmptyEntity(context, parent, "Create Plane", "Plane"); - TraceHierarchyPopup( - std::string("Hierarchy create result: Plane, createdId=") + - std::to_string(created ? created->GetID() : 0)); - }); } inline void HandleHierarchyItemContextRequest( @@ -275,7 +276,7 @@ inline void DrawHierarchyBackgroundContextPopup(IEditorContext& context, UI::Def backgroundContextMenu.ConsumeOpenRequest("HierarchyContextMenu"); static bool s_lastBackgroundPopupOpen = false; - if (!UI::BeginPopup("HierarchyContextMenu")) { + if (!UI::BeginContextMenu("HierarchyContextMenu")) { if (s_lastBackgroundPopupOpen) { TraceHierarchyPopup("Hierarchy background popup closed"); s_lastBackgroundPopupOpen = false; @@ -289,7 +290,7 @@ inline void DrawHierarchyBackgroundContextPopup(IEditorContext& context, UI::Def } DrawHierarchyContextActions(context, nullptr, true); - UI::EndPopup(); + UI::EndContextMenu(); } inline void DrawHierarchyEntityContextPopup( @@ -298,7 +299,7 @@ inline void DrawHierarchyEntityContextPopup( itemContextMenu.ConsumeOpenRequest("HierarchyEntityContextMenu"); static bool s_lastEntityPopupOpen = false; - if (!UI::BeginPopup("HierarchyEntityContextMenu")) { + if (!UI::BeginContextMenu("HierarchyEntityContextMenu")) { if (s_lastEntityPopupOpen) { TraceHierarchyPopup("Hierarchy entity popup closed"); s_lastEntityPopupOpen = false; @@ -314,7 +315,7 @@ inline void DrawHierarchyEntityContextPopup( if (itemContextMenu.HasTarget()) { DrawHierarchyContextActions(context, itemContextMenu.TargetValue()); } - UI::EndPopup(); + UI::EndContextMenu(); if (!ImGui::IsPopupOpen("HierarchyEntityContextMenu") && !itemContextMenu.HasPendingOpenRequest()) { itemContextMenu.Clear(); diff --git a/editor/src/Actions/MainMenuActionRouter.h b/editor/src/Actions/MainMenuActionRouter.h index 18b132e7..3070528b 100644 --- a/editor/src/Actions/MainMenuActionRouter.h +++ b/editor/src/Actions/MainMenuActionRouter.h @@ -34,6 +34,14 @@ inline void ExecuteSaveProject(IEditorContext& context) { Commands::SaveProject(context); } +inline void ExecuteRebuildScriptAssemblies(IEditorContext& context) { + Commands::RebuildScriptAssemblies(context); +} + +inline void ExecuteMigrateSceneAssetReferences(IEditorContext& context) { + Commands::MigrateSceneAssetReferences(context); +} + inline void ExecuteOpenScene(IEditorContext& context) { Commands::OpenSceneWithDialog(context); } @@ -143,6 +151,10 @@ inline void DrawFileMenuActions(IEditorContext& context) { DrawMenuAction(MakeSaveSceneAction(canEditDocuments), [&]() { ExecuteSaveScene(context); }); DrawMenuAction(MakeSaveSceneAsAction(canEditDocuments), [&]() { ExecuteSaveSceneAs(context); }); DrawMenuSeparator(); + DrawMenuAction( + MakeMigrateSceneAssetReferencesAction(Commands::CanMigrateSceneAssetReferences(context)), + [&]() { ExecuteMigrateSceneAssetReferences(context); }); + DrawMenuSeparator(); DrawMenuAction(MakeExitAction(), [&]() { RequestEditorExit(context); }); } @@ -160,6 +172,12 @@ inline void DrawRunMenuActions(IEditorContext& context) { }); } +inline void DrawScriptsMenuActions(IEditorContext& context) { + DrawMenuAction( + MakeRebuildScriptsAction(Commands::CanRebuildScriptAssemblies(context)), + [&]() { ExecuteRebuildScriptAssemblies(context); }); +} + inline void DrawViewMenuActions(IEditorContext& context) { DrawMenuAction(MakeResetLayoutAction(), [&]() { RequestDockLayoutReset(context); }); } @@ -186,6 +204,9 @@ inline void DrawMainMenuBar(IEditorContext& context, UI::DeferredPopupState& abo UI::DrawMenuScope("Run", [&]() { DrawRunMenuActions(context); }); + UI::DrawMenuScope("Scripts", [&]() { + DrawScriptsMenuActions(context); + }); UI::DrawMenuScope("View", [&]() { DrawViewMenuActions(context); }); diff --git a/editor/src/Application.cpp b/editor/src/Application.cpp index ddc8ccbd..5cf8644f 100644 --- a/editor/src/Application.cpp +++ b/editor/src/Application.cpp @@ -6,12 +6,18 @@ #include "Core/EditorContext.h" #include "Core/EditorEvents.h" #include "Core/EventBus.h" +#include "Scripting/EditorScriptAssemblyBuilder.h" #include "UI/BuiltInIcons.h" #include "Platform/Win32Utf8.h" #include "Platform/WindowsProcessDiagnostics.h" #include #include +#include +#ifdef XCENGINE_ENABLE_MONO_SCRIPTING +#include +#endif #include +#include #include namespace XCEngine { @@ -22,6 +28,123 @@ Application& Application::Get() { return instance; } +void Application::InitializeScriptingRuntime(const std::string& projectPath) { + ShutdownScriptingRuntime(); + + const std::filesystem::path assemblyDirectoryPath = + std::filesystem::path(Platform::Utf8ToWide(projectPath)) / L"Library" / L"ScriptAssemblies"; + m_scriptRuntimeStatus.assemblyDirectory = Platform::WideToUtf8(assemblyDirectoryPath.wstring()); + +#ifdef XCENGINE_ENABLE_MONO_SCRIPTING + namespace fs = std::filesystem; + + auto& logger = Debug::Logger::Get(); + const fs::path assemblyDirectory = assemblyDirectoryPath; + m_scriptRuntimeStatus.backendEnabled = true; + + ::XCEngine::Scripting::MonoScriptRuntime::Settings settings; + settings.assemblyDirectory = assemblyDirectory; + settings.corlibDirectory = assemblyDirectory; + settings.coreAssemblyPath = assemblyDirectory / L"XCEngine.ScriptCore.dll"; + settings.appAssemblyPath = assemblyDirectory / L"GameScripts.dll"; + + std::error_code ec; + const bool hasCoreAssembly = fs::exists(settings.coreAssemblyPath, ec); + ec.clear(); + const bool hasAppAssembly = fs::exists(settings.appAssemblyPath, ec); + ec.clear(); + const bool hasCorlibAssembly = fs::exists(assemblyDirectory / L"mscorlib.dll", ec); + m_scriptRuntimeStatus.assembliesFound = hasCoreAssembly && hasAppAssembly && hasCorlibAssembly; + + if (!hasCoreAssembly || !hasAppAssembly || !hasCorlibAssembly) { + m_scriptRuntimeStatus.statusMessage = + "Script assemblies were not found in " + Platform::WideToUtf8(assemblyDirectory.wstring()) + + ". Script class discovery is disabled until the managed assemblies are built."; + logger.Warning(Debug::LogCategory::Scripting, m_scriptRuntimeStatus.statusMessage.c_str()); + ::XCEngine::Scripting::ScriptEngine::Get().SetRuntime(nullptr); + return; + } + + auto runtime = std::make_unique<::XCEngine::Scripting::MonoScriptRuntime>(settings); + if (!runtime->Initialize()) { + m_scriptRuntimeStatus.statusMessage = + "Failed to initialize editor script runtime: " + runtime->GetLastError(); + logger.Warning(Debug::LogCategory::Scripting, m_scriptRuntimeStatus.statusMessage.c_str()); + ::XCEngine::Scripting::ScriptEngine::Get().SetRuntime(nullptr); + return; + } + + ::XCEngine::Scripting::ScriptEngine::Get().SetRuntime(runtime.get()); + m_scriptRuntimeStatus.runtimeLoaded = true; + m_scriptRuntime = std::move(runtime); + logger.Info(Debug::LogCategory::Scripting, "Editor script runtime initialized."); +#else + (void)projectPath; + m_scriptRuntimeStatus.backendEnabled = false; + m_scriptRuntimeStatus.statusMessage = "This editor build does not include Mono scripting support."; + ::XCEngine::Scripting::ScriptEngine::Get().SetRuntime(nullptr); +#endif +} + +void Application::ShutdownScriptingRuntime() { + ::XCEngine::Scripting::ScriptEngine::Get().OnRuntimeStop(); + ::XCEngine::Scripting::ScriptEngine::Get().SetRuntime(nullptr); + +#ifdef XCENGINE_ENABLE_MONO_SCRIPTING + m_scriptRuntime.reset(); +#endif + + m_scriptRuntimeStatus = {}; +} + +bool Application::ReloadScriptingRuntime() { + if (!m_editorContext) { + return false; + } + + const std::string& projectPath = m_editorContext->GetProjectPath(); + if (projectPath.empty()) { + return false; + } + + InitializeScriptingRuntime(projectPath); + return m_scriptRuntimeStatus.runtimeLoaded; +} + +bool Application::RebuildScriptingAssemblies() { + if (!m_editorContext) { + return false; + } + + const std::string& projectPath = m_editorContext->GetProjectPath(); + if (projectPath.empty()) { + return false; + } + +#ifdef XCENGINE_ENABLE_MONO_SCRIPTING + auto& logger = Debug::Logger::Get(); + logger.Info(Debug::LogCategory::Scripting, "Rebuilding project script assemblies..."); + + // Release the currently loaded project assembly before invoking the compiler. + // Otherwise GameScripts.dll can remain locked by the active Mono app domain. + ShutdownScriptingRuntime(); + + const ::XCEngine::Editor::Scripting::EditorScriptAssemblyBuildResult buildResult = + ::XCEngine::Editor::Scripting::EditorScriptAssemblyBuilder::RebuildProjectAssemblies(projectPath); + if (!buildResult.succeeded) { + m_scriptRuntimeStatus.statusMessage = buildResult.message; + logger.Error(Debug::LogCategory::Scripting, buildResult.message.c_str()); + return false; + } + + logger.Info(Debug::LogCategory::Scripting, buildResult.message.c_str()); + return ReloadScriptingRuntime(); +#else + m_scriptRuntimeStatus.statusMessage = "This editor build does not include Mono scripting support."; + return false; +#endif +} + bool Application::InitializeWindowRenderer(HWND hwnd) { RECT clientRect = {}; if (!GetClientRect(hwnd, &clientRect)) { @@ -150,6 +273,7 @@ bool Application::Initialize(HWND hwnd) { logger.Info(Debug::LogCategory::General, "Initializing editor context..."); InitializeEditorContext(projectRoot); + InitializeScriptingRuntime(projectRoot); logger.Info(Debug::LogCategory::General, "Initializing ImGui backend..."); InitializeImGui(hwnd); logger.Info(Debug::LogCategory::General, "Attaching editor layer..."); @@ -171,6 +295,7 @@ void Application::Shutdown() { UI::ShutdownBuiltInIcons(); m_imguiBackend.Shutdown(); m_imguiSession.Shutdown(); + ShutdownScriptingRuntime(); ShutdownEditorContext(); if (m_resourceManagerInitialized) { ::XCEngine::Resources::ResourceManager::Get().Shutdown(); @@ -230,6 +355,7 @@ bool Application::SwitchProject(const std::string& projectPath) { logger.Info(Debug::LogCategory::General, infoMessage.c_str()); ::XCEngine::Resources::ResourceManager::Get().SetResourceRoot(projectPath.c_str()); + InitializeScriptingRuntime(projectPath); m_lastWindowTitle.clear(); UpdateWindowTitle(); diff --git a/editor/src/Application.h b/editor/src/Application.h index 4747beba..4490ea92 100644 --- a/editor/src/Application.h +++ b/editor/src/Application.h @@ -1,6 +1,7 @@ #pragma once #include "Platform/D3D12WindowRenderer.h" +#include "Scripting/EditorScriptRuntimeStatus.h" #include "UI/ImGuiBackendBridge.h" #include "UI/ImGuiSession.h" #include "Viewport/ViewportHostService.h" @@ -19,6 +20,12 @@ class RHIDevice; class RHISwapChain; } // namespace RHI +namespace Scripting { +#ifdef XCENGINE_ENABLE_MONO_SCRIPTING +class MonoScriptRuntime; +#endif +} // namespace Scripting + namespace Editor { class EditorLayer; @@ -33,6 +40,8 @@ public: void Render(); void OnResize(int width, int height); bool SwitchProject(const std::string& projectPath); + bool ReloadScriptingRuntime(); + bool RebuildScriptingAssemblies(); void SaveProjectState(); Rendering::RenderContext GetMainRenderContext() const { return m_windowRenderer.GetRenderContext(); } RHI::RHIDevice* GetMainRHIDevice() const { return m_windowRenderer.GetRHIDevice(); } @@ -42,6 +51,7 @@ public: HWND GetWindowHandle() const { return m_hwnd; } IEditorContext& GetEditorContext() const { return *m_editorContext; } + const EditorScriptRuntimeStatus& GetScriptRuntimeStatus() const { return m_scriptRuntimeStatus; } private: Application() = default; @@ -52,6 +62,8 @@ private: void AttachEditorLayer(); void DetachEditorLayer(); void ShutdownEditorContext(); + void InitializeScriptingRuntime(const std::string& projectPath); + void ShutdownScriptingRuntime(); void RenderEditorFrame(); void UpdateWindowTitle(); @@ -70,6 +82,10 @@ private: bool m_hasLastFrameTime = false; bool m_renderReady = false; bool m_resourceManagerInitialized = false; + EditorScriptRuntimeStatus m_scriptRuntimeStatus; +#ifdef XCENGINE_ENABLE_MONO_SCRIPTING + std::unique_ptr<::XCEngine::Scripting::MonoScriptRuntime> m_scriptRuntime; +#endif }; } diff --git a/editor/src/Commands/EntityCommands.h b/editor/src/Commands/EntityCommands.h index a749ec40..179b648d 100644 --- a/editor/src/Commands/EntityCommands.h +++ b/editor/src/Commands/EntityCommands.h @@ -7,8 +7,11 @@ #include #include +#include +#include #include #include +#include #include @@ -80,6 +83,31 @@ inline ::XCEngine::Components::GameObject* CreateLightEntity( }); } +inline ::XCEngine::Components::GameObject* CreatePrimitiveEntity( + IEditorContext& context, + ::XCEngine::Resources::BuiltinPrimitiveType primitiveType, + ::XCEngine::Components::GameObject* parent = nullptr) { + const char* primitiveName = ::XCEngine::Resources::GetBuiltinPrimitiveDisplayName(primitiveType); + return CreateEntity( + context, + std::string("Create ") + primitiveName, + primitiveName, + parent, + [primitiveType](::XCEngine::Components::GameObject& entity, ISceneManager&) { + auto* meshFilter = entity.GetComponent<::XCEngine::Components::MeshFilterComponent>(); + if (meshFilter == nullptr) { + meshFilter = entity.AddComponent<::XCEngine::Components::MeshFilterComponent>(); + } + meshFilter->SetMeshPath(::XCEngine::Resources::GetBuiltinPrimitiveMeshPath(primitiveType).CStr()); + + auto* meshRenderer = entity.GetComponent<::XCEngine::Components::MeshRendererComponent>(); + if (meshRenderer == nullptr) { + meshRenderer = entity.AddComponent<::XCEngine::Components::MeshRendererComponent>(); + } + meshRenderer->SetMaterialPath(0, ::XCEngine::Resources::GetBuiltinDefaultPrimitiveMaterialPath().CStr()); + }); +} + inline bool RenameEntity( IEditorContext& context, ::XCEngine::Components::GameObject::ID entityId, diff --git a/editor/src/Commands/ProjectCommands.h b/editor/src/Commands/ProjectCommands.h index 55f92022..094f2c1c 100644 --- a/editor/src/Commands/ProjectCommands.h +++ b/editor/src/Commands/ProjectCommands.h @@ -314,6 +314,35 @@ inline bool SaveProject(IEditorContext& context) { return SaveProjectDescriptor(context); } +inline bool CanRebuildScriptAssemblies(const IEditorContext& context) { + return IsProjectDocumentEditingAllowed(context) && !context.GetProjectPath().empty(); +} + +inline bool RebuildScriptAssemblies(IEditorContext& context) { + if (!CanRebuildScriptAssemblies(context)) { + return false; + } + + const bool rebuilt = Application::Get().RebuildScriptingAssemblies(); + if (rebuilt) { + context.GetProjectManager().RefreshCurrentFolder(); + } + + return rebuilt; +} + +inline bool CanMigrateSceneAssetReferences(const IEditorContext& context) { + return IsProjectDocumentEditingAllowed(context) && !context.GetProjectPath().empty(); +} + +inline IProjectManager::SceneAssetReferenceMigrationReport MigrateSceneAssetReferences(IEditorContext& context) { + if (!CanMigrateSceneAssetReferences(context)) { + return {}; + } + + return context.GetProjectManager().MigrateSceneAssetReferences(); +} + inline bool SwitchProject(IEditorContext& context, const std::string& projectPath) { if (!IsProjectDocumentEditingAllowed(context)) { return false; diff --git a/editor/src/ComponentEditors/AssetReferenceEditorUtils.h b/editor/src/ComponentEditors/AssetReferenceEditorUtils.h index c2287c7b..26ccf0ee 100644 --- a/editor/src/ComponentEditors/AssetReferenceEditorUtils.h +++ b/editor/src/ComponentEditors/AssetReferenceEditorUtils.h @@ -30,7 +30,7 @@ inline AssetReferenceInteraction DrawAssetReferenceProperty( pickerOptions.assetsTabLabel = "Assets"; pickerOptions.sceneTabLabel = "Scene"; pickerOptions.showAssetsTab = true; - pickerOptions.showSceneTab = true; + pickerOptions.showSceneTab = false; pickerOptions.supportedAssetExtensions = supportedExtensions; UI::DrawPropertyRow(label, UI::InspectorPropertyLayout(), [&](const UI::PropertyLayoutMetrics& layout) { diff --git a/editor/src/ComponentEditors/ComponentEditorRegistry.cpp b/editor/src/ComponentEditors/ComponentEditorRegistry.cpp index ae0a4265..e0e15cdc 100644 --- a/editor/src/ComponentEditors/ComponentEditorRegistry.cpp +++ b/editor/src/ComponentEditors/ComponentEditorRegistry.cpp @@ -4,6 +4,7 @@ #include "ComponentEditors/LightComponentEditor.h" #include "ComponentEditors/MeshFilterComponentEditor.h" #include "ComponentEditors/MeshRendererComponentEditor.h" +#include "ComponentEditors/ScriptComponentEditor.h" #include "ComponentEditors/TransformComponentEditor.h" namespace XCEngine { @@ -20,6 +21,7 @@ ComponentEditorRegistry::ComponentEditorRegistry() { RegisterEditor(std::make_unique()); RegisterEditor(std::make_unique()); RegisterEditor(std::make_unique()); + RegisterEditor(std::make_unique()); } void ComponentEditorRegistry::RegisterEditor(std::unique_ptr editor) { diff --git a/editor/src/ComponentEditors/ScriptComponentEditor.h b/editor/src/ComponentEditors/ScriptComponentEditor.h new file mode 100644 index 00000000..faa378c2 --- /dev/null +++ b/editor/src/ComponentEditors/ScriptComponentEditor.h @@ -0,0 +1,515 @@ +#pragma once + +#include "Application.h" +#include "IComponentEditor.h" +#include "ScriptComponentEditorUtils.h" +#include "Core/IUndoManager.h" +#include "UI/UI.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace XCEngine { +namespace Editor { + +class ScriptComponentEditor : public IComponentEditor { +public: + const char* GetComponentTypeName() const override { + return "ScriptComponent"; + } + + const char* GetDisplayName() const override { + return "Script"; + } + + bool Render(::XCEngine::Components::Component* component, IUndoManager* undoManager) override { + auto* scriptComponent = dynamic_cast<::XCEngine::Scripting::ScriptComponent*>(component); + if (!scriptComponent) { + return false; + } + + bool changed = false; + changed |= RenderScriptClassSelector(*scriptComponent, undoManager); + + ::XCEngine::Scripting::ScriptFieldModel model; + if (!::XCEngine::Scripting::ScriptEngine::Get().TryGetScriptFieldModel(scriptComponent, model)) { + UI::DrawHintText("Failed to query script field metadata."); + return changed; + } + + switch (model.classStatus) { + case ::XCEngine::Scripting::ScriptFieldClassStatus::Unassigned: + UI::DrawHintText("Assign a C# script to edit serialized fields."); + return changed; + case ::XCEngine::Scripting::ScriptFieldClassStatus::Missing: + UI::DrawHintText("Assigned script class is not available in the loaded script assemblies."); + break; + case ::XCEngine::Scripting::ScriptFieldClassStatus::Available: + default: + break; + } + + if (model.fields.empty()) { + UI::DrawHintText( + model.classStatus == ::XCEngine::Scripting::ScriptFieldClassStatus::Available + ? "Selected script exposes no supported public instance fields." + : "No serialized script fields are currently available."); + return changed; + } + + for (const ::XCEngine::Scripting::ScriptFieldSnapshot& field : model.fields) { + changed |= RenderScriptField(*scriptComponent, model.classStatus, field, undoManager); + } + + return changed; + } + + bool CanAddTo(::XCEngine::Components::GameObject* gameObject) const override { + return gameObject != nullptr; + } + + const char* GetAddDisabledReason(::XCEngine::Components::GameObject* gameObject) const override { + return gameObject ? nullptr : "Invalid"; + } + + bool CanRemove(::XCEngine::Components::Component* component) const override { + return CanEdit(component); + } + +private: + static constexpr size_t kStringBufferSize = 512; + + struct StringFieldEditState { + std::array buffer{}; + std::string lastSyncedValue; + bool initialized = false; + bool editing = false; + }; + + bool RenderScriptClassSelector( + ::XCEngine::Scripting::ScriptComponent& scriptComponent, + IUndoManager* undoManager) { + std::vector<::XCEngine::Scripting::ScriptClassDescriptor> scriptClasses; + const bool hasLoadedClasses = + ::XCEngine::Scripting::ScriptEngine::Get().TryGetAvailableScriptClasses(scriptClasses); + + const ::XCEngine::Scripting::ScriptClassDescriptor currentDescriptor{ + scriptComponent.GetAssemblyName(), + scriptComponent.GetNamespaceName(), + scriptComponent.GetClassName() + }; + + std::string currentLabel = "None"; + if (scriptComponent.HasScriptClass()) { + const auto currentIt = std::find(scriptClasses.begin(), scriptClasses.end(), currentDescriptor); + currentLabel = currentIt != scriptClasses.end() + ? ScriptComponentEditorUtils::BuildScriptClassDisplayName(*currentIt) + : ScriptComponentEditorUtils::BuildScriptClassDisplayName(scriptComponent) + " (Missing)"; + } + + bool changed = false; + UI::DrawPropertyRow("Script", UI::InspectorPropertyLayout(), [&](const UI::PropertyLayoutMetrics& layout) { + UI::AlignPropertyControlVertically(layout, ImGui::GetFrameHeight()); + ImGui::SetNextItemWidth(layout.controlWidth); + if (!ImGui::BeginCombo("##ScriptClass", currentLabel.c_str())) { + return false; + } + + if (ImGui::Selectable("None", !scriptComponent.HasScriptClass())) { + changed |= ApplyScriptClassSelection(scriptComponent, nullptr, undoManager); + } + + if (!scriptClasses.empty()) { + ImGui::Separator(); + } + + for (const ::XCEngine::Scripting::ScriptClassDescriptor& descriptor : scriptClasses) { + const bool selected = descriptor == currentDescriptor; + const std::string label = + ScriptComponentEditorUtils::BuildScriptClassDisplayName(descriptor); + if (ImGui::Selectable(label.c_str(), selected)) { + changed |= ApplyScriptClassSelection(scriptComponent, &descriptor, undoManager); + } + if (selected) { + ImGui::SetItemDefaultFocus(); + } + } + + if (!hasLoadedClasses) { + ImGui::Separator(); + ImGui::TextDisabled("No script assemblies are currently loaded."); + } + + ImGui::EndCombo(); + return false; + }); + + if (!hasLoadedClasses) { + const EditorScriptRuntimeStatus& runtimeStatus = Application::Get().GetScriptRuntimeStatus(); + const std::string hintText = + ScriptComponentEditorUtils::BuildScriptRuntimeUnavailableHint(runtimeStatus); + UI::DrawHintText(hintText.c_str()); + + if (ScriptComponentEditorUtils::CanRebuildScriptAssemblies(runtimeStatus)) { + if (UI::InspectorActionButton("Rebuild Scripts", ImVec2(120.0f, 0.0f))) { + Application::Get().RebuildScriptingAssemblies(); + } + } + + if (ScriptComponentEditorUtils::CanReloadScriptRuntime(runtimeStatus)) { + if (ScriptComponentEditorUtils::CanRebuildScriptAssemblies(runtimeStatus)) { + ImGui::SameLine(); + } + if (UI::InspectorActionButton("Reload Scripts", ImVec2(120.0f, 0.0f))) { + Application::Get().ReloadScriptingRuntime(); + } + } + } + + return changed; + } + + bool ApplyScriptClassSelection( + ::XCEngine::Scripting::ScriptComponent& scriptComponent, + const ::XCEngine::Scripting::ScriptClassDescriptor* descriptor, + IUndoManager* undoManager) const { + if (!descriptor) { + if (!scriptComponent.HasScriptClass()) { + return false; + } + + if (undoManager) { + undoManager->BeginInteractiveChange("Modify Script Component"); + } + scriptComponent.ClearScriptClass(); + return true; + } + + if (scriptComponent.GetAssemblyName() == descriptor->assemblyName && + scriptComponent.GetNamespaceName() == descriptor->namespaceName && + scriptComponent.GetClassName() == descriptor->className) { + return false; + } + + if (undoManager) { + undoManager->BeginInteractiveChange("Modify Script Component"); + } + scriptComponent.SetScriptClass( + descriptor->assemblyName, + descriptor->namespaceName, + descriptor->className); + return true; + } + + bool RenderScriptField( + ::XCEngine::Scripting::ScriptComponent& scriptComponent, + ::XCEngine::Scripting::ScriptFieldClassStatus classStatus, + const ::XCEngine::Scripting::ScriptFieldSnapshot& field, + IUndoManager* undoManager) { + bool changed = false; + const bool canEdit = ScriptComponentEditorUtils::CanEditScriptField(classStatus, field); + + if (canEdit) { + changed |= RenderScriptFieldEditor(scriptComponent, field, undoManager); + } else { + RenderReadOnlyScriptField(field); + } + + const std::string issueText = ScriptComponentEditorUtils::BuildScriptFieldIssueText(field); + if (!issueText.empty()) { + UI::DrawHintText(issueText.c_str()); + } + + if (ScriptComponentEditorUtils::CanClearScriptFieldOverride(field)) { + ImGui::PushID((field.metadata.name + "##Reset").c_str()); + if (UI::InspectorActionButton("Reset", ImVec2(72.0f, 0.0f))) { + changed |= ClearScriptFieldOverride(scriptComponent, field, undoManager); + } + ImGui::PopID(); + } + + return changed; + } + + bool RenderScriptFieldEditor( + ::XCEngine::Scripting::ScriptComponent& scriptComponent, + const ::XCEngine::Scripting::ScriptFieldSnapshot& field, + IUndoManager* undoManager) { + using namespace ::XCEngine::Scripting; + + switch (field.metadata.type) { + case ScriptFieldType::Float: { + float value = std::get(field.value); + const bool widgetChanged = UI::DrawPropertyFloat(field.metadata.name.c_str(), value, 0.1f); + return widgetChanged && ApplyScriptFieldWrite(scriptComponent, field, ScriptFieldValue(value), undoManager); + } + case ScriptFieldType::Double: { + double value = std::get(field.value); + const bool widgetChanged = UI::DrawPropertyRow( + field.metadata.name.c_str(), + UI::InspectorPropertyLayout(), + [&](const UI::PropertyLayoutMetrics& layout) { + UI::AlignPropertyControlVertically(layout, ImGui::GetFrameHeight()); + ImGui::SetNextItemWidth(layout.controlWidth); + return ImGui::InputDouble("##Value", &value, 0.0, 0.0, "%.3f"); + }); + return widgetChanged && ApplyScriptFieldWrite(scriptComponent, field, ScriptFieldValue(value), undoManager); + } + case ScriptFieldType::Bool: { + bool value = std::get(field.value); + const bool widgetChanged = UI::DrawPropertyBool(field.metadata.name.c_str(), value); + return widgetChanged && ApplyScriptFieldWrite(scriptComponent, field, ScriptFieldValue(value), undoManager); + } + case ScriptFieldType::Int32: { + int value = std::get(field.value); + const bool widgetChanged = UI::DrawPropertyInt(field.metadata.name.c_str(), value, 1); + return widgetChanged && + ApplyScriptFieldWrite(scriptComponent, field, ScriptFieldValue(static_cast(value)), undoManager); + } + case ScriptFieldType::UInt64: { + uint64_t value = std::get(field.value); + const bool widgetChanged = UI::DrawPropertyRow( + field.metadata.name.c_str(), + UI::InspectorPropertyLayout(), + [&](const UI::PropertyLayoutMetrics& layout) { + UI::AlignPropertyControlVertically(layout, ImGui::GetFrameHeight()); + ImGui::SetNextItemWidth(layout.controlWidth); + return ImGui::InputScalar("##Value", ImGuiDataType_U64, &value); + }); + return widgetChanged && ApplyScriptFieldWrite(scriptComponent, field, ScriptFieldValue(value), undoManager); + } + case ScriptFieldType::String: + return RenderStringScriptFieldEditor(scriptComponent, field, undoManager); + case ScriptFieldType::Vector2: { + ::XCEngine::Math::Vector2 value = std::get<::XCEngine::Math::Vector2>(field.value); + const bool widgetChanged = UI::DrawPropertyVec2(field.metadata.name.c_str(), value, 0.0f, 0.1f); + return widgetChanged && ApplyScriptFieldWrite(scriptComponent, field, ScriptFieldValue(value), undoManager); + } + case ScriptFieldType::Vector3: { + ::XCEngine::Math::Vector3 value = std::get<::XCEngine::Math::Vector3>(field.value); + const bool widgetChanged = UI::DrawPropertyVec3Input(field.metadata.name.c_str(), value, 0.1f); + return widgetChanged && ApplyScriptFieldWrite(scriptComponent, field, ScriptFieldValue(value), undoManager); + } + case ScriptFieldType::Vector4: { + ::XCEngine::Math::Vector4 value = std::get<::XCEngine::Math::Vector4>(field.value); + const bool widgetChanged = UI::DrawPropertyRow( + field.metadata.name.c_str(), + UI::InspectorPropertyLayout(), + [&](const UI::PropertyLayoutMetrics& layout) { + UI::AlignPropertyControlVertically(layout, ImGui::GetFrameHeight()); + ImGui::SetNextItemWidth(layout.controlWidth); + return ImGui::DragFloat4("##Value", &value.x, 0.1f); + }); + return widgetChanged && ApplyScriptFieldWrite(scriptComponent, field, ScriptFieldValue(value), undoManager); + } + case ScriptFieldType::GameObject: + return RenderGameObjectScriptFieldEditor(scriptComponent, field, undoManager); + case ScriptFieldType::None: + default: + RenderReadOnlyScriptField(field); + return false; + } + } + + bool RenderStringScriptFieldEditor( + ::XCEngine::Scripting::ScriptComponent& scriptComponent, + const ::XCEngine::Scripting::ScriptFieldSnapshot& field, + IUndoManager* undoManager) { + StringFieldEditState& editState = + m_stringFieldStates[scriptComponent.GetScriptComponentUUID()][field.metadata.name]; + const std::string currentValue = std::get(field.value); + + if (!editState.initialized || (!editState.editing && editState.lastSyncedValue != currentValue)) { + SyncStringFieldEditState(editState, currentValue); + } + + bool isEditing = false; + const bool widgetChanged = UI::DrawPropertyRow( + field.metadata.name.c_str(), + UI::InspectorPropertyLayout(), + [&](const UI::PropertyLayoutMetrics& layout) { + UI::AlignPropertyControlVertically(layout, ImGui::GetFrameHeight()); + ImGui::SetNextItemWidth(layout.controlWidth); + const bool changed = ImGui::InputText("##Value", editState.buffer.data(), editState.buffer.size()); + isEditing = ImGui::IsItemActive(); + return changed; + }); + editState.editing = isEditing; + + if (!widgetChanged) { + return false; + } + + const std::string editedValue(editState.buffer.data()); + if (!ApplyScriptFieldWrite( + scriptComponent, + field, + ::XCEngine::Scripting::ScriptFieldValue(editedValue), + undoManager)) { + SyncStringFieldEditState(editState, currentValue); + return false; + } + + editState.lastSyncedValue = editedValue; + return true; + } + + bool RenderGameObjectScriptFieldEditor( + ::XCEngine::Scripting::ScriptComponent& scriptComponent, + const ::XCEngine::Scripting::ScriptFieldSnapshot& field, + IUndoManager* undoManager) { + using namespace ::XCEngine::Scripting; + + const GameObjectReference currentReference = std::get(field.value); + const auto& sceneRoots = Application::Get().GetEditorContext().GetSceneManager().GetRootEntities(); + const ::XCEngine::Components::GameObject::ID currentGameObjectId = + ScriptComponentEditorUtils::FindGameObjectIdByUuid(sceneRoots, currentReference.gameObjectUUID); + + UI::ReferencePickerOptions pickerOptions; + pickerOptions.popupTitle = "Select GameObject"; + pickerOptions.emptyHint = "None"; + pickerOptions.searchHint = "Search"; + pickerOptions.noSceneText = "No scene objects."; + pickerOptions.showAssetsTab = false; + pickerOptions.showSceneTab = true; + + GameObjectReference pendingReference = currentReference; + const bool widgetChanged = UI::DrawPropertyRow( + field.metadata.name.c_str(), + UI::InspectorPropertyLayout(), + [&](const UI::PropertyLayoutMetrics& layout) { + UI::AlignPropertyControlVertically(layout, ImGui::GetFrameHeight()); + const UI::ReferencePickerInteraction interaction = + UI::DrawReferencePickerControl( + std::string(), + currentGameObjectId, + pickerOptions, + layout.controlWidth); + + if (interaction.clearRequested) { + pendingReference = GameObjectReference{}; + return true; + } + + if (interaction.assignedSceneObjectId == ::XCEngine::Components::GameObject::INVALID_ID || + interaction.assignedSceneObjectId == currentGameObjectId) { + return false; + } + + ::XCEngine::Components::GameObject* assignedGameObject = + Application::Get().GetEditorContext().GetSceneManager().GetEntity(interaction.assignedSceneObjectId); + if (!assignedGameObject) { + return false; + } + + pendingReference = GameObjectReference{assignedGameObject->GetUUID()}; + return true; + }); + + return widgetChanged && + ApplyScriptFieldWrite(scriptComponent, field, ScriptFieldValue(pendingReference), undoManager); + } + + void RenderReadOnlyScriptField(const ::XCEngine::Scripting::ScriptFieldSnapshot& field) const { + const std::string valueText = DescribeScriptFieldValue(field.metadata.type, field.value); + UI::DrawPropertyRow( + field.metadata.name.c_str(), + UI::InspectorPropertyLayout(), + [&](const UI::PropertyLayoutMetrics& layout) { + UI::AlignPropertyControlVertically(layout, ImGui::GetTextLineHeight()); + ImGui::TextDisabled("%s", valueText.c_str()); + return false; + }); + } + + bool ApplyScriptFieldWrite( + ::XCEngine::Scripting::ScriptComponent& scriptComponent, + const ::XCEngine::Scripting::ScriptFieldSnapshot& field, + const ::XCEngine::Scripting::ScriptFieldValue& value, + IUndoManager* undoManager) const { + std::vector<::XCEngine::Scripting::ScriptFieldWriteResult> results; + if (undoManager) { + undoManager->BeginInteractiveChange("Modify Script Field"); + } + + const bool applied = ::XCEngine::Scripting::ScriptEngine::Get().ApplyScriptFieldWrites( + &scriptComponent, + { ::XCEngine::Scripting::ScriptFieldWriteRequest{field.metadata.name, field.metadata.type, value} }, + results); + + if (!applied || results.empty() || + results.front().status != ::XCEngine::Scripting::ScriptFieldWriteStatus::Applied) { + if (undoManager && undoManager->HasPendingInteractiveChange()) { + undoManager->CancelInteractiveChange(); + } + return false; + } + + return true; + } + + bool ClearScriptFieldOverride( + ::XCEngine::Scripting::ScriptComponent& scriptComponent, + const ::XCEngine::Scripting::ScriptFieldSnapshot& field, + IUndoManager* undoManager) const { + std::vector<::XCEngine::Scripting::ScriptFieldClearResult> results; + if (undoManager) { + undoManager->BeginInteractiveChange("Clear Script Field Override"); + } + + const bool cleared = ::XCEngine::Scripting::ScriptEngine::Get().ClearScriptFieldOverrides( + &scriptComponent, + { ::XCEngine::Scripting::ScriptFieldClearRequest{field.metadata.name} }, + results); + + if (!cleared || results.empty() || + results.front().status != ::XCEngine::Scripting::ScriptFieldClearStatus::Applied) { + if (undoManager && undoManager->HasPendingInteractiveChange()) { + undoManager->CancelInteractiveChange(); + } + return false; + } + + return true; + } + + static void SyncStringFieldEditState(StringFieldEditState& editState, const std::string& value) { + editState.buffer.fill('\0'); + const size_t copyLength = (std::min)(value.size(), editState.buffer.size() - 1); + if (copyLength > 0) { + std::memcpy(editState.buffer.data(), value.data(), copyLength); + } + editState.buffer[copyLength] = '\0'; + editState.lastSyncedValue = value; + editState.initialized = true; + } + + static std::string DescribeScriptFieldValue( + ::XCEngine::Scripting::ScriptFieldType type, + const ::XCEngine::Scripting::ScriptFieldValue& value) { + if (type == ::XCEngine::Scripting::ScriptFieldType::GameObject) { + const auto reference = std::get<::XCEngine::Scripting::GameObjectReference>(value); + if (reference.gameObjectUUID == 0) { + return "None"; + } + + return "GameObject (" + std::to_string(reference.gameObjectUUID) + ")"; + } + + return ::XCEngine::Scripting::SerializeScriptFieldValue(type, value); + } + + std::unordered_map> m_stringFieldStates; +}; + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/ComponentEditors/ScriptComponentEditorUtils.h b/editor/src/ComponentEditors/ScriptComponentEditorUtils.h new file mode 100644 index 00000000..e4f39ea6 --- /dev/null +++ b/editor/src/ComponentEditors/ScriptComponentEditorUtils.h @@ -0,0 +1,125 @@ +#pragma once + +#include "Scripting/EditorScriptRuntimeStatus.h" + +#include +#include +#include +#include + +#include +#include + +namespace XCEngine { +namespace Editor { +namespace ScriptComponentEditorUtils { + +inline std::string BuildScriptClassDisplayName(const ::XCEngine::Scripting::ScriptClassDescriptor& descriptor) { + const std::string fullName = descriptor.GetFullName(); + if (descriptor.assemblyName.empty() || descriptor.assemblyName == "GameScripts") { + return fullName; + } + + return fullName + " (" + descriptor.assemblyName + ")"; +} + +inline std::string BuildScriptClassDisplayName(const ::XCEngine::Scripting::ScriptComponent& component) { + if (!component.HasScriptClass()) { + return "None"; + } + + return BuildScriptClassDisplayName(::XCEngine::Scripting::ScriptClassDescriptor{ + component.GetAssemblyName(), + component.GetNamespaceName(), + component.GetClassName() + }); +} + +inline ::XCEngine::Components::GameObject::ID FindGameObjectIdByUuidRecursive( + ::XCEngine::Components::GameObject* gameObject, + uint64_t uuid) { + if (!gameObject || uuid == 0) { + return ::XCEngine::Components::GameObject::INVALID_ID; + } + + if (gameObject->GetUUID() == uuid) { + return gameObject->GetID(); + } + + for (::XCEngine::Components::GameObject* child : gameObject->GetChildren()) { + const ::XCEngine::Components::GameObject::ID childId = + FindGameObjectIdByUuidRecursive(child, uuid); + if (childId != ::XCEngine::Components::GameObject::INVALID_ID) { + return childId; + } + } + + return ::XCEngine::Components::GameObject::INVALID_ID; +} + +inline ::XCEngine::Components::GameObject::ID FindGameObjectIdByUuid( + const std::vector<::XCEngine::Components::GameObject*>& roots, + uint64_t uuid) { + for (::XCEngine::Components::GameObject* root : roots) { + const ::XCEngine::Components::GameObject::ID gameObjectId = + FindGameObjectIdByUuidRecursive(root, uuid); + if (gameObjectId != ::XCEngine::Components::GameObject::INVALID_ID) { + return gameObjectId; + } + } + + return ::XCEngine::Components::GameObject::INVALID_ID; +} + +inline bool CanEditScriptField( + ::XCEngine::Scripting::ScriptFieldClassStatus classStatus, + const ::XCEngine::Scripting::ScriptFieldSnapshot& field) { + return classStatus != ::XCEngine::Scripting::ScriptFieldClassStatus::Available || field.declaredInClass; +} + +inline bool CanClearScriptFieldOverride(const ::XCEngine::Scripting::ScriptFieldSnapshot& field) { + return field.hasStoredValue || field.valueSource == ::XCEngine::Scripting::ScriptFieldValueSource::ManagedValue; +} + +inline std::string BuildScriptFieldIssueText(const ::XCEngine::Scripting::ScriptFieldSnapshot& field) { + switch (field.issue) { + case ::XCEngine::Scripting::ScriptFieldIssue::StoredOnly: + return "Stored override is not declared by the selected script."; + case ::XCEngine::Scripting::ScriptFieldIssue::TypeMismatch: + return "Stored override type is " + + ::XCEngine::Scripting::ScriptFieldTypeToString(field.storedType) + + ", but the script field expects " + + ::XCEngine::Scripting::ScriptFieldTypeToString(field.metadata.type) + "."; + case ::XCEngine::Scripting::ScriptFieldIssue::None: + default: + return std::string(); + } +} + +inline std::string BuildScriptRuntimeUnavailableHint(const EditorScriptRuntimeStatus& status) { + if (!status.statusMessage.empty()) { + return status.statusMessage; + } + + if (!status.backendEnabled) { + return "This editor build does not include Mono scripting support."; + } + + if (!status.assemblyDirectory.empty()) { + return "No script assemblies are currently loaded from " + status.assemblyDirectory + "."; + } + + return "No script assemblies are currently loaded."; +} + +inline bool CanReloadScriptRuntime(const EditorScriptRuntimeStatus& status) { + return status.backendEnabled && !status.assemblyDirectory.empty(); +} + +inline bool CanRebuildScriptAssemblies(const EditorScriptRuntimeStatus& status) { + return status.backendEnabled && !status.assemblyDirectory.empty(); +} + +} // namespace ScriptComponentEditorUtils +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Core/EditorEvents.h b/editor/src/Core/EditorEvents.h index 597a0d6a..f1658b2d 100644 --- a/editor/src/Core/EditorEvents.h +++ b/editor/src/Core/EditorEvents.h @@ -2,6 +2,11 @@ #include "EditorRuntimeMode.h" +#include +#include + +#include +#include #include #include @@ -67,6 +72,19 @@ struct PlayModeResumeRequestedEvent { struct PlayModeStepRequestedEvent { }; +struct GameViewInputFrameEvent { + static constexpr size_t KeyStateCount = 256u; + static constexpr size_t MouseButtonStateCount = 5u; + + bool hovered = false; + bool focused = false; + Math::Vector2 mousePosition = Math::Vector2::Zero(); + Math::Vector2 mouseDelta = Math::Vector2::Zero(); + float mouseWheel = 0.0f; + std::array keyDown = {}; + std::array mouseButtonDown = {}; +}; + struct EditorModeChangedEvent { EditorRuntimeMode oldMode = EditorRuntimeMode::Edit; EditorRuntimeMode newMode = EditorRuntimeMode::Edit; diff --git a/editor/src/Core/EventBus.h b/editor/src/Core/EventBus.h index 89f7d2a4..0a5ae9bc 100644 --- a/editor/src/Core/EventBus.h +++ b/editor/src/Core/EventBus.h @@ -82,13 +82,20 @@ public: void Publish(const T& event) { static_assert(sizeof(T) > 0, "Event type must be defined"); uint32_t typeId = EventTypeId::Get(); - - std::shared_lock lock(m_mutex); - auto it = m_handlers.find(typeId); - if (it != m_handlers.end()) { - for (const auto& entry : it->second) { - entry.handler(&event); + + std::vector handlers; + { + std::shared_lock lock(m_mutex); + auto it = m_handlers.find(typeId); + if (it == m_handlers.end()) { + return; } + + handlers = it->second; + } + + for (const auto& entry : handlers) { + entry.handler(&event); } } diff --git a/editor/src/Core/IProjectManager.h b/editor/src/Core/IProjectManager.h index 7e192541..b4b63e7c 100644 --- a/editor/src/Core/IProjectManager.h +++ b/editor/src/Core/IProjectManager.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -10,6 +11,13 @@ namespace Editor { class IProjectManager { public: + struct SceneAssetReferenceMigrationReport { + size_t scannedSceneCount = 0; + size_t migratedSceneCount = 0; + size_t unchangedSceneCount = 0; + size_t failedSceneCount = 0; + }; + virtual ~IProjectManager() = default; virtual const std::vector& GetCurrentItems() const = 0; @@ -39,6 +47,7 @@ public: virtual bool DeleteItem(const std::string& fullPath) = 0; virtual bool MoveItem(const std::string& sourceFullPath, const std::string& destFolderFullPath) = 0; virtual bool RenameItem(const std::string& sourceFullPath, const std::string& newName) = 0; + virtual SceneAssetReferenceMigrationReport MigrateSceneAssetReferences() = 0; virtual const std::string& GetProjectPath() const = 0; }; diff --git a/editor/src/Core/PlaySessionController.cpp b/editor/src/Core/PlaySessionController.cpp index 7213a788..4bc97ed0 100644 --- a/editor/src/Core/PlaySessionController.cpp +++ b/editor/src/Core/PlaySessionController.cpp @@ -6,9 +6,25 @@ #include "Core/ISceneManager.h" #include "Core/IUndoManager.h" +#include +#include + namespace XCEngine { namespace Editor { +namespace { + +bool IsModifierKeyDown(const GameViewInputFrameEvent& input, XCEngine::Input::KeyCode key) { + const size_t index = static_cast(key); + return index < input.keyDown.size() && input.keyDown[index]; +} + +bool IsGameViewInputActive(const GameViewInputFrameEvent& input) { + return input.hovered || input.focused; +} + +} // namespace + void PlaySessionController::Attach(IEditorContext& context) { if (m_playStartRequestedHandlerId == 0) { m_playStartRequestedHandlerId = context.GetEventBus().Subscribe( @@ -44,6 +60,14 @@ void PlaySessionController::Attach(IEditorContext& context) { StepPlay(context); }); } + + if (m_gameViewInputFrameHandlerId == 0) { + m_gameViewInputFrameHandlerId = context.GetEventBus().Subscribe( + [this](const GameViewInputFrameEvent& event) { + m_pendingGameViewInput = event; + m_hasPendingGameViewInput = true; + }); + } } void PlaySessionController::Detach(IEditorContext& context) { @@ -73,6 +97,13 @@ void PlaySessionController::Detach(IEditorContext& context) { context.GetEventBus().Unsubscribe(m_playStepRequestedHandlerId); m_playStepRequestedHandlerId = 0; } + + if (m_gameViewInputFrameHandlerId != 0) { + context.GetEventBus().Unsubscribe(m_gameViewInputFrameHandlerId); + m_gameViewInputFrameHandlerId = 0; + } + + ResetRuntimeInputBridge(); } void PlaySessionController::Update(IEditorContext& context, float deltaTime) { @@ -81,6 +112,7 @@ void PlaySessionController::Update(IEditorContext& context, float deltaTime) { return; } + ApplyGameViewInputFrame(deltaTime); m_runtimeLoop.Tick(deltaTime); } @@ -104,6 +136,10 @@ bool PlaySessionController::StartPlay(IEditorContext& context) { } sceneManager.SetSceneDocumentDirtyTrackingEnabled(false); + XCEngine::Scripting::ScriptEngine::Get().SetRuntimeFixedDeltaTime(m_runtimeLoop.GetSettings().fixedDeltaTime); + ResetRuntimeInputBridge(); + XCEngine::Input::InputManager::Get().Shutdown(); + XCEngine::Input::InputManager::Get().Initialize(nullptr); m_runtimeLoop.Start(sceneManager.GetScene()); context.GetUndoManager().ClearHistory(); context.SetRuntimeMode(EditorRuntimeMode::Play); @@ -118,6 +154,8 @@ bool PlaySessionController::StopPlay(IEditorContext& context) { auto& sceneManager = context.GetSceneManager(); m_runtimeLoop.Stop(); + ResetRuntimeInputBridge(); + XCEngine::Input::InputManager::Get().Shutdown(); sceneManager.SetSceneDocumentDirtyTrackingEnabled(true); if (!sceneManager.RestoreSceneSnapshot(m_editorSnapshot)) { @@ -162,5 +200,83 @@ bool PlaySessionController::StepPlay(IEditorContext& context) { return true; } +void PlaySessionController::ResetRuntimeInputBridge() { + m_pendingGameViewInput = {}; + m_appliedGameViewInput = {}; + m_hasPendingGameViewInput = false; +} + +void PlaySessionController::ApplyGameViewInputFrame(float deltaTime) { + using XCEngine::Input::InputManager; + using XCEngine::Input::KeyCode; + using XCEngine::Input::MouseButton; + + InputManager& inputManager = InputManager::Get(); + inputManager.Update(deltaTime); + + const GameViewInputFrameEvent input = m_hasPendingGameViewInput + ? m_pendingGameViewInput + : GameViewInputFrameEvent{}; + m_hasPendingGameViewInput = false; + + const bool inputActive = IsGameViewInputActive(input); + const bool alt = inputActive && + (IsModifierKeyDown(input, KeyCode::LeftAlt) || IsModifierKeyDown(input, KeyCode::RightAlt)); + const bool ctrl = inputActive && + (IsModifierKeyDown(input, KeyCode::LeftCtrl) || IsModifierKeyDown(input, KeyCode::RightCtrl)); + const bool shift = inputActive && + (IsModifierKeyDown(input, KeyCode::LeftShift) || IsModifierKeyDown(input, KeyCode::RightShift)); + + for (size_t index = 0; index < input.keyDown.size(); ++index) { + const bool wasDown = m_appliedGameViewInput.keyDown[index]; + const bool isDown = inputActive && input.keyDown[index]; + if (wasDown == isDown) { + continue; + } + + const KeyCode key = static_cast(index); + if (isDown) { + inputManager.ProcessKeyDown(key, false, alt, ctrl, shift, false); + } else { + inputManager.ProcessKeyUp(key, alt, ctrl, shift, false); + } + } + + for (size_t index = 0; index < input.mouseButtonDown.size(); ++index) { + const bool wasDown = m_appliedGameViewInput.mouseButtonDown[index]; + const bool isDown = inputActive && input.mouseButtonDown[index]; + if (wasDown == isDown) { + continue; + } + + inputManager.ProcessMouseButton( + static_cast(index), + isDown, + static_cast(input.mousePosition.x), + static_cast(input.mousePosition.y)); + } + + if (inputActive && + (input.mousePosition != m_appliedGameViewInput.mousePosition || input.mouseDelta != XCEngine::Math::Vector2::Zero())) { + inputManager.ProcessMouseMove( + static_cast(input.mousePosition.x), + static_cast(input.mousePosition.y), + static_cast(input.mouseDelta.x), + static_cast(input.mouseDelta.y)); + } + + if (inputActive && input.mouseWheel != 0.0f) { + inputManager.ProcessMouseWheel( + input.mouseWheel, + static_cast(input.mousePosition.x), + static_cast(input.mousePosition.y)); + } + + m_appliedGameViewInput = {}; + if (inputActive) { + m_appliedGameViewInput = input; + } +} + } // namespace Editor } // namespace XCEngine diff --git a/editor/src/Core/PlaySessionController.h b/editor/src/Core/PlaySessionController.h index dbf3caf1..b986b7ca 100644 --- a/editor/src/Core/PlaySessionController.h +++ b/editor/src/Core/PlaySessionController.h @@ -3,8 +3,11 @@ #include "EditorRuntimeMode.h" #include "SceneSnapshot.h" +#include "Core/EditorEvents.h" + #include +#include #include namespace XCEngine { @@ -26,12 +29,19 @@ public: bool StepPlay(IEditorContext& context); private: + void ResetRuntimeInputBridge(); + void ApplyGameViewInputFrame(float deltaTime); + uint64_t m_playStartRequestedHandlerId = 0; uint64_t m_playStopRequestedHandlerId = 0; uint64_t m_playPauseRequestedHandlerId = 0; uint64_t m_playResumeRequestedHandlerId = 0; uint64_t m_playStepRequestedHandlerId = 0; + uint64_t m_gameViewInputFrameHandlerId = 0; SceneSnapshot m_editorSnapshot = {}; + GameViewInputFrameEvent m_pendingGameViewInput = {}; + GameViewInputFrameEvent m_appliedGameViewInput = {}; + bool m_hasPendingGameViewInput = false; XCEngine::Components::RuntimeLoop m_runtimeLoop; }; diff --git a/editor/src/Managers/ProjectManager.cpp b/editor/src/Managers/ProjectManager.cpp index f96877a3..22d2da75 100644 --- a/editor/src/Managers/ProjectManager.cpp +++ b/editor/src/Managers/ProjectManager.cpp @@ -1,9 +1,14 @@ #include "ProjectManager.h" +#include +#include +#include + #include #include #include #include #include +#include #include #include #include @@ -212,6 +217,27 @@ bool CanPreviewImageAssetExtension(std::wstring_view extension) { }); } +bool IsSceneAssetFile(const fs::path& path) { + if (!fs::is_regular_file(path)) { + return false; + } + + std::wstring extension = path.extension().wstring(); + std::transform(extension.begin(), extension.end(), extension.begin(), ::towlower); + return extension == L".xc"; +} + +std::string ReadFileText(const fs::path& path) { + std::ifstream input(path, std::ios::binary); + if (!input.is_open()) { + return {}; + } + + std::ostringstream stream; + stream << input.rdbuf(); + return stream.str(); +} + } // namespace const std::vector& ProjectManager::GetCurrentItems() const { @@ -496,6 +522,89 @@ bool ProjectManager::RenameItem(const std::string& sourceFullPath, const std::st } } +IProjectManager::SceneAssetReferenceMigrationReport ProjectManager::MigrateSceneAssetReferences() { + IProjectManager::SceneAssetReferenceMigrationReport report; + if (m_projectPath.empty()) { + return report; + } + + const fs::path assetsPath = fs::path(Utf8PathToWstring(m_projectPath)) / L"Assets"; + if (!fs::exists(assetsPath) || !fs::is_directory(assetsPath)) { + return report; + } + + auto& logger = ::XCEngine::Debug::Logger::Get(); + ::XCEngine::Resources::ResourceManager& resourceManager = ::XCEngine::Resources::ResourceManager::Get(); + resourceManager.Initialize(); + + const std::string previousRoot = resourceManager.GetResourceRoot().CStr(); + const bool restoreResourceRoot = previousRoot != m_projectPath; + if (restoreResourceRoot) { + resourceManager.SetResourceRoot(m_projectPath.c_str()); + } + + try { + for (const fs::directory_entry& entry : fs::recursive_directory_iterator(assetsPath)) { + if (!IsSceneAssetFile(entry.path())) { + continue; + } + + ++report.scannedSceneCount; + const fs::path scenePath = entry.path(); + const std::string scenePathUtf8 = WstringPathToUtf8(scenePath.wstring()); + + try { + const std::string before = ReadFileText(scenePath); + ::XCEngine::Components::Scene scene; + { + ::XCEngine::Resources::ResourceManager::ScopedDeferredSceneLoad deferredLoadScope(resourceManager); + scene.Load(scenePathUtf8); + } + + scene.Save(scenePathUtf8); + const std::string after = ReadFileText(scenePath); + if (after != before) { + ++report.migratedSceneCount; + } else { + ++report.unchangedSceneCount; + } + } catch (const std::exception& exception) { + ++report.failedSceneCount; + logger.Error( + ::XCEngine::Debug::LogCategory::FileSystem, + ("Failed to migrate scene asset references: " + scenePathUtf8 + " - " + exception.what()).c_str()); + } catch (...) { + ++report.failedSceneCount; + logger.Error( + ::XCEngine::Debug::LogCategory::FileSystem, + ("Failed to migrate scene asset references: " + scenePathUtf8 + " - unknown error").c_str()); + } + } + } catch (const std::exception& exception) { + logger.Error( + ::XCEngine::Debug::LogCategory::FileSystem, + ("Scene asset reference migration aborted: " + std::string(exception.what())).c_str()); + } catch (...) { + logger.Error( + ::XCEngine::Debug::LogCategory::FileSystem, + "Scene asset reference migration aborted: unknown error"); + } + + if (restoreResourceRoot) { + resourceManager.SetResourceRoot(previousRoot.c_str()); + } + + logger.Info( + ::XCEngine::Debug::LogCategory::FileSystem, + ("Scene asset reference migration finished. scanned=" + std::to_string(report.scannedSceneCount) + + " migrated=" + std::to_string(report.migratedSceneCount) + + " unchanged=" + std::to_string(report.unchangedSceneCount) + + " failed=" + std::to_string(report.failedSceneCount)).c_str()); + + RefreshCurrentFolder(); + return report; +} + AssetItemPtr ProjectManager::FindCurrentItemByPath(const std::string& fullPath) const { const int index = FindCurrentItemIndex(fullPath); if (index < 0) { diff --git a/editor/src/Managers/ProjectManager.h b/editor/src/Managers/ProjectManager.h index 1602cd08..505013e1 100644 --- a/editor/src/Managers/ProjectManager.h +++ b/editor/src/Managers/ProjectManager.h @@ -38,6 +38,7 @@ public: bool DeleteItem(const std::string& fullPath) override; bool MoveItem(const std::string& sourceFullPath, const std::string& destFolderFullPath) override; bool RenameItem(const std::string& sourceFullPath, const std::string& newName) override; + SceneAssetReferenceMigrationReport MigrateSceneAssetReferences() override; const std::string& GetProjectPath() const override { return m_projectPath; } diff --git a/editor/src/Scripting/EditorScriptAssemblyBuilder.cpp b/editor/src/Scripting/EditorScriptAssemblyBuilder.cpp new file mode 100644 index 00000000..11b38d53 --- /dev/null +++ b/editor/src/Scripting/EditorScriptAssemblyBuilder.cpp @@ -0,0 +1,372 @@ +#include "Scripting/EditorScriptAssemblyBuilder.h" + +#include "Platform/Win32Utf8.h" +#include "Scripting/EditorScriptAssemblyBuilderUtils.h" + +#include + +#include +#include +#include + +#ifndef XCENGINE_EDITOR_REPO_ROOT +#define XCENGINE_EDITOR_REPO_ROOT "" +#endif + +#ifndef XCENGINE_EDITOR_MONO_ROOT_DIR +#define XCENGINE_EDITOR_MONO_ROOT_DIR "" +#endif + +namespace XCEngine { +namespace Editor { +namespace Scripting { + +namespace { + +std::filesystem::path GetFallbackRepositoryRoot() { + std::filesystem::path repoRoot = std::filesystem::path(Platform::Utf8ToWide(Platform::GetExecutableDirectoryUtf8())); + for (int i = 0; i < 3; ++i) { + if (repoRoot.has_parent_path()) { + repoRoot = repoRoot.parent_path(); + } + } + return repoRoot.lexically_normal(); +} + +std::filesystem::path GetRepositoryRoot() { + const std::string configuredRoot = XCENGINE_EDITOR_REPO_ROOT; + if (!configuredRoot.empty()) { + return std::filesystem::path(Platform::Utf8ToWide(configuredRoot)).lexically_normal(); + } + + return GetFallbackRepositoryRoot(); +} + +std::filesystem::path FindBundledMonoRootDirectory(const std::filesystem::path& repositoryRoot) { + std::error_code ec; + if (repositoryRoot.empty() || !std::filesystem::exists(repositoryRoot, ec)) { + return {}; + } + + for (std::filesystem::directory_iterator it(repositoryRoot, ec), end; it != end && !ec; it.increment(ec)) { + if (ec || !it->is_directory(ec)) { + continue; + } + + const std::filesystem::path candidate = + it->path() / "Fermion" / "Fermion" / "external" / "mono"; + if (std::filesystem::exists(candidate / "binary" / "mscorlib.dll", ec)) { + return candidate.lexically_normal(); + } + } + + return {}; +} + +std::filesystem::path GetMonoRootDirectory() { + const std::filesystem::path repositoryRoot = GetRepositoryRoot(); + const std::filesystem::path bundledMonoRoot = FindBundledMonoRootDirectory(repositoryRoot); + if (!bundledMonoRoot.empty()) { + return bundledMonoRoot; + } + + const std::string configuredRoot = XCENGINE_EDITOR_MONO_ROOT_DIR; + if (!configuredRoot.empty()) { + std::error_code ec; + const std::filesystem::path configuredPath = + std::filesystem::path(Platform::Utf8ToWide(configuredRoot)).lexically_normal(); + if (std::filesystem::exists(configuredPath / "binary" / "mscorlib.dll", ec)) { + return configuredPath; + } + } + + return (repositoryRoot / "managed" / "mono").lexically_normal(); +} + +std::wstring QuotePath(const std::filesystem::path& path) { + return L"\"" + path.wstring() + L"\""; +} + +bool FindExecutableOnPath(const wchar_t* executableName, std::filesystem::path& outPath) { + DWORD requiredLength = SearchPathW(nullptr, executableName, nullptr, 0, nullptr, nullptr); + if (requiredLength == 0) { + return false; + } + + std::wstring buffer(requiredLength, L'\0'); + const DWORD resolvedLength = SearchPathW( + nullptr, + executableName, + nullptr, + static_cast(buffer.size()), + buffer.data(), + nullptr); + if (resolvedLength == 0 || resolvedLength >= buffer.size()) { + return false; + } + + buffer.resize(resolvedLength); + outPath = std::filesystem::path(buffer).lexically_normal(); + return true; +} + +bool RunProcessAndCapture( + const std::filesystem::path& executablePath, + const std::wstring& arguments, + const std::filesystem::path& workingDirectory, + DWORD& outExitCode, + std::string& outOutput) { + SECURITY_ATTRIBUTES securityAttributes = {}; + securityAttributes.nLength = sizeof(securityAttributes); + securityAttributes.bInheritHandle = TRUE; + + HANDLE readPipe = nullptr; + HANDLE writePipe = nullptr; + if (!CreatePipe(&readPipe, &writePipe, &securityAttributes, 0)) { + return false; + } + + SetHandleInformation(readPipe, HANDLE_FLAG_INHERIT, 0); + + STARTUPINFOW startupInfo = {}; + startupInfo.cb = sizeof(startupInfo); + startupInfo.dwFlags = STARTF_USESTDHANDLES; + startupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); + startupInfo.hStdOutput = writePipe; + startupInfo.hStdError = writePipe; + + PROCESS_INFORMATION processInfo = {}; + std::wstring commandLine = QuotePath(executablePath) + L" " + arguments; + std::vector commandLineBuffer(commandLine.begin(), commandLine.end()); + commandLineBuffer.push_back(L'\0'); + + const wchar_t* currentDirectory = workingDirectory.empty() ? nullptr : workingDirectory.c_str(); + const BOOL created = CreateProcessW( + nullptr, + commandLineBuffer.data(), + nullptr, + nullptr, + TRUE, + CREATE_NO_WINDOW, + nullptr, + currentDirectory, + &startupInfo, + &processInfo); + + CloseHandle(writePipe); + writePipe = nullptr; + + if (!created) { + CloseHandle(readPipe); + return false; + } + + char buffer[4096] = {}; + DWORD bytesRead = 0; + while (ReadFile(readPipe, buffer, sizeof(buffer), &bytesRead, nullptr) && bytesRead > 0) { + outOutput.append(buffer, bytesRead); + } + + WaitForSingleObject(processInfo.hProcess, INFINITE); + GetExitCodeProcess(processInfo.hProcess, &outExitCode); + + CloseHandle(processInfo.hThread); + CloseHandle(processInfo.hProcess); + CloseHandle(readPipe); + return true; +} + +std::wstring BuildCompilerArguments( + const std::filesystem::path& outputPath, + const std::vector& referencePaths, + const std::vector& sourcePaths) { + std::wstring arguments = L"/nologo /target:library /langversion:latest /nostdlib+ "; + arguments += L"/out:" + QuotePath(outputPath); + + for (const std::filesystem::path& referencePath : referencePaths) { + arguments += L" /reference:" + QuotePath(referencePath); + } + + for (const std::filesystem::path& sourcePath : sourcePaths) { + arguments += L" " + QuotePath(sourcePath); + } + + return arguments; +} + +EditorScriptAssemblyBuildResult BuildFailure(const std::string& message) { + return EditorScriptAssemblyBuildResult{false, message}; +} + +bool RunCSharpCompiler( + const std::filesystem::path& dotnetExecutable, + const std::filesystem::path& cscDllPath, + const std::filesystem::path& workingDirectory, + const std::filesystem::path& outputPath, + const std::vector& referencePaths, + const std::vector& sourcePaths, + std::string& outError) { + std::wstring arguments = QuotePath(cscDllPath); + arguments += L" "; + arguments += BuildCompilerArguments(outputPath, referencePaths, sourcePaths); + + DWORD exitCode = 0; + std::string processOutput; + if (!RunProcessAndCapture(dotnetExecutable, arguments, workingDirectory, exitCode, processOutput)) { + outError = "Failed to launch dotnet to compile managed script assemblies."; + return false; + } + + if (exitCode != 0) { + outError = processOutput.empty() + ? "The C# compiler failed to build managed script assemblies." + : processOutput; + return false; + } + + return true; +} + +} // namespace + +EditorScriptAssemblyBuildResult EditorScriptAssemblyBuilder::RebuildProjectAssemblies(const std::string& projectPath) { + namespace fs = std::filesystem; + + try { + if (projectPath.empty()) { + return BuildFailure("Cannot rebuild script assemblies without a loaded project."); + } + + const fs::path projectRoot = fs::path(Platform::Utf8ToWide(projectPath)).lexically_normal(); + const fs::path repositoryRoot = GetRepositoryRoot(); + const fs::path monoRoot = GetMonoRootDirectory(); + const fs::path managedRoot = repositoryRoot / "managed"; + const fs::path scriptCoreSourceRoot = managedRoot / "XCEngine.ScriptCore"; + const fs::path outputDirectory = projectRoot / "Library" / "ScriptAssemblies"; + const fs::path generatedDirectory = outputDirectory / "Generated"; + const fs::path scriptCoreOutputPath = outputDirectory / "XCEngine.ScriptCore.dll"; + const fs::path gameScriptsOutputPath = outputDirectory / "GameScripts.dll"; + const fs::path corlibOutputPath = outputDirectory / "mscorlib.dll"; + const fs::path monoCorlibSourcePath = monoRoot / "binary" / "mscorlib.dll"; + const fs::path frameworkReferenceDirectory = + L"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2"; + + std::error_code ec; + fs::create_directories(outputDirectory, ec); + if (ec) { + return BuildFailure("Failed to create the project script assembly directory: " + + ScriptBuilderPathToUtf8(outputDirectory)); + } + + fs::path dotnetExecutable; + if (!FindExecutableOnPath(L"dotnet.exe", dotnetExecutable)) { + return BuildFailure("dotnet.exe was not found on PATH."); + } + + std::string sdkListOutput; + DWORD sdkListExitCode = 0; + if (!RunProcessAndCapture(dotnetExecutable, L"--list-sdks", projectRoot, sdkListExitCode, sdkListOutput) || + sdkListExitCode != 0) { + return BuildFailure("Failed to query installed .NET SDKs with dotnet --list-sdks."); + } + + const std::string sdkVersion = ParseLatestDotnetSdkVersion(sdkListOutput); + if (sdkVersion.empty()) { + return BuildFailure("Failed to resolve a usable .NET SDK version from dotnet --list-sdks."); + } + + const fs::path cscDllPath = + fs::path(L"C:\\Program Files\\dotnet\\sdk") / + fs::path(Platform::Utf8ToWide(sdkVersion)) / + "Roslyn" / + "bincore" / + "csc.dll"; + if (!fs::exists(cscDllPath, ec)) { + return BuildFailure("Roslyn csc.dll was not found: " + ScriptBuilderPathToUtf8(cscDllPath)); + } + + const std::vector frameworkReferences = { + frameworkReferenceDirectory / "mscorlib.dll", + frameworkReferenceDirectory / "System.dll", + frameworkReferenceDirectory / "System.Core.dll" + }; + for (const fs::path& referencePath : frameworkReferences) { + if (!fs::exists(referencePath, ec)) { + return BuildFailure("Required .NET Framework reference is missing: " + + ScriptBuilderPathToUtf8(referencePath)); + } + } + + if (!fs::exists(monoCorlibSourcePath, ec)) { + return BuildFailure("Mono corlib was not found: " + ScriptBuilderPathToUtf8(monoCorlibSourcePath)); + } + + std::vector scriptCoreSources = CollectCSharpSourceFiles(scriptCoreSourceRoot); + if (scriptCoreSources.empty()) { + return BuildFailure("No ScriptCore C# source files were found under: " + + ScriptBuilderPathToUtf8(scriptCoreSourceRoot)); + } + + std::vector projectScriptSources = CollectCSharpSourceFiles(projectRoot / "Assets"); + std::string placeholderError; + if (!EnsurePlaceholderProjectScriptSource( + projectScriptSources, + generatedDirectory / "EmptyProjectGameScripts.cs", + placeholderError)) { + return BuildFailure(placeholderError); + } + + std::string compileError; + if (!RunCSharpCompiler( + dotnetExecutable, + cscDllPath, + projectRoot, + scriptCoreOutputPath, + frameworkReferences, + scriptCoreSources, + compileError)) { + return BuildFailure("Failed to build XCEngine.ScriptCore.dll: " + compileError); + } + + // Mono can keep the project-local corlib mapped for the lifetime of the process. + // Once it exists in the output folder, reuse it across incremental rebuilds. + ec.clear(); + const bool hasProjectCorlib = fs::exists(corlibOutputPath, ec); + if (ec) { + return BuildFailure("Failed to inspect the project script assembly corlib path."); + } + + if (!hasProjectCorlib) { + fs::copy_file(monoCorlibSourcePath, corlibOutputPath, fs::copy_options::overwrite_existing, ec); + if (ec) { + return BuildFailure("Failed to copy mscorlib.dll into the project script assembly directory."); + } + } + + std::vector gameScriptReferences = frameworkReferences; + gameScriptReferences.push_back(scriptCoreOutputPath); + if (!RunCSharpCompiler( + dotnetExecutable, + cscDllPath, + projectRoot, + gameScriptsOutputPath, + gameScriptReferences, + projectScriptSources, + compileError)) { + return BuildFailure("Failed to build GameScripts.dll: " + compileError); + } + + return EditorScriptAssemblyBuildResult{ + true, + "Rebuilt script assemblies in " + ScriptBuilderPathToUtf8(outputDirectory) + }; + } catch (const std::exception& exception) { + return BuildFailure("Script assembly rebuild threw an exception: " + std::string(exception.what())); + } catch (...) { + return BuildFailure("Script assembly rebuild threw an unknown exception."); + } +} + +} // namespace Scripting +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Scripting/EditorScriptAssemblyBuilder.h b/editor/src/Scripting/EditorScriptAssemblyBuilder.h new file mode 100644 index 00000000..4398e91b --- /dev/null +++ b/editor/src/Scripting/EditorScriptAssemblyBuilder.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +namespace XCEngine { +namespace Editor { +namespace Scripting { + +struct EditorScriptAssemblyBuildResult { + bool succeeded = false; + std::string message; +}; + +class EditorScriptAssemblyBuilder { +public: + static EditorScriptAssemblyBuildResult RebuildProjectAssemblies(const std::string& projectPath); +}; + +} // namespace Scripting +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Scripting/EditorScriptAssemblyBuilderUtils.h b/editor/src/Scripting/EditorScriptAssemblyBuilderUtils.h new file mode 100644 index 00000000..557ba483 --- /dev/null +++ b/editor/src/Scripting/EditorScriptAssemblyBuilderUtils.h @@ -0,0 +1,106 @@ +#pragma once + +#include "Platform/Win32Utf8.h" + +#include +#include +#include +#include +#include + +namespace XCEngine { +namespace Editor { +namespace Scripting { + +inline std::string ScriptBuilderPathToUtf8(const std::filesystem::path& path) { + return Platform::WideToUtf8(path.wstring()); +} + +inline std::vector CollectCSharpSourceFiles(const std::filesystem::path& root) { + std::vector sourceFiles; + std::error_code ec; + if (root.empty() || !std::filesystem::exists(root, ec)) { + return sourceFiles; + } + + for (std::filesystem::recursive_directory_iterator it(root, ec), end; it != end && !ec; it.increment(ec)) { + if (ec || !it->is_regular_file(ec)) { + continue; + } + + const std::filesystem::path path = it->path(); + if (path.extension() == ".cs") { + sourceFiles.push_back(path.lexically_normal()); + } + } + + std::sort(sourceFiles.begin(), sourceFiles.end()); + return sourceFiles; +} + +inline std::string ParseLatestDotnetSdkVersion(const std::string& sdkListOutput) { + std::string latestVersion; + size_t lineStart = 0; + while (lineStart < sdkListOutput.size()) { + const size_t lineEnd = sdkListOutput.find_first_of("\r\n", lineStart); + const std::string line = sdkListOutput.substr( + lineStart, + lineEnd == std::string::npos ? std::string::npos : lineEnd - lineStart); + const size_t delimiter = line.find(" ["); + if (delimiter != std::string::npos) { + latestVersion = line.substr(0, delimiter); + } + + if (lineEnd == std::string::npos) { + break; + } + + lineStart = lineEnd + 1; + if (lineStart < sdkListOutput.size() && + sdkListOutput[lineEnd] == '\r' && + sdkListOutput[lineStart] == '\n') { + ++lineStart; + } + } + + return latestVersion; +} + +inline bool EnsurePlaceholderProjectScriptSource( + std::vector& ioSourceFiles, + const std::filesystem::path& placeholderPath, + std::string& outError) { + if (!ioSourceFiles.empty()) { + return true; + } + + std::error_code ec; + std::filesystem::create_directories(placeholderPath.parent_path(), ec); + if (ec) { + outError = "Failed to create the placeholder script directory: " + + ScriptBuilderPathToUtf8(placeholderPath.parent_path()); + return false; + } + + std::ofstream output(placeholderPath, std::ios::out | std::ios::trunc); + if (!output.is_open()) { + outError = "Failed to create the placeholder project script source: " + + ScriptBuilderPathToUtf8(placeholderPath); + return false; + } + + output << "namespace XCEngine.Generated { public static class EmptyProjectGameScriptsMarker {} }\n"; + output.close(); + if (!output.good()) { + outError = "Failed to write the placeholder project script source: " + + ScriptBuilderPathToUtf8(placeholderPath); + return false; + } + + ioSourceFiles.push_back(placeholderPath.lexically_normal()); + return true; +} + +} // namespace Scripting +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Scripting/EditorScriptRuntimeStatus.h b/editor/src/Scripting/EditorScriptRuntimeStatus.h new file mode 100644 index 00000000..39152903 --- /dev/null +++ b/editor/src/Scripting/EditorScriptRuntimeStatus.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace XCEngine { +namespace Editor { + +struct EditorScriptRuntimeStatus { + bool backendEnabled = false; + bool assembliesFound = false; + bool runtimeLoaded = false; + std::string assemblyDirectory; + std::string statusMessage; +}; + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/UI/Widgets.h b/editor/src/UI/Widgets.h index dcb5c903..77c79125 100644 --- a/editor/src/UI/Widgets.h +++ b/editor/src/UI/Widgets.h @@ -47,6 +47,20 @@ struct AssetTileOptions { bool drawLabel = true; }; +inline ImVec2 ComputeAssetTileSize( + const char* label, + const AssetTileOptions& options = AssetTileOptions()) { + const ImVec2 textSize = ImGui::CalcTextSize(label ? label : ""); + ImVec2 tileSize = options.size; + tileSize.x = std::max(tileSize.x, options.iconSize.x + AssetTileTextPadding().x * 2.0f); + tileSize.y = std::max( + tileSize.y, + options.iconOffset.y + + options.iconSize.y + + (options.drawLabel ? AssetTileIconTextGap() + textSize.y + AssetTileTextPadding().y : 0.0f)); + return tileSize; +} + enum class DialogActionResult { None, Primary, @@ -428,16 +442,8 @@ inline AssetTileResult DrawAssetTile( bool dimmed, DrawIconFn&& drawIcon, const AssetTileOptions& options = AssetTileOptions()) { - const ImVec2 textSize = ImGui::CalcTextSize(label); - ImVec2 tileSize = options.size; - tileSize.x = std::max(tileSize.x, options.iconSize.x + AssetTileTextPadding().x * 2.0f); - tileSize.y = std::max( - tileSize.y, - options.iconOffset.y + - options.iconSize.y + - AssetTileIconTextGap() + - textSize.y + - AssetTileTextPadding().y); + const ImVec2 textSize = ImGui::CalcTextSize(label ? label : ""); + const ImVec2 tileSize = ComputeAssetTileSize(label, options); ImGui::InvisibleButton("##AssetBtn", tileSize); const bool clicked = ImGui::IsItemClicked(ImGuiMouseButton_Left); @@ -470,13 +476,13 @@ inline AssetTileResult DrawAssetTile( drawIcon(drawList, iconMin, iconMax); const ImVec2 textPadding = AssetTileTextPadding(); - const float labelHeight = ImGui::GetFrameHeight(); + const float labelHeight = (std::max)(ImGui::GetFrameHeight(), textSize.y); const ImVec2 labelMin(min.x + textPadding.x, max.y - labelHeight - textPadding.y * 0.5f); const ImVec2 labelMax(max.x - textPadding.x, labelMin.y + labelHeight); if (options.drawLabel) { const float textAreaWidth = labelMax.x - labelMin.x; const float centeredTextX = labelMin.x + std::max(0.0f, (textAreaWidth - textSize.x) * 0.5f); - const float textY = labelMin.y + (labelHeight - textSize.y) * 0.5f; + const float textY = labelMin.y + (std::max)(0.0f, (labelHeight - textSize.y) * 0.5f); ImGui::PushClipRect(labelMin, labelMax, true); drawList->AddText(ImVec2(centeredTextX, textY), ImGui::GetColorU32(AssetTileTextColor(selected)), label); ImGui::PopClipRect(); diff --git a/editor/src/Viewport/IViewportHostService.h b/editor/src/Viewport/IViewportHostService.h index ab427402..2b884a44 100644 --- a/editor/src/Viewport/IViewportHostService.h +++ b/editor/src/Viewport/IViewportHostService.h @@ -15,6 +15,8 @@ struct RenderContext; namespace Editor { class IEditorContext; +struct SceneViewportOverlayFrameData; +struct SceneViewportTransformGizmoHandleBuildInputs; enum class EditorViewportKind { Scene, @@ -83,6 +85,14 @@ public: const ImVec2& viewportMousePosition) = 0; virtual void AlignSceneViewToOrientationAxis(SceneViewportOrientationAxis axis) = 0; virtual SceneViewportOverlayData GetSceneViewOverlayData() const = 0; + virtual const SceneViewportOverlayFrameData& GetSceneViewEditorOverlayFrameData(IEditorContext& context) = 0; + virtual const SceneViewportOverlayFrameData& GetSceneViewInteractionOverlayFrameData( + IEditorContext& context, + const SceneViewportOverlayData& overlay, + const SceneViewportTransformGizmoHandleBuildInputs& inputs) = 0; + virtual void SetSceneViewTransientTransformGizmoOverlayData( + const SceneViewportOverlayData& overlay, + const SceneViewportTransformGizmoHandleBuildInputs& inputs) = 0; virtual void RenderRequestedViewports( IEditorContext& context, const Rendering::RenderContext& renderContext) = 0; diff --git a/editor/src/Viewport/Passes/SceneViewportEditorOverlayPass.cpp b/editor/src/Viewport/Passes/SceneViewportEditorOverlayPass.cpp new file mode 100644 index 00000000..a6fd2465 --- /dev/null +++ b/editor/src/Viewport/Passes/SceneViewportEditorOverlayPass.cpp @@ -0,0 +1,1255 @@ +#include "Passes/SceneViewportEditorOverlayPass.h" + +#include "Platform/Win32Utf8.h" +#include "Viewport/SceneViewportMath.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace XCEngine { +namespace Editor { + +namespace { + +constexpr size_t kOverlaySpriteTextureCount = 2u; +constexpr uint64_t kMinDynamicVertexBufferBytes = 4096u; + +const char kSceneViewportEditorOverlayLineHlsl[] = R"( +cbuffer OverlayConstants : register(b0) { + float4x4 gViewProjectionMatrix; + float4 gViewportSizeAndInvSize; +}; + +struct VSInput { + float3 position : POSITION; + float4 color : COLOR0; +}; + +struct VSOutput { + float4 position : SV_POSITION; + float4 color : COLOR0; +}; + +VSOutput MainVS(VSInput input) { + VSOutput output; + output.position = mul(gViewProjectionMatrix, float4(input.position, 1.0)); + output.color = input.color; + return output; +} + +float4 MainPS(VSOutput input) : SV_TARGET0 { + return input.color; +} +)"; + +const char kSceneViewportEditorOverlayScreenTriangleHlsl[] = R"( +cbuffer OverlayConstants : register(b0) { + float4x4 gViewProjectionMatrix; + float4 gViewportSizeAndInvSize; +}; + +struct VSInput { + float2 screenPosition : POSITION; + float4 color : COLOR0; +}; + +struct VSOutput { + float4 position : SV_POSITION; + float4 color : COLOR0; +}; + +VSOutput MainVS(VSInput input) { + VSOutput output; + float2 ndc = float2( + input.screenPosition.x * gViewportSizeAndInvSize.z * 2.0 - 1.0, + 1.0 - input.screenPosition.y * gViewportSizeAndInvSize.w * 2.0); + output.position = float4(ndc, 0.0, 1.0); + output.color = input.color; + return output; +} + +float4 MainPS(VSOutput input) : SV_TARGET0 { + return input.color; +} +)"; + +const char kSceneViewportEditorOverlaySpriteHlsl[] = R"( +cbuffer OverlayConstants : register(b0) { + float4x4 gViewProjectionMatrix; + float4 gViewportSizeAndInvSize; +}; + +Texture2D gIconTexture : register(t0); +SamplerState gIconSampler : register(s0); + +struct VSInput { + float3 worldCenter : POSITION; + float2 corner : TEXCOORD0; + float2 uv : TEXCOORD1; + float2 halfSizePixels : TEXCOORD2; + float4 color : COLOR0; +}; + +struct VSOutput { + float4 position : SV_POSITION; + float2 uv : TEXCOORD0; + float4 color : COLOR0; +}; + +VSOutput MainVS(VSInput input) { + VSOutput output; + float4 clip = mul(gViewProjectionMatrix, float4(input.worldCenter, 1.0)); + float2 offsetNdc = float2( + input.corner.x * input.halfSizePixels.x * gViewportSizeAndInvSize.z * 2.0, + input.corner.y * input.halfSizePixels.y * gViewportSizeAndInvSize.w * 2.0); + clip.xy += offsetNdc * clip.w; + output.position = clip; + output.uv = input.uv; + output.color = input.color; + return output; +} + +float4 MainPS(VSOutput input) : SV_TARGET0 { + float4 sampled = gIconTexture.Sample(gIconSampler, input.uv); + float4 color = sampled * input.color; + if (color.a <= 0.001) { + discard; + } + return color; +} +)"; + +struct OverlayConstants { + Math::Matrix4x4 viewProjection = Math::Matrix4x4::Identity(); + Math::Vector4 viewportSizeAndInvSize = Math::Vector4::Zero(); +}; + +struct OverlayLineVertex { + Math::Vector3 position = Math::Vector3::Zero(); + Math::Color color = Math::Color::White(); +}; + +struct OverlayScreenTriangleVertex { + Math::Vector2 screenPosition = Math::Vector2::Zero(); + Math::Color color = Math::Color::White(); +}; + +struct OverlaySpriteVertex { + Math::Vector3 worldCenter = Math::Vector3::Zero(); + Math::Vector2 corner = Math::Vector2::Zero(); + Math::Vector2 uv = Math::Vector2::Zero(); + Math::Vector2 halfSizePixels = Math::Vector2::Zero(); + Math::Color color = Math::Color::White(); +}; + +struct OverlaySpriteBatchRange { + uint32_t firstVertex = 0; + uint32_t vertexCount = 0; + + bool HasVertices() const { + return vertexCount > 0u; + } +}; + +class SceneViewportEditorOverlayPass final : public Rendering::RenderPass { +public: + SceneViewportEditorOverlayPass( + SceneViewportEditorOverlayPassRenderer& renderer, + SceneViewportOverlayFrameData frameData) + : m_renderer(renderer) + , m_frameData(std::move(frameData)) { + } + + const char* GetName() const override { + return "SceneViewportEditorOverlay"; + } + + bool Execute(const Rendering::RenderPassContext& context) override { + return m_renderer.Render(context.renderContext, context.surface, m_frameData); + } + +private: + SceneViewportEditorOverlayPassRenderer& m_renderer; + SceneViewportOverlayFrameData m_frameData = {}; +}; + +size_t ToSpriteTextureIndex(SceneViewportOverlaySpriteTextureKind textureKind) { + switch (textureKind) { + case SceneViewportOverlaySpriteTextureKind::Camera: + return 0u; + case SceneViewportOverlaySpriteTextureKind::Light: + return 1u; + default: + return 0u; + } +} + +const char* GetSpriteTextureBaseName(SceneViewportOverlaySpriteTextureKind textureKind) { + switch (textureKind) { + case SceneViewportOverlaySpriteTextureKind::Camera: + return "camera_gizmo"; + case SceneViewportOverlaySpriteTextureKind::Light: + return "main_light_gizmo"; + default: + return ""; + } +} + +std::filesystem::path ResolveOverlaySpriteTexturePath(SceneViewportOverlaySpriteTextureKind textureKind) { + const std::filesystem::path exeDir( + Platform::Utf8ToWide(Platform::GetExecutableDirectoryUtf8())); + std::filesystem::path iconPath = + exeDir / L".." / L".." / L"resources" / L"Icons" / + std::filesystem::path(Platform::Utf8ToWide(GetSpriteTextureBaseName(textureKind))); + iconPath += L".png"; + return iconPath.lexically_normal(); +} + +bool ReadFileBytes(const std::filesystem::path& filePath, std::vector& outBytes) { + std::ifstream input(filePath, std::ios::binary | std::ios::ate); + if (!input.is_open()) { + return false; + } + + const std::ifstream::pos_type size = input.tellg(); + if (size <= 0) { + return false; + } + + outBytes.resize(static_cast(size)); + input.seekg(0, std::ios::beg); + return input.read(reinterpret_cast(outBytes.data()), size).good(); +} + +bool DecodeTextureFile( + const std::filesystem::path& filePath, + std::vector& outPixels, + int& outWidth, + int& outHeight) { + std::vector fileData = {}; + if (!ReadFileBytes(filePath, fileData)) { + return false; + } + + int channels = 0; + stbi_uc* pixels = stbi_load_from_memory( + fileData.data(), + static_cast(fileData.size()), + &outWidth, + &outHeight, + &channels, + STBI_rgb_alpha); + if (pixels == nullptr || outWidth <= 0 || outHeight <= 0) { + if (pixels != nullptr) { + stbi_image_free(pixels); + } + return false; + } + + outPixels.assign( + pixels, + pixels + static_cast(outWidth) * static_cast(outHeight) * 4u); + stbi_image_free(pixels); + return true; +} + +RHI::GraphicsPipelineDesc BuildLinePipelineDesc( + RHI::RHIPipelineLayout* pipelineLayout, + bool depthTestEnabled) { + RHI::GraphicsPipelineDesc pipelineDesc = {}; + pipelineDesc.pipelineLayout = pipelineLayout; + pipelineDesc.topologyType = static_cast(RHI::PrimitiveTopologyType::Line); + pipelineDesc.renderTargetCount = 1; + pipelineDesc.renderTargetFormats[0] = static_cast(RHI::Format::R8G8B8A8_UNorm); + pipelineDesc.depthStencilFormat = static_cast(RHI::Format::D24_UNorm_S8_UInt); + pipelineDesc.sampleCount = 1; + + pipelineDesc.inputLayout.elements = { + { "POSITION", 0, static_cast(RHI::Format::R32G32B32_Float), 0, 0, 0, 0 }, + { "COLOR", 0, static_cast(RHI::Format::R32G32B32A32_Float), 0, 12, 0, 0 } + }; + + pipelineDesc.rasterizerState.fillMode = static_cast(RHI::FillMode::Solid); + pipelineDesc.rasterizerState.cullMode = static_cast(RHI::CullMode::None); + pipelineDesc.rasterizerState.frontFace = static_cast(RHI::FrontFace::CounterClockwise); + pipelineDesc.rasterizerState.depthClipEnable = true; + + pipelineDesc.blendState.blendEnable = true; + pipelineDesc.blendState.srcBlend = static_cast(RHI::BlendFactor::SrcAlpha); + pipelineDesc.blendState.dstBlend = static_cast(RHI::BlendFactor::InvSrcAlpha); + pipelineDesc.blendState.srcBlendAlpha = static_cast(RHI::BlendFactor::One); + pipelineDesc.blendState.dstBlendAlpha = static_cast(RHI::BlendFactor::InvSrcAlpha); + pipelineDesc.blendState.blendOp = static_cast(RHI::BlendOp::Add); + pipelineDesc.blendState.blendOpAlpha = static_cast(RHI::BlendOp::Add); + pipelineDesc.blendState.colorWriteMask = 0xF; + + pipelineDesc.depthStencilState.depthTestEnable = depthTestEnabled; + pipelineDesc.depthStencilState.depthWriteEnable = false; + pipelineDesc.depthStencilState.depthFunc = static_cast(RHI::ComparisonFunc::LessEqual); + + pipelineDesc.vertexShader.source.assign( + kSceneViewportEditorOverlayLineHlsl, + kSceneViewportEditorOverlayLineHlsl + std::strlen(kSceneViewportEditorOverlayLineHlsl)); + pipelineDesc.vertexShader.sourceLanguage = RHI::ShaderLanguage::HLSL; + pipelineDesc.vertexShader.entryPoint = L"MainVS"; + pipelineDesc.vertexShader.profile = L"vs_5_0"; + + pipelineDesc.fragmentShader.source.assign( + kSceneViewportEditorOverlayLineHlsl, + kSceneViewportEditorOverlayLineHlsl + std::strlen(kSceneViewportEditorOverlayLineHlsl)); + pipelineDesc.fragmentShader.sourceLanguage = RHI::ShaderLanguage::HLSL; + pipelineDesc.fragmentShader.entryPoint = L"MainPS"; + pipelineDesc.fragmentShader.profile = L"ps_5_0"; + + return pipelineDesc; +} + +RHI::GraphicsPipelineDesc BuildSpritePipelineDesc( + RHI::RHIPipelineLayout* pipelineLayout, + bool depthTestEnabled) { + RHI::GraphicsPipelineDesc pipelineDesc = {}; + pipelineDesc.pipelineLayout = pipelineLayout; + pipelineDesc.topologyType = static_cast(RHI::PrimitiveTopologyType::Triangle); + pipelineDesc.renderTargetCount = 1; + pipelineDesc.renderTargetFormats[0] = static_cast(RHI::Format::R8G8B8A8_UNorm); + pipelineDesc.depthStencilFormat = static_cast(RHI::Format::D24_UNorm_S8_UInt); + pipelineDesc.sampleCount = 1; + + pipelineDesc.inputLayout.elements = { + { "POSITION", 0, static_cast(RHI::Format::R32G32B32_Float), 0, 0, 0, 0 }, + { "TEXCOORD", 0, static_cast(RHI::Format::R32G32_Float), 0, 12, 0, 0 }, + { "TEXCOORD", 1, static_cast(RHI::Format::R32G32_Float), 0, 20, 0, 0 }, + { "TEXCOORD", 2, static_cast(RHI::Format::R32G32_Float), 0, 28, 0, 0 }, + { "COLOR", 0, static_cast(RHI::Format::R32G32B32A32_Float), 0, 36, 0, 0 } + }; + + pipelineDesc.rasterizerState.fillMode = static_cast(RHI::FillMode::Solid); + pipelineDesc.rasterizerState.cullMode = static_cast(RHI::CullMode::None); + pipelineDesc.rasterizerState.frontFace = static_cast(RHI::FrontFace::CounterClockwise); + pipelineDesc.rasterizerState.depthClipEnable = true; + + pipelineDesc.blendState.blendEnable = true; + pipelineDesc.blendState.srcBlend = static_cast(RHI::BlendFactor::SrcAlpha); + pipelineDesc.blendState.dstBlend = static_cast(RHI::BlendFactor::InvSrcAlpha); + pipelineDesc.blendState.srcBlendAlpha = static_cast(RHI::BlendFactor::One); + pipelineDesc.blendState.dstBlendAlpha = static_cast(RHI::BlendFactor::InvSrcAlpha); + pipelineDesc.blendState.blendOp = static_cast(RHI::BlendOp::Add); + pipelineDesc.blendState.blendOpAlpha = static_cast(RHI::BlendOp::Add); + pipelineDesc.blendState.colorWriteMask = 0xF; + + pipelineDesc.depthStencilState.depthTestEnable = depthTestEnabled; + pipelineDesc.depthStencilState.depthWriteEnable = false; + pipelineDesc.depthStencilState.depthFunc = static_cast(RHI::ComparisonFunc::LessEqual); + + pipelineDesc.vertexShader.source.assign( + kSceneViewportEditorOverlaySpriteHlsl, + kSceneViewportEditorOverlaySpriteHlsl + std::strlen(kSceneViewportEditorOverlaySpriteHlsl)); + pipelineDesc.vertexShader.sourceLanguage = RHI::ShaderLanguage::HLSL; + pipelineDesc.vertexShader.entryPoint = L"MainVS"; + pipelineDesc.vertexShader.profile = L"vs_5_0"; + + pipelineDesc.fragmentShader.source.assign( + kSceneViewportEditorOverlaySpriteHlsl, + kSceneViewportEditorOverlaySpriteHlsl + std::strlen(kSceneViewportEditorOverlaySpriteHlsl)); + pipelineDesc.fragmentShader.sourceLanguage = RHI::ShaderLanguage::HLSL; + pipelineDesc.fragmentShader.entryPoint = L"MainPS"; + pipelineDesc.fragmentShader.profile = L"ps_5_0"; + + return pipelineDesc; +} + +RHI::GraphicsPipelineDesc BuildScreenTrianglePipelineDesc( + RHI::RHIPipelineLayout* pipelineLayout, + bool depthTestEnabled) { + RHI::GraphicsPipelineDesc pipelineDesc = {}; + pipelineDesc.pipelineLayout = pipelineLayout; + pipelineDesc.topologyType = static_cast(RHI::PrimitiveTopologyType::Triangle); + pipelineDesc.renderTargetCount = 1; + pipelineDesc.renderTargetFormats[0] = static_cast(RHI::Format::R8G8B8A8_UNorm); + pipelineDesc.depthStencilFormat = static_cast(RHI::Format::D24_UNorm_S8_UInt); + pipelineDesc.sampleCount = 1; + + pipelineDesc.inputLayout.elements = { + { "POSITION", 0, static_cast(RHI::Format::R32G32_Float), 0, 0, 0, 0 }, + { "COLOR", 0, static_cast(RHI::Format::R32G32B32A32_Float), 0, 8, 0, 0 } + }; + + pipelineDesc.rasterizerState.fillMode = static_cast(RHI::FillMode::Solid); + pipelineDesc.rasterizerState.cullMode = static_cast(RHI::CullMode::None); + pipelineDesc.rasterizerState.frontFace = static_cast(RHI::FrontFace::CounterClockwise); + pipelineDesc.rasterizerState.depthClipEnable = true; + + pipelineDesc.blendState.blendEnable = true; + pipelineDesc.blendState.srcBlend = static_cast(RHI::BlendFactor::SrcAlpha); + pipelineDesc.blendState.dstBlend = static_cast(RHI::BlendFactor::InvSrcAlpha); + pipelineDesc.blendState.srcBlendAlpha = static_cast(RHI::BlendFactor::One); + pipelineDesc.blendState.dstBlendAlpha = static_cast(RHI::BlendFactor::InvSrcAlpha); + pipelineDesc.blendState.blendOp = static_cast(RHI::BlendOp::Add); + pipelineDesc.blendState.blendOpAlpha = static_cast(RHI::BlendOp::Add); + pipelineDesc.blendState.colorWriteMask = 0xF; + + pipelineDesc.depthStencilState.depthTestEnable = depthTestEnabled; + pipelineDesc.depthStencilState.depthWriteEnable = false; + pipelineDesc.depthStencilState.depthFunc = static_cast(RHI::ComparisonFunc::LessEqual); + + pipelineDesc.vertexShader.source.assign( + kSceneViewportEditorOverlayScreenTriangleHlsl, + kSceneViewportEditorOverlayScreenTriangleHlsl + std::strlen(kSceneViewportEditorOverlayScreenTriangleHlsl)); + pipelineDesc.vertexShader.sourceLanguage = RHI::ShaderLanguage::HLSL; + pipelineDesc.vertexShader.entryPoint = L"MainVS"; + pipelineDesc.vertexShader.profile = L"vs_5_0"; + + pipelineDesc.fragmentShader.source.assign( + kSceneViewportEditorOverlayScreenTriangleHlsl, + kSceneViewportEditorOverlayScreenTriangleHlsl + std::strlen(kSceneViewportEditorOverlayScreenTriangleHlsl)); + pipelineDesc.fragmentShader.sourceLanguage = RHI::ShaderLanguage::HLSL; + pipelineDesc.fragmentShader.entryPoint = L"MainPS"; + pipelineDesc.fragmentShader.profile = L"ps_5_0"; + + return pipelineDesc; +} + +void AppendSpriteVertices( + std::vector& outVertices, + const SceneViewportOverlaySpritePrimitive& sprite) { + const Math::Vector2 halfSizePixels = sprite.sizePixels * 0.5f; + const OverlaySpriteVertex quadVertices[4] = { + { sprite.worldPosition, Math::Vector2(-1.0f, 1.0f), Math::Vector2(0.0f, 0.0f), halfSizePixels, sprite.tintColor }, + { sprite.worldPosition, Math::Vector2(1.0f, 1.0f), Math::Vector2(1.0f, 0.0f), halfSizePixels, sprite.tintColor }, + { sprite.worldPosition, Math::Vector2(1.0f, -1.0f), Math::Vector2(1.0f, 1.0f), halfSizePixels, sprite.tintColor }, + { sprite.worldPosition, Math::Vector2(-1.0f, -1.0f), Math::Vector2(0.0f, 1.0f), halfSizePixels, sprite.tintColor } + }; + + outVertices.push_back(quadVertices[0]); + outVertices.push_back(quadVertices[1]); + outVertices.push_back(quadVertices[2]); + outVertices.push_back(quadVertices[0]); + outVertices.push_back(quadVertices[2]); + outVertices.push_back(quadVertices[3]); +} + +void AppendScreenTriangleVertices( + std::vector& outVertices, + const SceneViewportOverlayScreenTrianglePrimitive& triangle) { + outVertices.push_back({ triangle.vertices[0].screenPosition, triangle.vertices[0].color }); + outVertices.push_back({ triangle.vertices[1].screenPosition, triangle.vertices[1].color }); + outVertices.push_back({ triangle.vertices[2].screenPosition, triangle.vertices[2].color }); +} + +} // namespace + +void SceneViewportEditorOverlayPassRenderer::Shutdown() { + DestroyResources(); +} + +bool SceneViewportEditorOverlayPassRenderer::Render( + const Rendering::RenderContext& renderContext, + const Rendering::RenderSurface& surface, + const SceneViewportOverlayFrameData& frameData) { + if (!frameData.HasOverlayPrimitives() || !renderContext.IsValid() || renderContext.commandList == nullptr) { + return true; + } + + if (!EnsureInitialized(renderContext)) { + return false; + } + + std::vector depthTestedLineVertices = {}; + std::vector alwaysOnTopLineVertices = {}; + depthTestedLineVertices.reserve(frameData.worldLines.size() * 2u); + alwaysOnTopLineVertices.reserve(frameData.worldLines.size() * 2u); + for (const SceneViewportOverlayLinePrimitive& line : frameData.worldLines) { + std::vector& targetVertices = + line.depthMode == SceneViewportOverlayDepthMode::DepthTested + ? depthTestedLineVertices + : alwaysOnTopLineVertices; + targetVertices.push_back({ line.startWorld, line.color }); + targetVertices.push_back({ line.endWorld, line.color }); + } + + std::vector depthTestedScreenTriangleVertices = {}; + std::vector alwaysOnTopScreenTriangleVertices = {}; + depthTestedScreenTriangleVertices.reserve(frameData.screenTriangles.size() * 3u); + alwaysOnTopScreenTriangleVertices.reserve(frameData.screenTriangles.size() * 3u); + for (const SceneViewportOverlayScreenTrianglePrimitive& triangle : frameData.screenTriangles) { + std::vector& targetVertices = + triangle.depthMode == SceneViewportOverlayDepthMode::DepthTested + ? depthTestedScreenTriangleVertices + : alwaysOnTopScreenTriangleVertices; + AppendScreenTriangleVertices(targetVertices, triangle); + } + + std::vector depthTestedSprites = {}; + std::vector alwaysOnTopSprites = {}; + depthTestedSprites.reserve(frameData.worldSprites.size()); + alwaysOnTopSprites.reserve(frameData.worldSprites.size()); + for (const SceneViewportOverlaySpritePrimitive& sprite : frameData.worldSprites) { + if (sprite.sizePixels.x <= Math::EPSILON || sprite.sizePixels.y <= Math::EPSILON) { + continue; + } + + if (sprite.depthMode == SceneViewportOverlayDepthMode::DepthTested) { + depthTestedSprites.push_back(&sprite); + } else { + alwaysOnTopSprites.push_back(&sprite); + } + } + + const auto sortBackToFront = + [](const SceneViewportOverlaySpritePrimitive* lhs, const SceneViewportOverlaySpritePrimitive* rhs) { + return lhs->sortDepth > rhs->sortDepth; + }; + std::sort(depthTestedSprites.begin(), depthTestedSprites.end(), sortBackToFront); + std::sort(alwaysOnTopSprites.begin(), alwaysOnTopSprites.end(), sortBackToFront); + + const size_t lineVertexCount = depthTestedLineVertices.size() + alwaysOnTopLineVertices.size(); + const size_t screenTriangleVertexCount = + depthTestedScreenTriangleVertices.size() + alwaysOnTopScreenTriangleVertices.size(); + const size_t spriteVertexCount = (depthTestedSprites.size() + alwaysOnTopSprites.size()) * 6u; + if (lineVertexCount == 0u && screenTriangleVertexCount == 0u && spriteVertexCount == 0u) { + return true; + } + + if (lineVertexCount > 0u && !EnsureLineBufferCapacity(lineVertexCount)) { + return false; + } + if (screenTriangleVertexCount > 0u && !EnsureScreenTriangleBufferCapacity(screenTriangleVertexCount)) { + return false; + } + if (spriteVertexCount > 0u) { + if (!EnsureSpriteBufferCapacity(spriteVertexCount) || !EnsureIconTexturesLoaded()) { + return false; + } + } + + if (lineVertexCount > 0u) { + std::vector lineVertices = depthTestedLineVertices; + lineVertices.insert(lineVertices.end(), alwaysOnTopLineVertices.begin(), alwaysOnTopLineVertices.end()); + m_lineVertexBuffer->SetData(lineVertices.data(), lineVertices.size() * sizeof(OverlayLineVertex)); + } + + if (screenTriangleVertexCount > 0u) { + std::vector screenTriangleVertices = depthTestedScreenTriangleVertices; + screenTriangleVertices.insert( + screenTriangleVertices.end(), + alwaysOnTopScreenTriangleVertices.begin(), + alwaysOnTopScreenTriangleVertices.end()); + m_screenTriangleVertexBuffer->SetData( + screenTriangleVertices.data(), + screenTriangleVertices.size() * sizeof(OverlayScreenTriangleVertex)); + } + + std::vector spriteVertices = {}; + std::array depthTestedSpriteBatches = {}; + std::array alwaysOnTopSpriteBatches = {}; + if (spriteVertexCount > 0u) { + spriteVertices.reserve(spriteVertexCount); + const auto appendSpriteBatches = + [&spriteVertices]( + const std::vector& sprites, + std::array& outBatches) { + for (size_t textureIndex = 0; textureIndex < kOverlaySpriteTextureCount; ++textureIndex) { + OverlaySpriteBatchRange range = {}; + range.firstVertex = static_cast(spriteVertices.size()); + for (const SceneViewportOverlaySpritePrimitive* sprite : sprites) { + if (sprite == nullptr || ToSpriteTextureIndex(sprite->textureKind) != textureIndex) { + continue; + } + + AppendSpriteVertices(spriteVertices, *sprite); + } + range.vertexCount = static_cast(spriteVertices.size()) - range.firstVertex; + outBatches[textureIndex] = range; + } + }; + appendSpriteBatches(depthTestedSprites, depthTestedSpriteBatches); + appendSpriteBatches(alwaysOnTopSprites, alwaysOnTopSpriteBatches); + m_spriteVertexBuffer->SetData(spriteVertices.data(), spriteVertices.size() * sizeof(OverlaySpriteVertex)); + } + + OverlayConstants constants = {}; + constants.viewProjection = BuildSceneViewportViewProjectionMatrix( + frameData.overlay, + static_cast(surface.GetWidth()), + static_cast(surface.GetHeight())).Transpose(); + constants.viewportSizeAndInvSize = Math::Vector4( + static_cast(surface.GetWidth()), + static_cast(surface.GetHeight()), + surface.GetWidth() > 0u ? 1.0f / static_cast(surface.GetWidth()) : 0.0f, + surface.GetHeight() > 0u ? 1.0f / static_cast(surface.GetHeight()) : 0.0f); + m_constantSet->WriteConstant(0, &constants, sizeof(constants)); + + RHI::RHICommandList* commandList = renderContext.commandList; + const std::vector& colorAttachments = surface.GetColorAttachments(); + if (colorAttachments.empty() || colorAttachments[0] == nullptr) { + return false; + } + + RHI::RHIResourceView* renderTarget = colorAttachments[0]; + commandList->TransitionBarrier( + renderTarget, + surface.GetColorStateAfter(), + RHI::ResourceStates::RenderTarget); + commandList->SetRenderTargets(1, &renderTarget, surface.GetDepthAttachment()); + + const RHI::Viewport viewport = { + 0.0f, + 0.0f, + static_cast(surface.GetWidth()), + static_cast(surface.GetHeight()), + 0.0f, + 1.0f + }; + const RHI::Rect scissorRect = { + 0, + 0, + static_cast(surface.GetWidth()), + static_cast(surface.GetHeight()) + }; + commandList->SetViewport(viewport); + commandList->SetScissorRect(scissorRect); + + if (lineVertexCount > 0u) { + commandList->SetPrimitiveTopology(RHI::PrimitiveTopology::LineList); + RHI::RHIResourceView* vertexBuffers[] = { m_lineVertexBufferView }; + const uint64_t offsets[] = { 0u }; + const uint32_t strides[] = { static_cast(sizeof(OverlayLineVertex)) }; + commandList->SetVertexBuffers(0, 1, vertexBuffers, offsets, strides); + + RHI::RHIDescriptorSet* descriptorSets[] = { m_constantSet }; + commandList->SetGraphicsDescriptorSets(0, 1, descriptorSets, m_linePipelineLayout); + + const uint32_t depthTestedLineVertexCount = static_cast(depthTestedLineVertices.size()); + const uint32_t alwaysOnTopLineVertexCount = static_cast(alwaysOnTopLineVertices.size()); + if (depthTestedLineVertexCount > 0u) { + commandList->SetPipelineState(m_depthTestedLinePipelineState); + commandList->Draw(depthTestedLineVertexCount, 1, 0, 0); + } + if (alwaysOnTopLineVertexCount > 0u) { + commandList->SetPipelineState(m_alwaysOnTopLinePipelineState); + commandList->Draw(alwaysOnTopLineVertexCount, 1, depthTestedLineVertexCount, 0); + } + } + + if (spriteVertexCount > 0u) { + commandList->SetPrimitiveTopology(RHI::PrimitiveTopology::TriangleList); + RHI::RHIResourceView* vertexBuffers[] = { m_spriteVertexBufferView }; + const uint64_t offsets[] = { 0u }; + const uint32_t strides[] = { static_cast(sizeof(OverlaySpriteVertex)) }; + commandList->SetVertexBuffers(0, 1, vertexBuffers, offsets, strides); + + const auto drawSpriteBatchGroup = + [this, commandList]( + RHI::RHIPipelineState* pipelineState, + const std::array& batches) { + if (pipelineState == nullptr) { + return; + } + + commandList->SetPipelineState(pipelineState); + for (size_t textureIndex = 0; textureIndex < kOverlaySpriteTextureCount; ++textureIndex) { + const OverlaySpriteBatchRange& batch = batches[textureIndex]; + if (!batch.HasVertices()) { + continue; + } + + RHI::RHIDescriptorSet* descriptorSets[] = { + m_constantSet, + m_overlaySpriteTextures[textureIndex].textureSet, + m_samplerSet + }; + commandList->SetGraphicsDescriptorSets(0, 3, descriptorSets, m_spritePipelineLayout); + commandList->Draw(batch.vertexCount, 1, batch.firstVertex, 0); + } + }; + + drawSpriteBatchGroup(m_depthTestedSpritePipelineState, depthTestedSpriteBatches); + drawSpriteBatchGroup(m_alwaysOnTopSpritePipelineState, alwaysOnTopSpriteBatches); + } + + if (screenTriangleVertexCount > 0u) { + commandList->SetPrimitiveTopology(RHI::PrimitiveTopology::TriangleList); + RHI::RHIResourceView* vertexBuffers[] = { m_screenTriangleVertexBufferView }; + const uint64_t offsets[] = { 0u }; + const uint32_t strides[] = { static_cast(sizeof(OverlayScreenTriangleVertex)) }; + commandList->SetVertexBuffers(0, 1, vertexBuffers, offsets, strides); + + RHI::RHIDescriptorSet* descriptorSets[] = { m_constantSet }; + commandList->SetGraphicsDescriptorSets(0, 1, descriptorSets, m_linePipelineLayout); + + const uint32_t depthTestedScreenTriangleVertexCount = + static_cast(depthTestedScreenTriangleVertices.size()); + const uint32_t alwaysOnTopScreenTriangleVertexCount = + static_cast(alwaysOnTopScreenTriangleVertices.size()); + if (depthTestedScreenTriangleVertexCount > 0u) { + commandList->SetPipelineState(m_depthTestedScreenTrianglePipelineState); + commandList->Draw(depthTestedScreenTriangleVertexCount, 1, 0, 0); + } + if (alwaysOnTopScreenTriangleVertexCount > 0u) { + commandList->SetPipelineState(m_alwaysOnTopScreenTrianglePipelineState); + commandList->Draw( + alwaysOnTopScreenTriangleVertexCount, + 1, + depthTestedScreenTriangleVertexCount, + 0); + } + } + + commandList->TransitionBarrier( + renderTarget, + RHI::ResourceStates::RenderTarget, + surface.GetColorStateAfter()); + return true; +} + +bool SceneViewportEditorOverlayPassRenderer::EnsureInitialized( + const Rendering::RenderContext& renderContext) { + if (m_device == renderContext.device && + m_backendType == renderContext.backendType && + m_linePipelineLayout != nullptr && + m_spritePipelineLayout != nullptr && + m_depthTestedLinePipelineState != nullptr && + m_alwaysOnTopLinePipelineState != nullptr && + m_depthTestedScreenTrianglePipelineState != nullptr && + m_alwaysOnTopScreenTrianglePipelineState != nullptr && + m_depthTestedSpritePipelineState != nullptr && + m_alwaysOnTopSpritePipelineState != nullptr && + m_constantPool != nullptr && + m_texturePool != nullptr && + m_samplerPool != nullptr && + m_constantSet != nullptr && + m_samplerSet != nullptr && + m_sampler != nullptr) { + return true; + } + + DestroyResources(); + return CreateResources(renderContext); +} + +bool SceneViewportEditorOverlayPassRenderer::CreateResources( + const Rendering::RenderContext& renderContext) { + if (!renderContext.IsValid() || renderContext.backendType != RHI::RHIType::D3D12) { + return false; + } + + m_device = renderContext.device; + m_backendType = renderContext.backendType; + + RHI::DescriptorSetLayoutBinding constantBinding = {}; + constantBinding.binding = 0; + constantBinding.type = static_cast(RHI::DescriptorType::CBV); + constantBinding.count = 1; + + RHI::DescriptorSetLayoutBinding textureBinding = {}; + textureBinding.binding = 0; + textureBinding.type = static_cast(RHI::DescriptorType::SRV); + textureBinding.count = 1; + + RHI::DescriptorSetLayoutBinding samplerBinding = {}; + samplerBinding.binding = 0; + samplerBinding.type = static_cast(RHI::DescriptorType::Sampler); + samplerBinding.count = 1; + + RHI::DescriptorSetLayoutDesc constantLayout = {}; + constantLayout.bindings = &constantBinding; + constantLayout.bindingCount = 1; + + RHI::DescriptorSetLayoutDesc textureLayout = {}; + textureLayout.bindings = &textureBinding; + textureLayout.bindingCount = 1; + + RHI::DescriptorSetLayoutDesc samplerLayout = {}; + samplerLayout.bindings = &samplerBinding; + samplerLayout.bindingCount = 1; + + RHI::RHIPipelineLayoutDesc linePipelineLayoutDesc = {}; + linePipelineLayoutDesc.setLayouts = &constantLayout; + linePipelineLayoutDesc.setLayoutCount = 1; + m_linePipelineLayout = m_device->CreatePipelineLayout(linePipelineLayoutDesc); + if (m_linePipelineLayout == nullptr) { + DestroyResources(); + return false; + } + + RHI::DescriptorSetLayoutDesc spriteSetLayouts[3] = { + constantLayout, + textureLayout, + samplerLayout + }; + RHI::RHIPipelineLayoutDesc spritePipelineLayoutDesc = {}; + spritePipelineLayoutDesc.setLayouts = spriteSetLayouts; + spritePipelineLayoutDesc.setLayoutCount = 3; + m_spritePipelineLayout = m_device->CreatePipelineLayout(spritePipelineLayoutDesc); + if (m_spritePipelineLayout == nullptr) { + DestroyResources(); + return false; + } + + RHI::DescriptorPoolDesc constantPoolDesc = {}; + constantPoolDesc.type = RHI::DescriptorHeapType::CBV_SRV_UAV; + constantPoolDesc.descriptorCount = 1; + constantPoolDesc.shaderVisible = false; + m_constantPool = m_device->CreateDescriptorPool(constantPoolDesc); + if (m_constantPool == nullptr) { + DestroyResources(); + return false; + } + + m_constantSet = m_constantPool->AllocateSet(constantLayout); + if (m_constantSet == nullptr) { + DestroyResources(); + return false; + } + + RHI::DescriptorPoolDesc texturePoolDesc = {}; + texturePoolDesc.type = RHI::DescriptorHeapType::CBV_SRV_UAV; + texturePoolDesc.descriptorCount = static_cast(kOverlaySpriteTextureCount); + texturePoolDesc.shaderVisible = true; + m_texturePool = m_device->CreateDescriptorPool(texturePoolDesc); + if (m_texturePool == nullptr) { + DestroyResources(); + return false; + } + + RHI::DescriptorPoolDesc samplerPoolDesc = {}; + samplerPoolDesc.type = RHI::DescriptorHeapType::Sampler; + samplerPoolDesc.descriptorCount = 1; + samplerPoolDesc.shaderVisible = true; + m_samplerPool = m_device->CreateDescriptorPool(samplerPoolDesc); + if (m_samplerPool == nullptr) { + DestroyResources(); + return false; + } + + m_samplerSet = m_samplerPool->AllocateSet(samplerLayout); + if (m_samplerSet == nullptr) { + DestroyResources(); + return false; + } + + RHI::SamplerDesc samplerDesc = {}; + samplerDesc.filter = static_cast(RHI::FilterMode::Linear); + samplerDesc.addressU = static_cast(RHI::TextureAddressMode::Clamp); + samplerDesc.addressV = static_cast(RHI::TextureAddressMode::Clamp); + samplerDesc.addressW = static_cast(RHI::TextureAddressMode::Clamp); + samplerDesc.mipLodBias = 0.0f; + samplerDesc.maxAnisotropy = 1; + samplerDesc.comparisonFunc = static_cast(RHI::ComparisonFunc::Always); + samplerDesc.minLod = 0.0f; + samplerDesc.maxLod = 1000.0f; + m_sampler = m_device->CreateSampler(samplerDesc); + if (m_sampler == nullptr) { + DestroyResources(); + return false; + } + m_samplerSet->UpdateSampler(0, m_sampler); + + const RHI::GraphicsPipelineDesc depthTestedLineDesc = + BuildLinePipelineDesc(m_linePipelineLayout, true); + m_depthTestedLinePipelineState = m_device->CreatePipelineState(depthTestedLineDesc); + if (m_depthTestedLinePipelineState == nullptr || !m_depthTestedLinePipelineState->IsValid()) { + DestroyResources(); + return false; + } + + const RHI::GraphicsPipelineDesc alwaysOnTopLineDesc = + BuildLinePipelineDesc(m_linePipelineLayout, false); + m_alwaysOnTopLinePipelineState = m_device->CreatePipelineState(alwaysOnTopLineDesc); + if (m_alwaysOnTopLinePipelineState == nullptr || !m_alwaysOnTopLinePipelineState->IsValid()) { + DestroyResources(); + return false; + } + + const RHI::GraphicsPipelineDesc depthTestedScreenTriangleDesc = + BuildScreenTrianglePipelineDesc(m_linePipelineLayout, true); + m_depthTestedScreenTrianglePipelineState = m_device->CreatePipelineState(depthTestedScreenTriangleDesc); + if (m_depthTestedScreenTrianglePipelineState == nullptr || + !m_depthTestedScreenTrianglePipelineState->IsValid()) { + DestroyResources(); + return false; + } + + const RHI::GraphicsPipelineDesc alwaysOnTopScreenTriangleDesc = + BuildScreenTrianglePipelineDesc(m_linePipelineLayout, false); + m_alwaysOnTopScreenTrianglePipelineState = m_device->CreatePipelineState(alwaysOnTopScreenTriangleDesc); + if (m_alwaysOnTopScreenTrianglePipelineState == nullptr || + !m_alwaysOnTopScreenTrianglePipelineState->IsValid()) { + DestroyResources(); + return false; + } + + const RHI::GraphicsPipelineDesc depthTestedSpriteDesc = + BuildSpritePipelineDesc(m_spritePipelineLayout, true); + m_depthTestedSpritePipelineState = m_device->CreatePipelineState(depthTestedSpriteDesc); + if (m_depthTestedSpritePipelineState == nullptr || !m_depthTestedSpritePipelineState->IsValid()) { + DestroyResources(); + return false; + } + + const RHI::GraphicsPipelineDesc alwaysOnTopSpriteDesc = + BuildSpritePipelineDesc(m_spritePipelineLayout, false); + m_alwaysOnTopSpritePipelineState = m_device->CreatePipelineState(alwaysOnTopSpriteDesc); + if (m_alwaysOnTopSpritePipelineState == nullptr || !m_alwaysOnTopSpritePipelineState->IsValid()) { + DestroyResources(); + return false; + } + + return true; +} + +bool SceneViewportEditorOverlayPassRenderer::EnsureLineBufferCapacity(size_t requiredVertexCount) { + const uint64_t requiredBytes = static_cast(requiredVertexCount * sizeof(OverlayLineVertex)); + if (requiredBytes == 0u) { + return true; + } + + if (m_lineVertexBuffer != nullptr && m_lineVertexBufferCapacity >= requiredBytes) { + return true; + } + + if (m_lineVertexBufferView != nullptr) { + m_lineVertexBufferView->Shutdown(); + delete m_lineVertexBufferView; + m_lineVertexBufferView = nullptr; + } + if (m_lineVertexBuffer != nullptr) { + m_lineVertexBuffer->Shutdown(); + delete m_lineVertexBuffer; + m_lineVertexBuffer = nullptr; + } + + m_lineVertexBufferCapacity = (std::max)(requiredBytes, kMinDynamicVertexBufferBytes); + RHI::BufferDesc bufferDesc = {}; + bufferDesc.size = m_lineVertexBufferCapacity; + bufferDesc.stride = static_cast(sizeof(OverlayLineVertex)); + bufferDesc.bufferType = static_cast(RHI::BufferType::Vertex); + m_lineVertexBuffer = m_device->CreateBuffer(bufferDesc); + if (m_lineVertexBuffer == nullptr) { + m_lineVertexBufferCapacity = 0u; + return false; + } + + m_lineVertexBuffer->SetStride(bufferDesc.stride); + m_lineVertexBuffer->SetBufferType(RHI::BufferType::Vertex); + + RHI::ResourceViewDesc viewDesc = {}; + viewDesc.dimension = RHI::ResourceViewDimension::Buffer; + viewDesc.structureByteStride = bufferDesc.stride; + m_lineVertexBufferView = m_device->CreateVertexBufferView(m_lineVertexBuffer, viewDesc); + return m_lineVertexBufferView != nullptr; +} + +bool SceneViewportEditorOverlayPassRenderer::EnsureScreenTriangleBufferCapacity(size_t requiredVertexCount) { + const uint64_t requiredBytes = + static_cast(requiredVertexCount * sizeof(OverlayScreenTriangleVertex)); + if (requiredBytes == 0u) { + return true; + } + + if (m_screenTriangleVertexBuffer != nullptr && m_screenTriangleVertexBufferCapacity >= requiredBytes) { + return true; + } + + if (m_screenTriangleVertexBufferView != nullptr) { + m_screenTriangleVertexBufferView->Shutdown(); + delete m_screenTriangleVertexBufferView; + m_screenTriangleVertexBufferView = nullptr; + } + if (m_screenTriangleVertexBuffer != nullptr) { + m_screenTriangleVertexBuffer->Shutdown(); + delete m_screenTriangleVertexBuffer; + m_screenTriangleVertexBuffer = nullptr; + } + + m_screenTriangleVertexBufferCapacity = (std::max)(requiredBytes, kMinDynamicVertexBufferBytes); + RHI::BufferDesc bufferDesc = {}; + bufferDesc.size = m_screenTriangleVertexBufferCapacity; + bufferDesc.stride = static_cast(sizeof(OverlayScreenTriangleVertex)); + bufferDesc.bufferType = static_cast(RHI::BufferType::Vertex); + m_screenTriangleVertexBuffer = m_device->CreateBuffer(bufferDesc); + if (m_screenTriangleVertexBuffer == nullptr) { + m_screenTriangleVertexBufferCapacity = 0u; + return false; + } + + m_screenTriangleVertexBuffer->SetStride(bufferDesc.stride); + m_screenTriangleVertexBuffer->SetBufferType(RHI::BufferType::Vertex); + + RHI::ResourceViewDesc viewDesc = {}; + viewDesc.dimension = RHI::ResourceViewDimension::Buffer; + viewDesc.structureByteStride = bufferDesc.stride; + m_screenTriangleVertexBufferView = + m_device->CreateVertexBufferView(m_screenTriangleVertexBuffer, viewDesc); + return m_screenTriangleVertexBufferView != nullptr; +} + +bool SceneViewportEditorOverlayPassRenderer::EnsureSpriteBufferCapacity(size_t requiredVertexCount) { + const uint64_t requiredBytes = static_cast(requiredVertexCount * sizeof(OverlaySpriteVertex)); + if (requiredBytes == 0u) { + return true; + } + + if (m_spriteVertexBuffer != nullptr && m_spriteVertexBufferCapacity >= requiredBytes) { + return true; + } + + if (m_spriteVertexBufferView != nullptr) { + m_spriteVertexBufferView->Shutdown(); + delete m_spriteVertexBufferView; + m_spriteVertexBufferView = nullptr; + } + if (m_spriteVertexBuffer != nullptr) { + m_spriteVertexBuffer->Shutdown(); + delete m_spriteVertexBuffer; + m_spriteVertexBuffer = nullptr; + } + + m_spriteVertexBufferCapacity = (std::max)(requiredBytes, kMinDynamicVertexBufferBytes); + RHI::BufferDesc bufferDesc = {}; + bufferDesc.size = m_spriteVertexBufferCapacity; + bufferDesc.stride = static_cast(sizeof(OverlaySpriteVertex)); + bufferDesc.bufferType = static_cast(RHI::BufferType::Vertex); + m_spriteVertexBuffer = m_device->CreateBuffer(bufferDesc); + if (m_spriteVertexBuffer == nullptr) { + m_spriteVertexBufferCapacity = 0u; + return false; + } + + m_spriteVertexBuffer->SetStride(bufferDesc.stride); + m_spriteVertexBuffer->SetBufferType(RHI::BufferType::Vertex); + + RHI::ResourceViewDesc viewDesc = {}; + viewDesc.dimension = RHI::ResourceViewDimension::Buffer; + viewDesc.structureByteStride = bufferDesc.stride; + m_spriteVertexBufferView = m_device->CreateVertexBufferView(m_spriteVertexBuffer, viewDesc); + return m_spriteVertexBufferView != nullptr; +} + +bool SceneViewportEditorOverlayPassRenderer::EnsureIconTexturesLoaded() { + if (m_device == nullptr || m_texturePool == nullptr) { + return false; + } + + RHI::DescriptorSetLayoutBinding textureBinding = {}; + textureBinding.binding = 0; + textureBinding.type = static_cast(RHI::DescriptorType::SRV); + textureBinding.count = 1; + RHI::DescriptorSetLayoutDesc textureLayout = {}; + textureLayout.bindings = &textureBinding; + textureLayout.bindingCount = 1; + + for (size_t textureIndex = 0; textureIndex < kOverlaySpriteTextureCount; ++textureIndex) { + OverlaySpriteTextureResources& resources = m_overlaySpriteTextures[textureIndex]; + if (resources.texture != nullptr && resources.shaderView != nullptr && resources.textureSet != nullptr) { + continue; + } + + const SceneViewportOverlaySpriteTextureKind textureKind = + textureIndex == 0u + ? SceneViewportOverlaySpriteTextureKind::Camera + : SceneViewportOverlaySpriteTextureKind::Light; + + std::vector pixels = {}; + int width = 0; + int height = 0; + if (!DecodeTextureFile(ResolveOverlaySpriteTexturePath(textureKind), pixels, width, height)) { + return false; + } + + RHI::TextureDesc textureDesc = {}; + textureDesc.width = static_cast(width); + textureDesc.height = static_cast(height); + textureDesc.depth = 1; + textureDesc.mipLevels = 1; + textureDesc.arraySize = 1; + textureDesc.format = static_cast(RHI::Format::R8G8B8A8_UNorm); + textureDesc.textureType = static_cast(RHI::TextureType::Texture2D); + textureDesc.sampleCount = 1; + textureDesc.sampleQuality = 0; + textureDesc.flags = 0; + resources.texture = m_device->CreateTexture( + textureDesc, + pixels.data(), + pixels.size(), + static_cast(width * 4)); + if (resources.texture == nullptr) { + return false; + } + + RHI::ResourceViewDesc viewDesc = {}; + viewDesc.format = static_cast(RHI::Format::R8G8B8A8_UNorm); + viewDesc.dimension = RHI::ResourceViewDimension::Texture2D; + viewDesc.mipLevel = 0; + resources.shaderView = m_device->CreateShaderResourceView(resources.texture, viewDesc); + if (resources.shaderView == nullptr) { + return false; + } + + resources.textureSet = m_texturePool->AllocateSet(textureLayout); + if (resources.textureSet == nullptr) { + return false; + } + resources.textureSet->Update(0, resources.shaderView); + } + + return true; +} + +void SceneViewportEditorOverlayPassRenderer::DestroyResources() { + if (m_lineVertexBufferView != nullptr) { + m_lineVertexBufferView->Shutdown(); + delete m_lineVertexBufferView; + m_lineVertexBufferView = nullptr; + } + if (m_lineVertexBuffer != nullptr) { + m_lineVertexBuffer->Shutdown(); + delete m_lineVertexBuffer; + m_lineVertexBuffer = nullptr; + } + if (m_screenTriangleVertexBufferView != nullptr) { + m_screenTriangleVertexBufferView->Shutdown(); + delete m_screenTriangleVertexBufferView; + m_screenTriangleVertexBufferView = nullptr; + } + if (m_screenTriangleVertexBuffer != nullptr) { + m_screenTriangleVertexBuffer->Shutdown(); + delete m_screenTriangleVertexBuffer; + m_screenTriangleVertexBuffer = nullptr; + } + if (m_spriteVertexBufferView != nullptr) { + m_spriteVertexBufferView->Shutdown(); + delete m_spriteVertexBufferView; + m_spriteVertexBufferView = nullptr; + } + if (m_spriteVertexBuffer != nullptr) { + m_spriteVertexBuffer->Shutdown(); + delete m_spriteVertexBuffer; + m_spriteVertexBuffer = nullptr; + } + + for (OverlaySpriteTextureResources& resources : m_overlaySpriteTextures) { + if (resources.textureSet != nullptr) { + resources.textureSet->Shutdown(); + delete resources.textureSet; + resources.textureSet = nullptr; + } + if (resources.shaderView != nullptr) { + resources.shaderView->Shutdown(); + delete resources.shaderView; + resources.shaderView = nullptr; + } + if (resources.texture != nullptr) { + resources.texture->Shutdown(); + delete resources.texture; + resources.texture = nullptr; + } + } + + if (m_depthTestedLinePipelineState != nullptr) { + m_depthTestedLinePipelineState->Shutdown(); + delete m_depthTestedLinePipelineState; + m_depthTestedLinePipelineState = nullptr; + } + if (m_alwaysOnTopLinePipelineState != nullptr) { + m_alwaysOnTopLinePipelineState->Shutdown(); + delete m_alwaysOnTopLinePipelineState; + m_alwaysOnTopLinePipelineState = nullptr; + } + if (m_depthTestedScreenTrianglePipelineState != nullptr) { + m_depthTestedScreenTrianglePipelineState->Shutdown(); + delete m_depthTestedScreenTrianglePipelineState; + m_depthTestedScreenTrianglePipelineState = nullptr; + } + if (m_alwaysOnTopScreenTrianglePipelineState != nullptr) { + m_alwaysOnTopScreenTrianglePipelineState->Shutdown(); + delete m_alwaysOnTopScreenTrianglePipelineState; + m_alwaysOnTopScreenTrianglePipelineState = nullptr; + } + if (m_depthTestedSpritePipelineState != nullptr) { + m_depthTestedSpritePipelineState->Shutdown(); + delete m_depthTestedSpritePipelineState; + m_depthTestedSpritePipelineState = nullptr; + } + if (m_alwaysOnTopSpritePipelineState != nullptr) { + m_alwaysOnTopSpritePipelineState->Shutdown(); + delete m_alwaysOnTopSpritePipelineState; + m_alwaysOnTopSpritePipelineState = nullptr; + } + + if (m_samplerSet != nullptr) { + m_samplerSet->Shutdown(); + delete m_samplerSet; + m_samplerSet = nullptr; + } + if (m_sampler != nullptr) { + m_sampler->Shutdown(); + delete m_sampler; + m_sampler = nullptr; + } + if (m_samplerPool != nullptr) { + m_samplerPool->Shutdown(); + delete m_samplerPool; + m_samplerPool = nullptr; + } + + if (m_constantSet != nullptr) { + m_constantSet->Shutdown(); + delete m_constantSet; + m_constantSet = nullptr; + } + if (m_constantPool != nullptr) { + m_constantPool->Shutdown(); + delete m_constantPool; + m_constantPool = nullptr; + } + if (m_texturePool != nullptr) { + m_texturePool->Shutdown(); + delete m_texturePool; + m_texturePool = nullptr; + } + + if (m_linePipelineLayout != nullptr) { + m_linePipelineLayout->Shutdown(); + delete m_linePipelineLayout; + m_linePipelineLayout = nullptr; + } + if (m_spritePipelineLayout != nullptr) { + m_spritePipelineLayout->Shutdown(); + delete m_spritePipelineLayout; + m_spritePipelineLayout = nullptr; + } + + m_lineVertexBufferCapacity = 0u; + m_screenTriangleVertexBufferCapacity = 0u; + m_spriteVertexBufferCapacity = 0u; + m_device = nullptr; + m_backendType = RHI::RHIType::D3D12; +} + +std::unique_ptr CreateSceneViewportEditorOverlayPass( + SceneViewportEditorOverlayPassRenderer& renderer, + const SceneViewportOverlayFrameData& frameData) { + return std::make_unique(renderer, frameData); +} + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Viewport/Passes/SceneViewportEditorOverlayPass.h b/editor/src/Viewport/Passes/SceneViewportEditorOverlayPass.h new file mode 100644 index 00000000..e116bf8d --- /dev/null +++ b/editor/src/Viewport/Passes/SceneViewportEditorOverlayPass.h @@ -0,0 +1,89 @@ +#pragma once + +#include "Viewport/SceneViewportEditorOverlayData.h" + +#include +#include +#include + +#include +#include +#include +#include + +namespace XCEngine { +namespace RHI { +class RHIBuffer; +class RHIDescriptorPool; +class RHIDescriptorSet; +class RHIDevice; +class RHIPipelineLayout; +class RHIPipelineState; +class RHIResourceView; +class RHISampler; +class RHITexture; +enum class RHIType : uint8_t; +} // namespace RHI + +namespace Editor { + +class SceneViewportEditorOverlayPassRenderer { +public: + ~SceneViewportEditorOverlayPassRenderer() = default; + + void Shutdown(); + + bool Render( + const Rendering::RenderContext& renderContext, + const Rendering::RenderSurface& surface, + const SceneViewportOverlayFrameData& frameData); + +private: + struct OverlaySpriteTextureResources { + RHI::RHITexture* texture = nullptr; + RHI::RHIResourceView* shaderView = nullptr; + RHI::RHIDescriptorSet* textureSet = nullptr; + }; + + bool EnsureInitialized(const Rendering::RenderContext& renderContext); + bool CreateResources(const Rendering::RenderContext& renderContext); + bool EnsureLineBufferCapacity(size_t requiredVertexCount); + bool EnsureScreenTriangleBufferCapacity(size_t requiredVertexCount); + bool EnsureSpriteBufferCapacity(size_t requiredVertexCount); + bool EnsureIconTexturesLoaded(); + void DestroyResources(); + + RHI::RHIDevice* m_device = nullptr; + RHI::RHIType m_backendType = RHI::RHIType::D3D12; + RHI::RHIPipelineLayout* m_linePipelineLayout = nullptr; + RHI::RHIPipelineLayout* m_spritePipelineLayout = nullptr; + RHI::RHIPipelineState* m_depthTestedLinePipelineState = nullptr; + RHI::RHIPipelineState* m_alwaysOnTopLinePipelineState = nullptr; + RHI::RHIPipelineState* m_depthTestedScreenTrianglePipelineState = nullptr; + RHI::RHIPipelineState* m_alwaysOnTopScreenTrianglePipelineState = nullptr; + RHI::RHIPipelineState* m_depthTestedSpritePipelineState = nullptr; + RHI::RHIPipelineState* m_alwaysOnTopSpritePipelineState = nullptr; + RHI::RHIDescriptorPool* m_constantPool = nullptr; + RHI::RHIDescriptorPool* m_texturePool = nullptr; + RHI::RHIDescriptorPool* m_samplerPool = nullptr; + RHI::RHIDescriptorSet* m_constantSet = nullptr; + RHI::RHIDescriptorSet* m_samplerSet = nullptr; + RHI::RHISampler* m_sampler = nullptr; + RHI::RHIBuffer* m_lineVertexBuffer = nullptr; + RHI::RHIResourceView* m_lineVertexBufferView = nullptr; + RHI::RHIBuffer* m_screenTriangleVertexBuffer = nullptr; + RHI::RHIResourceView* m_screenTriangleVertexBufferView = nullptr; + RHI::RHIBuffer* m_spriteVertexBuffer = nullptr; + RHI::RHIResourceView* m_spriteVertexBufferView = nullptr; + uint64_t m_lineVertexBufferCapacity = 0; + uint64_t m_screenTriangleVertexBufferCapacity = 0; + uint64_t m_spriteVertexBufferCapacity = 0; + std::array m_overlaySpriteTextures = {}; +}; + +std::unique_ptr CreateSceneViewportEditorOverlayPass( + SceneViewportEditorOverlayPassRenderer& renderer, + const SceneViewportOverlayFrameData& frameData); + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Viewport/SceneViewportCameraController.h b/editor/src/Viewport/SceneViewportCameraController.h index b490467a..55c89967 100644 --- a/editor/src/Viewport/SceneViewportCameraController.h +++ b/editor/src/Viewport/SceneViewportCameraController.h @@ -128,13 +128,21 @@ public: if (std::abs(input.lookDeltaX) > Math::EPSILON || std::abs(input.lookDeltaY) > Math::EPSILON) { - ApplyRotationDelta(input.lookDeltaX, input.lookDeltaY); + ApplyRotationDelta( + input.lookDeltaX, + input.lookDeltaY, + kLookYawSensitivity, + kLookPitchSensitivity); UpdateFocalPointFromPosition(); } if (std::abs(input.orbitDeltaX) > Math::EPSILON || std::abs(input.orbitDeltaY) > Math::EPSILON) { - ApplyRotationDelta(input.orbitDeltaX, input.orbitDeltaY); + ApplyRotationDelta( + input.orbitDeltaX, + input.orbitDeltaY, + kOrbitYawSensitivity, + kOrbitPitchSensitivity); UpdatePositionFromFocalPoint(); } @@ -200,6 +208,10 @@ public: private: static constexpr float kSnapDurationSeconds = 0.22f; + static constexpr float kLookYawSensitivity = 0.18f; + static constexpr float kLookPitchSensitivity = 0.12f; + static constexpr float kOrbitYawSensitivity = 0.30f; + static constexpr float kOrbitPitchSensitivity = 0.20f; struct OrientationAngles { float yawDegrees = 0.0f; @@ -239,9 +251,13 @@ private: return result; } - void ApplyRotationDelta(float deltaX, float deltaY) { - m_yawDegrees += deltaX * 0.30f; - m_pitchDegrees = std::clamp(m_pitchDegrees - deltaY * 0.20f, -89.0f, 89.0f); + void ApplyRotationDelta( + float deltaX, + float deltaY, + float yawSensitivity, + float pitchSensitivity) { + m_yawDegrees += deltaX * yawSensitivity; + m_pitchDegrees = std::clamp(m_pitchDegrees - deltaY * pitchSensitivity, -89.0f, 89.0f); } Math::Vector3 GetRight() const { diff --git a/editor/src/Viewport/SceneViewportEditorOverlayData.h b/editor/src/Viewport/SceneViewportEditorOverlayData.h new file mode 100644 index 00000000..80be6bdb --- /dev/null +++ b/editor/src/Viewport/SceneViewportEditorOverlayData.h @@ -0,0 +1,144 @@ +#pragma once + +#include "IViewportHostService.h" + +#include +#include +#include + +#include +#include +#include + +namespace XCEngine { +namespace Editor { + +enum class SceneViewportOverlayDepthMode : uint8_t { + DepthTested = 0, + AlwaysOnTop +}; + +enum class SceneViewportOverlaySpriteTextureKind : uint8_t { + Camera = 0, + Light = 1 +}; + +enum class SceneViewportOverlayHandleKind : uint8_t { + None = 0, + SceneIcon, + MoveAxis, + MovePlane, + RotateAxis, + ScaleAxis, + ScaleUniform +}; + +enum class SceneViewportOverlayHandleShape : uint8_t { + None = 0, + WorldRect, + ScreenSegment, + ScreenRect, + ScreenQuad +}; + +struct SceneViewportOverlayLinePrimitive { + Math::Vector3 startWorld = Math::Vector3::Zero(); + Math::Vector3 endWorld = Math::Vector3::Zero(); + Math::Color color = Math::Color::White(); + float thicknessPixels = 1.0f; + SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop; +}; + +struct SceneViewportOverlaySpritePrimitive { + Math::Vector3 worldPosition = Math::Vector3::Zero(); + Math::Vector2 sizePixels = Math::Vector2::Zero(); + Math::Color tintColor = Math::Color::White(); + float sortDepth = 0.0f; + uint64_t entityId = 0; + SceneViewportOverlaySpriteTextureKind textureKind = SceneViewportOverlaySpriteTextureKind::Camera; + SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop; +}; + +struct SceneViewportOverlayScreenTriangleVertex { + Math::Vector2 screenPosition = Math::Vector2::Zero(); + Math::Color color = Math::Color::White(); +}; + +struct SceneViewportOverlayScreenTrianglePrimitive { + std::array vertices = {}; + SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop; +}; + +struct SceneViewportOverlayHandleRecord { + SceneViewportOverlayHandleKind kind = SceneViewportOverlayHandleKind::None; + uint64_t handleId = 0; + uint64_t entityId = 0; + SceneViewportOverlayHandleShape shape = SceneViewportOverlayHandleShape::None; + int priority = 0; + Math::Vector3 worldPosition = Math::Vector3::Zero(); + Math::Vector2 sizePixels = Math::Vector2::Zero(); + float sortDepth = 0.0f; + Math::Vector2 screenStart = Math::Vector2::Zero(); + Math::Vector2 screenEnd = Math::Vector2::Zero(); + Math::Vector2 screenCenter = Math::Vector2::Zero(); + Math::Vector2 screenHalfSize = Math::Vector2::Zero(); + std::array screenQuad = {}; + float hitThicknessPixels = 0.0f; +}; + +struct SceneViewportOverlayHandleHitResult { + SceneViewportOverlayHandleKind kind = SceneViewportOverlayHandleKind::None; + uint64_t handleId = 0; + uint64_t entityId = 0; + int priority = (std::numeric_limits::min)(); + float distanceSq = (std::numeric_limits::max)(); + float depth = (std::numeric_limits::max)(); + + bool HasHit() const { + return kind != SceneViewportOverlayHandleKind::None; + } +}; + +struct SceneViewportOverlayFrameData { + SceneViewportOverlayData overlay = {}; + std::vector worldLines = {}; + std::vector worldSprites = {}; + std::vector screenTriangles = {}; + std::vector handleRecords = {}; + + bool HasOverlayPrimitives() const { + return overlay.valid && (!worldLines.empty() || !worldSprites.empty() || !screenTriangles.empty()); + } + + bool HasWorldOverlay() const { + return HasOverlayPrimitives(); + } +}; + +inline void AppendSceneViewportOverlayFrameData( + SceneViewportOverlayFrameData& target, + const SceneViewportOverlayFrameData& source) { + if (!target.overlay.valid && source.overlay.valid) { + target.overlay = source.overlay; + } + + target.worldLines.insert( + target.worldLines.end(), + source.worldLines.begin(), + source.worldLines.end()); + target.worldSprites.insert( + target.worldSprites.end(), + source.worldSprites.begin(), + source.worldSprites.end()); + target.screenTriangles.insert( + target.screenTriangles.end(), + source.screenTriangles.begin(), + source.screenTriangles.end()); + target.handleRecords.insert( + target.handleRecords.end(), + source.handleRecords.begin(), + source.handleRecords.end()); +} + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Viewport/SceneViewportMoveGizmo.cpp b/editor/src/Viewport/SceneViewportMoveGizmo.cpp index 90f560ec..446f9e68 100644 --- a/editor/src/Viewport/SceneViewportMoveGizmo.cpp +++ b/editor/src/Viewport/SceneViewportMoveGizmo.cpp @@ -14,7 +14,7 @@ namespace { constexpr float kMoveGizmoHandleLengthPixels = 100.0f; constexpr float kMoveGizmoHoverThresholdPixels = 10.0f; -Math::Vector3 GetAxisVector(SceneViewportGizmoAxis axis) { +Math::Vector3 GetBaseAxisVector(SceneViewportGizmoAxis axis) { switch (axis) { case SceneViewportGizmoAxis::X: return Math::Vector3::Right(); @@ -28,6 +28,16 @@ Math::Vector3 GetAxisVector(SceneViewportGizmoAxis axis) { } } +Math::Vector3 GetAxisVector( + SceneViewportGizmoAxis axis, + const Math::Quaternion& orientation) { + const Math::Vector3 baseAxis = GetBaseAxisVector(axis); + const Math::Vector3 orientedAxis = orientation * baseAxis; + return orientedAxis.SqrMagnitude() <= Math::EPSILON + ? baseAxis + : orientedAxis.Normalized(); +} + Math::Color GetAxisBaseColor(SceneViewportGizmoAxis axis) { switch (axis) { case SceneViewportGizmoAxis::X: @@ -61,20 +71,21 @@ SceneViewportGizmoPlane GetPlaneForIndex(size_t index) { void GetPlaneAxes( SceneViewportGizmoPlane plane, + const Math::Quaternion& orientation, Math::Vector3& outAxisA, Math::Vector3& outAxisB) { switch (plane) { case SceneViewportGizmoPlane::XY: - outAxisA = Math::Vector3::Right(); - outAxisB = Math::Vector3::Up(); + outAxisA = GetAxisVector(SceneViewportGizmoAxis::X, orientation); + outAxisB = GetAxisVector(SceneViewportGizmoAxis::Y, orientation); return; case SceneViewportGizmoPlane::XZ: - outAxisA = Math::Vector3::Right(); - outAxisB = Math::Vector3::Forward(); + outAxisA = GetAxisVector(SceneViewportGizmoAxis::X, orientation); + outAxisB = GetAxisVector(SceneViewportGizmoAxis::Z, orientation); return; case SceneViewportGizmoPlane::YZ: - outAxisA = Math::Vector3::Up(); - outAxisB = Math::Vector3::Forward(); + outAxisA = GetAxisVector(SceneViewportGizmoAxis::Y, orientation); + outAxisB = GetAxisVector(SceneViewportGizmoAxis::Z, orientation); return; case SceneViewportGizmoPlane::None: default: @@ -84,14 +95,16 @@ void GetPlaneAxes( } } -Math::Vector3 GetPlaneNormal(SceneViewportGizmoPlane plane) { +Math::Vector3 GetPlaneNormal( + SceneViewportGizmoPlane plane, + const Math::Quaternion& orientation) { switch (plane) { case SceneViewportGizmoPlane::XY: - return Math::Vector3::Forward(); + return GetAxisVector(SceneViewportGizmoAxis::Z, orientation); case SceneViewportGizmoPlane::XZ: - return Math::Vector3::Up(); + return GetAxisVector(SceneViewportGizmoAxis::Y, orientation); case SceneViewportGizmoPlane::YZ: - return Math::Vector3::Right(); + return GetAxisVector(SceneViewportGizmoAxis::X, orientation); case SceneViewportGizmoPlane::None: default: return Math::Vector3::Zero(); @@ -185,10 +198,9 @@ float ComputeWorldUnitsPerPixel( void SceneViewportMoveGizmo::Update(const SceneViewportMoveGizmoContext& context) { BuildDrawData(context); if (m_dragMode == DragMode::None && IsMouseInsideViewport(context)) { - m_hoveredAxis = HitTestAxis(context.mousePosition); - m_hoveredPlane = m_hoveredAxis == SceneViewportGizmoAxis::None - ? HitTestPlane(context.mousePosition) - : SceneViewportGizmoPlane::None; + const SceneViewportMoveGizmoHitResult hitResult = EvaluateHit(context.mousePosition); + m_hoveredAxis = hitResult.axis; + m_hoveredPlane = hitResult.plane; } else if (m_dragMode == DragMode::None) { m_hoveredAxis = SceneViewportGizmoAxis::None; m_hoveredPlane = SceneViewportGizmoPlane::None; @@ -221,18 +233,17 @@ bool SceneViewportMoveGizmo::TryBeginDrag(const SceneViewportMoveGizmoContext& c return false; } - const Math::Vector3 objectWorldPosition = context.selectedObject->GetTransform()->GetPosition(); - const Math::Vector3 pivotWorldPosition = context.selectedObject->GetTransform()->GetPosition(); + const Math::Vector3 pivotWorldPosition = context.pivotWorldPosition; Math::Vector3 dragPlaneNormal = Math::Vector3::Zero(); Math::Vector3 worldAxis = Math::Vector3::Zero(); if (m_hoveredAxis != SceneViewportGizmoAxis::None) { - worldAxis = GetAxisVector(m_hoveredAxis); + worldAxis = GetAxisVector(m_hoveredAxis, context.axisOrientation); if (!BuildSceneViewportAxisDragPlaneNormal(context.overlay, worldAxis, dragPlaneNormal)) { return false; } } else { - dragPlaneNormal = GetPlaneNormal(m_hoveredPlane); + dragPlaneNormal = GetPlaneNormal(m_hoveredPlane, context.axisOrientation); if (dragPlaneNormal.SqrMagnitude() <= Math::EPSILON) { return false; } @@ -257,10 +268,21 @@ bool SceneViewportMoveGizmo::TryBeginDrag(const SceneViewportMoveGizmoContext& c m_activeAxisDirection = worldAxis; m_activePlaneNormal = dragPlaneNormal; m_dragPlane = dragPlane; - m_dragStartObjectWorldPosition = objectWorldPosition; m_dragStartPivotWorldPosition = pivotWorldPosition; m_dragStartHitWorldPosition = hitPoint; m_dragStartAxisScalar = Math::Vector3::Dot(hitPoint - pivotWorldPosition, worldAxis); + m_dragObjects = context.selectedObjects; + if (m_dragObjects.empty()) { + m_dragObjects.push_back(context.selectedObject); + } + m_dragStartObjectWorldPositions.clear(); + m_dragStartObjectWorldPositions.reserve(m_dragObjects.size()); + for (Components::GameObject* gameObject : m_dragObjects) { + m_dragStartObjectWorldPositions.push_back( + gameObject != nullptr && gameObject->GetTransform() != nullptr + ? gameObject->GetTransform()->GetPosition() + : Math::Vector3::Zero()); + } RefreshHandleState(); return true; } @@ -268,7 +290,9 @@ bool SceneViewportMoveGizmo::TryBeginDrag(const SceneViewportMoveGizmoContext& c void SceneViewportMoveGizmo::UpdateDrag(const SceneViewportMoveGizmoContext& context) { if (m_dragMode == DragMode::None || context.selectedObject == nullptr || - context.selectedObject->GetID() != m_activeEntityId) { + context.selectedObject->GetID() != m_activeEntityId || + m_dragObjects.empty() || + m_dragObjects.size() != m_dragStartObjectWorldPositions.size()) { return; } @@ -290,17 +314,28 @@ void SceneViewportMoveGizmo::UpdateDrag(const SceneViewportMoveGizmoContext& con if (m_dragMode == DragMode::Axis) { const float currentAxisScalar = Math::Vector3::Dot(hitPoint - m_dragStartPivotWorldPosition, m_activeAxisDirection); const float deltaScalar = currentAxisScalar - m_dragStartAxisScalar; - context.selectedObject->GetTransform()->SetPosition( - m_dragStartObjectWorldPosition + m_activeAxisDirection * deltaScalar); + const Math::Vector3 worldDelta = m_activeAxisDirection * deltaScalar; + for (size_t index = 0; index < m_dragObjects.size(); ++index) { + if (m_dragObjects[index] == nullptr || m_dragObjects[index]->GetTransform() == nullptr) { + continue; + } + m_dragObjects[index]->GetTransform()->SetPosition( + m_dragStartObjectWorldPositions[index] + worldDelta); + } return; } if (m_dragMode == DragMode::Plane) { - const Math::Vector3 planeDelta = Math::Vector3::ProjectOnPlane( + const Math::Vector3 worldDelta = Math::Vector3::ProjectOnPlane( hitPoint - m_dragStartHitWorldPosition, m_activePlaneNormal); - context.selectedObject->GetTransform()->SetPosition( - m_dragStartObjectWorldPosition + planeDelta); + for (size_t index = 0; index < m_dragObjects.size(); ++index) { + if (m_dragObjects[index] == nullptr || m_dragObjects[index]->GetTransform() == nullptr) { + continue; + } + m_dragObjects[index]->GetTransform()->SetPosition( + m_dragStartObjectWorldPositions[index] + worldDelta); + } } } @@ -319,10 +354,11 @@ void SceneViewportMoveGizmo::EndDrag(IUndoManager& undoManager) { m_activeEntityId = 0; m_activeAxisDirection = Math::Vector3::Zero(); m_activePlaneNormal = Math::Vector3::Zero(); - m_dragStartObjectWorldPosition = Math::Vector3::Zero(); m_dragStartPivotWorldPosition = Math::Vector3::Zero(); m_dragStartHitWorldPosition = Math::Vector3::Zero(); m_dragStartAxisScalar = 0.0f; + m_dragObjects.clear(); + m_dragStartObjectWorldPositions.clear(); RefreshHandleState(); } @@ -337,10 +373,11 @@ void SceneViewportMoveGizmo::CancelDrag(IUndoManager* undoManager) { m_activeEntityId = 0; m_activeAxisDirection = Math::Vector3::Zero(); m_activePlaneNormal = Math::Vector3::Zero(); - m_dragStartObjectWorldPosition = Math::Vector3::Zero(); m_dragStartPivotWorldPosition = Math::Vector3::Zero(); m_dragStartHitWorldPosition = Math::Vector3::Zero(); m_dragStartAxisScalar = 0.0f; + m_dragObjects.clear(); + m_dragStartObjectWorldPositions.clear(); m_hoveredAxis = SceneViewportGizmoAxis::None; m_hoveredPlane = SceneViewportGizmoPlane::None; RefreshHandleState(); @@ -363,19 +400,74 @@ const SceneViewportMoveGizmoDrawData& SceneViewportMoveGizmo::GetDrawData() cons return m_drawData; } +SceneViewportMoveGizmoHitResult SceneViewportMoveGizmo::EvaluateHit(const Math::Vector2& mousePosition) const { + SceneViewportMoveGizmoHitResult result = {}; + if (!m_drawData.visible) { + return result; + } + + const float hoverThresholdSq = kMoveGizmoHoverThresholdPixels * kMoveGizmoHoverThresholdPixels; + for (const SceneViewportMoveGizmoHandleDrawData& handle : m_drawData.handles) { + if (!handle.visible) { + continue; + } + + const float distanceSq = DistanceToSegmentSquared(mousePosition, handle.start, handle.end); + if (distanceSq > result.distanceSq || distanceSq > hoverThresholdSq) { + continue; + } + + result.axis = handle.axis; + result.plane = SceneViewportGizmoPlane::None; + result.distanceSq = distanceSq; + } + + if (result.axis != SceneViewportGizmoAxis::None) { + return result; + } + + for (const SceneViewportMoveGizmoPlaneDrawData& plane : m_drawData.planes) { + if (!plane.visible || !PointInQuad(mousePosition, plane.corners)) { + continue; + } + + const float distanceSq = (QuadCenter(plane.corners) - mousePosition).SqrMagnitude(); + if (distanceSq >= result.distanceSq) { + continue; + } + + result.axis = SceneViewportGizmoAxis::None; + result.plane = plane.plane; + result.distanceSq = distanceSq; + } + + return result; +} + +void SceneViewportMoveGizmo::SetHoveredHandle( + SceneViewportGizmoAxis axis, + SceneViewportGizmoPlane plane) { + if (m_dragMode != DragMode::None) { + return; + } + + m_hoveredAxis = axis; + m_hoveredPlane = axis == SceneViewportGizmoAxis::None ? plane : SceneViewportGizmoPlane::None; + RefreshHandleState(); +} + void SceneViewportMoveGizmo::BuildDrawData(const SceneViewportMoveGizmoContext& context) { m_drawData = {}; m_drawData.pivotRadius = 5.0f; - const Components::GameObject* selectedObject = context.selectedObject; - if (selectedObject == nullptr || + if ((context.selectedObject == nullptr && context.selectedObjects.empty()) || !context.overlay.valid || context.viewportSize.x <= 1.0f || context.viewportSize.y <= 1.0f) { return; } - const Math::Vector3 gizmoWorldOrigin = selectedObject->GetTransform()->GetPosition(); + const Math::Vector3 gizmoWorldOrigin = context.pivotWorldPosition; const SceneViewportProjectedPoint projectedPivot = ProjectSceneViewportWorldPoint( context.overlay, context.viewportSize.x, @@ -411,7 +503,7 @@ void SceneViewportMoveGizmo::BuildDrawData(const SceneViewportMoveGizmoContext& handle.start = projectedPivot.screenPosition; const Math::Vector3 axisEndWorld = - gizmoWorldOrigin + GetAxisVector(handle.axis) * axisLengthWorld; + gizmoWorldOrigin + GetAxisVector(handle.axis, context.axisOrientation) * axisLengthWorld; const SceneViewportProjectedPoint projectedEnd = ProjectSceneViewportWorldPoint( context.overlay, context.viewportSize.x, @@ -436,7 +528,7 @@ void SceneViewportMoveGizmo::BuildDrawData(const SceneViewportMoveGizmoContext& Math::Vector3 axisA = Math::Vector3::Zero(); Math::Vector3 axisB = Math::Vector3::Zero(); - GetPlaneAxes(plane.plane, axisA, axisB); + GetPlaneAxes(plane.plane, context.axisOrientation, axisA, axisB); if (axisA.SqrMagnitude() <= Math::EPSILON || axisB.SqrMagnitude() <= Math::EPSILON) { continue; } @@ -502,55 +594,5 @@ void SceneViewportMoveGizmo::RefreshHandleState() { } } -SceneViewportGizmoAxis SceneViewportMoveGizmo::HitTestAxis(const Math::Vector2& mousePosition) const { - if (!m_drawData.visible) { - return SceneViewportGizmoAxis::None; - } - - const float hoverThresholdSq = kMoveGizmoHoverThresholdPixels * kMoveGizmoHoverThresholdPixels; - SceneViewportGizmoAxis bestAxis = SceneViewportGizmoAxis::None; - float bestDistanceSq = hoverThresholdSq; - - for (const SceneViewportMoveGizmoHandleDrawData& handle : m_drawData.handles) { - if (!handle.visible) { - continue; - } - - const float distanceSq = DistanceToSegmentSquared(mousePosition, handle.start, handle.end); - if (distanceSq > bestDistanceSq) { - continue; - } - - bestDistanceSq = distanceSq; - bestAxis = handle.axis; - } - - return bestAxis; -} - -SceneViewportGizmoPlane SceneViewportMoveGizmo::HitTestPlane(const Math::Vector2& mousePosition) const { - if (!m_drawData.visible) { - return SceneViewportGizmoPlane::None; - } - - SceneViewportGizmoPlane bestPlane = SceneViewportGizmoPlane::None; - float bestDistanceSq = Math::FLOAT_MAX; - for (const SceneViewportMoveGizmoPlaneDrawData& plane : m_drawData.planes) { - if (!plane.visible || !PointInQuad(mousePosition, plane.corners)) { - continue; - } - - const float distanceSq = (QuadCenter(plane.corners) - mousePosition).SqrMagnitude(); - if (distanceSq >= bestDistanceSq) { - continue; - } - - bestDistanceSq = distanceSq; - bestPlane = plane.plane; - } - - return bestPlane; -} - } // namespace Editor } // namespace XCEngine diff --git a/editor/src/Viewport/SceneViewportMoveGizmo.h b/editor/src/Viewport/SceneViewportMoveGizmo.h index 524ed170..34f49144 100644 --- a/editor/src/Viewport/SceneViewportMoveGizmo.h +++ b/editor/src/Viewport/SceneViewportMoveGizmo.h @@ -4,11 +4,13 @@ #include #include +#include #include #include #include #include +#include namespace XCEngine { namespace Components { @@ -66,6 +68,19 @@ struct SceneViewportMoveGizmoContext { Math::Vector2 viewportSize = Math::Vector2::Zero(); Math::Vector2 mousePosition = Math::Vector2::Zero(); Components::GameObject* selectedObject = nullptr; + std::vector selectedObjects = {}; + Math::Vector3 pivotWorldPosition = Math::Vector3::Zero(); + Math::Quaternion axisOrientation = Math::Quaternion::Identity(); +}; + +struct SceneViewportMoveGizmoHitResult { + SceneViewportGizmoAxis axis = SceneViewportGizmoAxis::None; + SceneViewportGizmoPlane plane = SceneViewportGizmoPlane::None; + float distanceSq = Math::FLOAT_MAX; + + bool HasHit() const { + return axis != SceneViewportGizmoAxis::None || plane != SceneViewportGizmoPlane::None; + } }; class SceneViewportMoveGizmo { @@ -80,6 +95,8 @@ public: bool IsActive() const; uint64_t GetActiveEntityId() const; const SceneViewportMoveGizmoDrawData& GetDrawData() const; + SceneViewportMoveGizmoHitResult EvaluateHit(const Math::Vector2& mousePosition) const; + void SetHoveredHandle(SceneViewportGizmoAxis axis, SceneViewportGizmoPlane plane); private: enum class DragMode : uint8_t { @@ -90,8 +107,6 @@ private: void BuildDrawData(const SceneViewportMoveGizmoContext& context); void RefreshHandleState(); - SceneViewportGizmoAxis HitTestAxis(const Math::Vector2& mousePosition) const; - SceneViewportGizmoPlane HitTestPlane(const Math::Vector2& mousePosition) const; SceneViewportMoveGizmoDrawData m_drawData = {}; SceneViewportGizmoAxis m_hoveredAxis = SceneViewportGizmoAxis::None; @@ -103,10 +118,11 @@ private: Math::Vector3 m_activeAxisDirection = Math::Vector3::Zero(); Math::Vector3 m_activePlaneNormal = Math::Vector3::Zero(); Math::Plane m_dragPlane = {}; - Math::Vector3 m_dragStartObjectWorldPosition = Math::Vector3::Zero(); Math::Vector3 m_dragStartPivotWorldPosition = Math::Vector3::Zero(); Math::Vector3 m_dragStartHitWorldPosition = Math::Vector3::Zero(); float m_dragStartAxisScalar = 0.0f; + std::vector m_dragObjects = {}; + std::vector m_dragStartObjectWorldPositions = {}; }; } // namespace Editor diff --git a/editor/src/Viewport/SceneViewportOverlayBuilder.cpp b/editor/src/Viewport/SceneViewportOverlayBuilder.cpp new file mode 100644 index 00000000..3172e202 --- /dev/null +++ b/editor/src/Viewport/SceneViewportOverlayBuilder.cpp @@ -0,0 +1,431 @@ +#include "SceneViewportOverlayBuilder.h" + +#include "Core/IEditorContext.h" +#include "Core/ISceneManager.h" +#include "SceneViewportOverlayHandleBuilder.h" +#include "SceneViewportMath.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace XCEngine { +namespace Editor { + +namespace { + +bool CanBuildOverlayForGameObject(const Components::GameObject* gameObject) { + return gameObject != nullptr && + gameObject->GetTransform() != nullptr && + gameObject->IsActiveInHierarchy(); +} + +float ResolveCameraAspect( + const Components::CameraComponent& camera, + uint32_t viewportWidth, + uint32_t viewportHeight) { + const Math::Rect viewportRect = camera.GetViewportRect(); + const float resolvedWidth = static_cast(viewportWidth) * + (viewportRect.width > Math::EPSILON ? viewportRect.width : 1.0f); + const float resolvedHeight = static_cast(viewportHeight) * + (viewportRect.height > Math::EPSILON ? viewportRect.height : 1.0f); + return resolvedHeight > Math::EPSILON + ? resolvedWidth / resolvedHeight + : 1.0f; +} + +float ComputeWorldUnitsPerPixel( + const SceneViewportOverlayData& overlay, + const Math::Vector3& worldPoint, + uint32_t viewportHeight) { + if (!overlay.valid || viewportHeight <= 1u) { + return 0.0f; + } + + const Math::Vector3 cameraForward = overlay.cameraForward.Normalized(); + const float depth = Math::Vector3::Dot(worldPoint - overlay.cameraPosition, cameraForward); + if (depth <= Math::EPSILON) { + return 0.0f; + } + + return 2.0f * depth * std::tan(overlay.verticalFovDegrees * Math::DEG_TO_RAD * 0.5f) / + static_cast(viewportHeight); +} + +void AppendWorldLine( + SceneViewportOverlayFrameData& frameData, + const Math::Vector3& startWorld, + const Math::Vector3& endWorld, + const Math::Color& color, + float thicknessPixels, + SceneViewportOverlayDepthMode depthMode) { + SceneViewportOverlayLinePrimitive& line = frameData.worldLines.emplace_back(); + line.startWorld = startWorld; + line.endWorld = endWorld; + line.color = color; + line.thicknessPixels = thicknessPixels; + line.depthMode = depthMode; +} + +void AppendWorldSprite( + SceneViewportOverlayFrameData& frameData, + const Math::Vector3& worldPosition, + const Math::Vector2& sizePixels, + const Math::Color& tintColor, + float sortDepth, + uint64_t entityId, + SceneViewportOverlaySpriteTextureKind textureKind, + SceneViewportOverlayDepthMode depthMode) { + if (entityId == 0 || sizePixels.x <= Math::EPSILON || sizePixels.y <= Math::EPSILON) { + return; + } + + SceneViewportOverlaySpritePrimitive& sprite = frameData.worldSprites.emplace_back(); + sprite.worldPosition = worldPosition; + sprite.sizePixels = sizePixels; + sprite.tintColor = tintColor; + sprite.sortDepth = sortDepth; + sprite.entityId = entityId; + sprite.textureKind = textureKind; + sprite.depthMode = depthMode; +} + +void AppendHandleRecord( + SceneViewportOverlayFrameData& frameData, + SceneViewportOverlayHandleKind kind, + uint64_t handleId, + uint64_t entityId, + const Math::Vector3& worldPosition, + const Math::Vector2& sizePixels, + float sortDepth) { + if (kind == SceneViewportOverlayHandleKind::None || + handleId == 0 || + entityId == 0 || + sizePixels.x <= Math::EPSILON || + sizePixels.y <= Math::EPSILON) { + return; + } + + SceneViewportOverlayHandleRecord& handleRecord = frameData.handleRecords.emplace_back(); + handleRecord.kind = kind; + handleRecord.handleId = handleId; + handleRecord.entityId = entityId; + handleRecord.shape = SceneViewportOverlayHandleShape::WorldRect; + handleRecord.priority = Detail::kSceneViewportHandlePrioritySceneIcon; + handleRecord.worldPosition = worldPosition; + handleRecord.sizePixels = sizePixels; + handleRecord.sortDepth = sortDepth; +} + +void AppendSceneIconOverlay( + SceneViewportOverlayFrameData& frameData, + const SceneViewportOverlayData& overlay, + uint32_t viewportWidth, + uint32_t viewportHeight, + const Components::GameObject& gameObject, + const Math::Vector2& sizePixels, + SceneViewportOverlaySpriteTextureKind textureKind) { + const Components::TransformComponent* transform = gameObject.GetTransform(); + if (transform == nullptr) { + return; + } + + const SceneViewportProjectedPoint projectedPoint = ProjectSceneViewportWorldPoint( + overlay, + static_cast(viewportWidth), + static_cast(viewportHeight), + transform->GetPosition()); + if (!projectedPoint.visible) { + return; + } + + AppendWorldSprite( + frameData, + transform->GetPosition(), + sizePixels, + Math::Color::White(), + projectedPoint.ndcDepth, + gameObject.GetID(), + textureKind, + SceneViewportOverlayDepthMode::AlwaysOnTop); + AppendHandleRecord( + frameData, + SceneViewportOverlayHandleKind::SceneIcon, + gameObject.GetID(), + gameObject.GetID(), + transform->GetPosition(), + sizePixels, + projectedPoint.ndcDepth); +} + +void AppendCameraFrustumOverlay( + SceneViewportOverlayFrameData& frameData, + const Components::CameraComponent& camera, + const Components::GameObject& gameObject, + uint32_t viewportWidth, + uint32_t viewportHeight) { + const Components::TransformComponent* transform = gameObject.GetTransform(); + if (transform == nullptr) { + return; + } + + const Math::Vector3 position = transform->GetPosition(); + const Math::Vector3 forward = transform->GetForward().Normalized(); + const Math::Vector3 right = transform->GetRight().Normalized(); + const Math::Vector3 up = transform->GetUp().Normalized(); + if (forward.SqrMagnitude() <= Math::EPSILON || + right.SqrMagnitude() <= Math::EPSILON || + up.SqrMagnitude() <= Math::EPSILON) { + return; + } + + const float nearClip = (std::max)(camera.GetNearClipPlane(), 0.01f); + const float farClip = (std::max)(camera.GetFarClipPlane(), nearClip + 0.01f); + const float aspect = ResolveCameraAspect(camera, viewportWidth, viewportHeight); + + float nearHalfHeight = 0.0f; + float nearHalfWidth = 0.0f; + float farHalfHeight = 0.0f; + float farHalfWidth = 0.0f; + if (camera.GetProjectionType() == Components::CameraProjectionType::Perspective) { + const float halfFovRadians = + std::clamp(camera.GetFieldOfView(), 1.0f, 179.0f) * Math::DEG_TO_RAD * 0.5f; + nearHalfHeight = std::tan(halfFovRadians) * nearClip; + nearHalfWidth = nearHalfHeight * aspect; + farHalfHeight = std::tan(halfFovRadians) * farClip; + farHalfWidth = farHalfHeight * aspect; + } else { + const float halfHeight = (std::max)(camera.GetOrthographicSize(), 0.01f); + const float halfWidth = halfHeight * aspect; + nearHalfHeight = halfHeight; + nearHalfWidth = halfWidth; + farHalfHeight = halfHeight; + farHalfWidth = halfWidth; + } + + const Math::Vector3 nearCenter = position + forward * nearClip; + const Math::Vector3 farCenter = position + forward * farClip; + const std::array corners = {{ + nearCenter + up * nearHalfHeight - right * nearHalfWidth, + nearCenter + up * nearHalfHeight + right * nearHalfWidth, + nearCenter - up * nearHalfHeight + right * nearHalfWidth, + nearCenter - up * nearHalfHeight - right * nearHalfWidth, + farCenter + up * farHalfHeight - right * farHalfWidth, + farCenter + up * farHalfHeight + right * farHalfWidth, + farCenter - up * farHalfHeight + right * farHalfWidth, + farCenter - up * farHalfHeight - right * farHalfWidth + }}; + + static constexpr std::array, 12> kFrustumEdges = {{ + { 0u, 1u }, { 1u, 2u }, { 2u, 3u }, { 3u, 0u }, + { 4u, 5u }, { 5u, 6u }, { 6u, 7u }, { 7u, 4u }, + { 0u, 4u }, { 1u, 5u }, { 2u, 6u }, { 3u, 7u } + }}; + constexpr Math::Color kFrustumColor(1.0f, 1.0f, 1.0f, 1.0f); + + for (const auto& edge : kFrustumEdges) { + AppendWorldLine( + frameData, + corners[edge.first], + corners[edge.second], + kFrustumColor, + 1.6f, + SceneViewportOverlayDepthMode::AlwaysOnTop); + } +} + +void AppendDirectionalLightOverlay( + SceneViewportOverlayFrameData& frameData, + const Components::GameObject& gameObject, + const SceneViewportOverlayData& overlay, + uint32_t viewportHeight) { + const Components::TransformComponent* transform = gameObject.GetTransform(); + if (transform == nullptr) { + return; + } + + const Math::Vector3 position = transform->GetPosition(); + const Math::Vector3 lightDirection = (transform->GetForward() * -1.0f).Normalized(); + const Math::Vector3 right = transform->GetRight().Normalized(); + const Math::Vector3 up = transform->GetUp().Normalized(); + if (lightDirection.SqrMagnitude() <= Math::EPSILON || + right.SqrMagnitude() <= Math::EPSILON || + up.SqrMagnitude() <= Math::EPSILON) { + return; + } + + const float worldUnitsPerPixel = ComputeWorldUnitsPerPixel(overlay, position, viewportHeight); + if (worldUnitsPerPixel <= Math::EPSILON) { + return; + } + + constexpr Math::Color kDirectionalLightColor(1.0f, 0.92f, 0.24f, 1.0f); + constexpr float kLineThickness = 1.8f; + constexpr size_t kRingSegmentCount = 32; + constexpr std::array kRayAngles = {{ + 0.0f, + Math::PI / 3.0f, + Math::PI * 2.0f / 3.0f, + Math::PI, + Math::PI * 4.0f / 3.0f, + Math::PI * 5.0f / 3.0f + }}; + + const float ringRadius = worldUnitsPerPixel * 26.0f; + const float ringOffset = worldUnitsPerPixel * 54.0f; + const float innerRayRadius = ringRadius * 0.52f; + const float rayLength = worldUnitsPerPixel * 96.0f; + const Math::Vector3 ringCenter = position + lightDirection * ringOffset; + + for (size_t segmentIndex = 0; segmentIndex < kRingSegmentCount; ++segmentIndex) { + const float angle0 = + static_cast(segmentIndex) / static_cast(kRingSegmentCount) * Math::PI * 2.0f; + const float angle1 = + static_cast(segmentIndex + 1u) / static_cast(kRingSegmentCount) * Math::PI * 2.0f; + const Math::Vector3 p0 = + ringCenter + right * std::cos(angle0) * ringRadius + up * std::sin(angle0) * ringRadius; + const Math::Vector3 p1 = + ringCenter + right * std::cos(angle1) * ringRadius + up * std::sin(angle1) * ringRadius; + AppendWorldLine( + frameData, + p0, + p1, + kDirectionalLightColor, + kLineThickness, + SceneViewportOverlayDepthMode::AlwaysOnTop); + } + + AppendWorldLine( + frameData, + position, + ringCenter, + kDirectionalLightColor, + kLineThickness, + SceneViewportOverlayDepthMode::AlwaysOnTop); + AppendWorldLine( + frameData, + ringCenter, + ringCenter + lightDirection * rayLength, + kDirectionalLightColor, + kLineThickness, + SceneViewportOverlayDepthMode::AlwaysOnTop); + + for (float angle : kRayAngles) { + const Math::Vector3 rayStart = + ringCenter + right * std::cos(angle) * innerRayRadius + up * std::sin(angle) * innerRayRadius; + AppendWorldLine( + frameData, + rayStart, + rayStart + lightDirection * rayLength, + kDirectionalLightColor, + kLineThickness, + SceneViewportOverlayDepthMode::AlwaysOnTop); + } +} + +void AppendSceneObjectIconOverlays( + SceneViewportOverlayFrameData& frameData, + const Components::Scene& scene, + const SceneViewportOverlayData& overlay, + uint32_t viewportWidth, + uint32_t viewportHeight) { + constexpr Math::Vector2 kCameraIconSize(90.0f, 90.0f); + constexpr Math::Vector2 kLightIconSize(100.0f, 100.0f); + + for (Components::CameraComponent* camera : scene.FindObjectsOfType()) { + if (camera == nullptr || !camera->IsEnabled()) { + continue; + } + + Components::GameObject* gameObject = camera->GetGameObject(); + if (!CanBuildOverlayForGameObject(gameObject)) { + continue; + } + + AppendSceneIconOverlay( + frameData, + overlay, + viewportWidth, + viewportHeight, + *gameObject, + kCameraIconSize, + SceneViewportOverlaySpriteTextureKind::Camera); + } + + for (Components::LightComponent* light : scene.FindObjectsOfType()) { + if (light == nullptr || !light->IsEnabled()) { + continue; + } + + Components::GameObject* gameObject = light->GetGameObject(); + if (!CanBuildOverlayForGameObject(gameObject)) { + continue; + } + + AppendSceneIconOverlay( + frameData, + overlay, + viewportWidth, + viewportHeight, + *gameObject, + kLightIconSize, + SceneViewportOverlaySpriteTextureKind::Light); + } +} + +} // namespace + +SceneViewportOverlayFrameData SceneViewportOverlayBuilder::Build( + IEditorContext& context, + const SceneViewportOverlayData& overlay, + uint32_t viewportWidth, + uint32_t viewportHeight, + const std::vector& selectedObjectIds) { + SceneViewportOverlayFrameData frameData = {}; + frameData.overlay = overlay; + if (!overlay.valid || viewportWidth == 0u || viewportHeight == 0u) { + return frameData; + } + + const Components::Scene* scene = context.GetSceneManager().GetScene(); + if (scene == nullptr) { + return frameData; + } + + AppendSceneObjectIconOverlays(frameData, *scene, overlay, viewportWidth, viewportHeight); + + for (uint64_t entityId : selectedObjectIds) { + if (entityId == 0) { + continue; + } + + Components::GameObject* gameObject = context.GetSceneManager().GetEntity(entityId); + if (!CanBuildOverlayForGameObject(gameObject)) { + continue; + } + + if (Components::CameraComponent* camera = gameObject->GetComponent(); + camera != nullptr && camera->IsEnabled()) { + AppendCameraFrustumOverlay(frameData, *camera, *gameObject, viewportWidth, viewportHeight); + } + + if (Components::LightComponent* light = gameObject->GetComponent(); + light != nullptr && + light->IsEnabled() && + light->GetLightType() == Components::LightType::Directional) { + AppendDirectionalLightOverlay(frameData, *gameObject, overlay, viewportHeight); + } + } + + return frameData; +} + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Viewport/SceneViewportOverlayBuilder.h b/editor/src/Viewport/SceneViewportOverlayBuilder.h new file mode 100644 index 00000000..b68a1139 --- /dev/null +++ b/editor/src/Viewport/SceneViewportOverlayBuilder.h @@ -0,0 +1,25 @@ +#pragma once + +#include "IViewportHostService.h" +#include "SceneViewportEditorOverlayData.h" + +#include +#include + +namespace XCEngine { +namespace Editor { + +class IEditorContext; + +class SceneViewportOverlayBuilder { +public: + static SceneViewportOverlayFrameData Build( + IEditorContext& context, + const SceneViewportOverlayData& overlay, + uint32_t viewportWidth, + uint32_t viewportHeight, + const std::vector& selectedObjectIds); +}; + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Viewport/SceneViewportOverlayHandleBuilder.h b/editor/src/Viewport/SceneViewportOverlayHandleBuilder.h new file mode 100644 index 00000000..80e24a8f --- /dev/null +++ b/editor/src/Viewport/SceneViewportOverlayHandleBuilder.h @@ -0,0 +1,543 @@ +#pragma once + +#include "SceneViewportEditorOverlayData.h" +#include "SceneViewportMoveGizmo.h" +#include "SceneViewportRotateGizmo.h" +#include "SceneViewportScaleGizmo.h" + +#include +#include + +namespace XCEngine { +namespace Editor { + +struct SceneViewportTransformGizmoHandleBuildInputs { + const SceneViewportMoveGizmoDrawData* moveGizmo = nullptr; + uint64_t moveEntityId = 0; + const SceneViewportRotateGizmoDrawData* rotateGizmo = nullptr; + uint64_t rotateEntityId = 0; + const SceneViewportScaleGizmoDrawData* scaleGizmo = nullptr; + uint64_t scaleEntityId = 0; +}; + +inline SceneViewportTransformGizmoHandleBuildInputs BuildSceneViewportTransformGizmoHandleBuildInputs( + bool showingMoveGizmo, + const SceneViewportMoveGizmo& moveGizmo, + const SceneViewportMoveGizmoContext& moveGizmoContext, + bool showingRotateGizmo, + const SceneViewportRotateGizmo& rotateGizmo, + const SceneViewportRotateGizmoContext& rotateGizmoContext, + bool showingScaleGizmo, + const SceneViewportScaleGizmo& scaleGizmo, + const SceneViewportScaleGizmoContext& scaleGizmoContext) { + SceneViewportTransformGizmoHandleBuildInputs inputs = {}; + if (showingMoveGizmo && moveGizmoContext.selectedObject != nullptr) { + inputs.moveGizmo = &moveGizmo.GetDrawData(); + inputs.moveEntityId = moveGizmoContext.selectedObject->GetID(); + } + if (showingRotateGizmo && rotateGizmoContext.selectedObject != nullptr) { + inputs.rotateGizmo = &rotateGizmo.GetDrawData(); + inputs.rotateEntityId = rotateGizmoContext.selectedObject->GetID(); + } + if (showingScaleGizmo && scaleGizmoContext.selectedObject != nullptr) { + inputs.scaleGizmo = &scaleGizmo.GetDrawData(); + inputs.scaleEntityId = scaleGizmoContext.selectedObject->GetID(); + } + + return inputs; +} + +namespace Detail { + +inline constexpr int kSceneViewportHandlePrioritySceneIcon = 100; +inline constexpr int kSceneViewportHandlePriorityRotateAxis = 311; +inline constexpr int kSceneViewportHandlePriorityMovePlane = 321; +inline constexpr int kSceneViewportHandlePriorityMoveAxis = 322; +inline constexpr int kSceneViewportHandlePriorityScaleAxisLine = 331; +inline constexpr int kSceneViewportHandlePriorityScaleAxisCap = 332; +inline constexpr int kSceneViewportHandlePriorityScaleUniform = 333; + +inline constexpr float kSceneViewportMoveAxisHitThicknessPixels = 10.0f; +inline constexpr float kSceneViewportRotateAxisHitThicknessPixels = 9.0f; +inline constexpr float kSceneViewportScaleAxisHitThicknessPixels = 10.0f; +inline constexpr float kSceneViewportScaleCapHitPaddingPixels = 2.0f; + +inline constexpr float kSceneViewportMoveArrowLengthPixels = 14.0f; +inline constexpr float kSceneViewportMoveArrowHalfWidthPixels = 7.0f; + +inline Math::Color WithAlpha(const Math::Color& color, float alpha) { + return Math::Color(color.r, color.g, color.b, alpha); +} + +inline Math::Color LerpColor(const Math::Color& a, const Math::Color& b, float t) { + return Math::Color( + a.r + (b.r - a.r) * t, + a.g + (b.g - a.g) * t, + a.b + (b.b - a.b) * t, + a.a + (b.a - a.a) * t); +} + +inline Math::Vector2 NormalizeVector2( + const Math::Vector2& value, + const Math::Vector2& fallback = Math::Vector2(1.0f, 0.0f)) { + const float lengthSq = value.SqrMagnitude(); + if (lengthSq <= Math::EPSILON) { + return fallback; + } + + return value / std::sqrt(lengthSq); +} + +inline void AppendScreenTriangle( + SceneViewportOverlayFrameData& frameData, + const Math::Vector2& a, + const Math::Vector2& b, + const Math::Vector2& c, + const Math::Color& color, + SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop) { + SceneViewportOverlayScreenTrianglePrimitive& triangle = frameData.screenTriangles.emplace_back(); + triangle.vertices[0].screenPosition = a; + triangle.vertices[0].color = color; + triangle.vertices[1].screenPosition = b; + triangle.vertices[1].color = color; + triangle.vertices[2].screenPosition = c; + triangle.vertices[2].color = color; + triangle.depthMode = depthMode; +} + +inline void AppendScreenQuad( + SceneViewportOverlayFrameData& frameData, + const Math::Vector2& a, + const Math::Vector2& b, + const Math::Vector2& c, + const Math::Vector2& d, + const Math::Color& color, + SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop) { + AppendScreenTriangle(frameData, a, b, c, color, depthMode); + AppendScreenTriangle(frameData, a, c, d, color, depthMode); +} + +inline void AppendScreenRect( + SceneViewportOverlayFrameData& frameData, + const Math::Vector2& center, + const Math::Vector2& halfSize, + const Math::Color& color, + SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop) { + AppendScreenQuad( + frameData, + Math::Vector2(center.x - halfSize.x, center.y - halfSize.y), + Math::Vector2(center.x + halfSize.x, center.y - halfSize.y), + Math::Vector2(center.x + halfSize.x, center.y + halfSize.y), + Math::Vector2(center.x - halfSize.x, center.y + halfSize.y), + color, + depthMode); +} + +inline void AppendScreenSegmentQuad( + SceneViewportOverlayFrameData& frameData, + const Math::Vector2& start, + const Math::Vector2& end, + float thicknessPixels, + const Math::Color& color, + SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop) { + const Math::Vector2 delta = end - start; + if (delta.SqrMagnitude() <= Math::EPSILON || thicknessPixels <= Math::EPSILON) { + return; + } + + const Math::Vector2 direction = NormalizeVector2(delta); + const Math::Vector2 normal(-direction.y, direction.x); + const Math::Vector2 offset = normal * (thicknessPixels * 0.5f); + AppendScreenQuad( + frameData, + start + offset, + start - offset, + end - offset, + end + offset, + color, + depthMode); +} + +inline void AppendScreenQuadOutline( + SceneViewportOverlayFrameData& frameData, + const std::array& corners, + float thicknessPixels, + const Math::Color& color) { + for (size_t index = 0; index < corners.size(); ++index) { + AppendScreenSegmentQuad( + frameData, + corners[index], + corners[(index + 1u) % corners.size()], + thicknessPixels, + color); + } +} + +inline void AppendScreenRectOutline( + SceneViewportOverlayFrameData& frameData, + const Math::Vector2& center, + const Math::Vector2& halfSize, + float thicknessPixels, + const Math::Color& color) { + const std::array corners = {{ + Math::Vector2(center.x - halfSize.x, center.y - halfSize.y), + Math::Vector2(center.x + halfSize.x, center.y - halfSize.y), + Math::Vector2(center.x + halfSize.x, center.y + halfSize.y), + Math::Vector2(center.x - halfSize.x, center.y + halfSize.y) + }}; + AppendScreenQuadOutline(frameData, corners, thicknessPixels, color); +} + +inline void AppendMoveGizmoHandleRecords( + SceneViewportOverlayFrameData& frameData, + const SceneViewportMoveGizmoDrawData& drawData, + uint64_t entityId) { + if (!drawData.visible || entityId == 0) { + return; + } + + for (const SceneViewportMoveGizmoHandleDrawData& handle : drawData.handles) { + if (!handle.visible || handle.axis == SceneViewportGizmoAxis::None) { + continue; + } + + SceneViewportOverlayHandleRecord& record = frameData.handleRecords.emplace_back(); + record.kind = SceneViewportOverlayHandleKind::MoveAxis; + record.handleId = static_cast(handle.axis); + record.entityId = entityId; + record.shape = SceneViewportOverlayHandleShape::ScreenSegment; + record.priority = kSceneViewportHandlePriorityMoveAxis; + record.screenStart = handle.start; + record.screenEnd = handle.end; + record.hitThicknessPixels = kSceneViewportMoveAxisHitThicknessPixels; + } + + for (const SceneViewportMoveGizmoPlaneDrawData& plane : drawData.planes) { + if (!plane.visible || plane.plane == SceneViewportGizmoPlane::None) { + continue; + } + + SceneViewportOverlayHandleRecord& record = frameData.handleRecords.emplace_back(); + record.kind = SceneViewportOverlayHandleKind::MovePlane; + record.handleId = static_cast(plane.plane); + record.entityId = entityId; + record.shape = SceneViewportOverlayHandleShape::ScreenQuad; + record.priority = kSceneViewportHandlePriorityMovePlane; + record.screenQuad = plane.corners; + } +} + +inline void AppendRotateGizmoHandleRecords( + SceneViewportOverlayFrameData& frameData, + const SceneViewportRotateGizmoDrawData& drawData, + uint64_t entityId) { + if (!drawData.visible || entityId == 0) { + return; + } + + for (const SceneViewportRotateGizmoHandleDrawData& handle : drawData.handles) { + if (!handle.visible || handle.axis == SceneViewportRotateGizmoAxis::None) { + continue; + } + + for (const SceneViewportRotateGizmoSegmentDrawData& segment : handle.segments) { + if (!segment.visible || + (handle.axis != SceneViewportRotateGizmoAxis::View && !segment.frontFacing)) { + continue; + } + + SceneViewportOverlayHandleRecord& record = frameData.handleRecords.emplace_back(); + record.kind = SceneViewportOverlayHandleKind::RotateAxis; + record.handleId = static_cast(handle.axis); + record.entityId = entityId; + record.shape = SceneViewportOverlayHandleShape::ScreenSegment; + record.priority = kSceneViewportHandlePriorityRotateAxis; + record.screenStart = segment.start; + record.screenEnd = segment.end; + record.hitThicknessPixels = kSceneViewportRotateAxisHitThicknessPixels; + } + } +} + +inline void AppendScaleGizmoHandleRecords( + SceneViewportOverlayFrameData& frameData, + const SceneViewportScaleGizmoDrawData& drawData, + uint64_t entityId) { + if (!drawData.visible || entityId == 0) { + return; + } + + if (drawData.centerHandle.visible) { + SceneViewportOverlayHandleRecord& uniformRecord = frameData.handleRecords.emplace_back(); + uniformRecord.kind = SceneViewportOverlayHandleKind::ScaleUniform; + uniformRecord.handleId = static_cast(SceneViewportScaleGizmoHandle::Uniform); + uniformRecord.entityId = entityId; + uniformRecord.shape = SceneViewportOverlayHandleShape::ScreenRect; + uniformRecord.priority = kSceneViewportHandlePriorityScaleUniform; + uniformRecord.screenCenter = drawData.centerHandle.center; + uniformRecord.screenHalfSize = Math::Vector2( + drawData.centerHandle.halfSize + kSceneViewportScaleCapHitPaddingPixels, + drawData.centerHandle.halfSize + kSceneViewportScaleCapHitPaddingPixels); + } + + for (const SceneViewportScaleGizmoAxisHandleDrawData& handle : drawData.axisHandles) { + if (!handle.visible || handle.handle == SceneViewportScaleGizmoHandle::None) { + continue; + } + + SceneViewportOverlayHandleRecord& capRecord = frameData.handleRecords.emplace_back(); + capRecord.kind = SceneViewportOverlayHandleKind::ScaleAxis; + capRecord.handleId = static_cast(handle.handle); + capRecord.entityId = entityId; + capRecord.shape = SceneViewportOverlayHandleShape::ScreenRect; + capRecord.priority = kSceneViewportHandlePriorityScaleAxisCap; + capRecord.screenCenter = handle.capCenter; + capRecord.screenHalfSize = Math::Vector2( + handle.capHalfSize + kSceneViewportScaleCapHitPaddingPixels, + handle.capHalfSize + kSceneViewportScaleCapHitPaddingPixels); + + SceneViewportOverlayHandleRecord& lineRecord = frameData.handleRecords.emplace_back(); + lineRecord.kind = SceneViewportOverlayHandleKind::ScaleAxis; + lineRecord.handleId = static_cast(handle.handle); + lineRecord.entityId = entityId; + lineRecord.shape = SceneViewportOverlayHandleShape::ScreenSegment; + lineRecord.priority = kSceneViewportHandlePriorityScaleAxisLine; + lineRecord.screenStart = handle.start; + lineRecord.screenEnd = handle.end; + lineRecord.hitThicknessPixels = kSceneViewportScaleAxisHitThicknessPixels; + } +} + +inline void AppendMoveGizmoScreenTriangles( + SceneViewportOverlayFrameData& frameData, + const SceneViewportMoveGizmoDrawData& drawData) { + if (!drawData.visible) { + return; + } + + for (const SceneViewportMoveGizmoPlaneDrawData& plane : drawData.planes) { + if (!plane.visible) { + continue; + } + + AppendScreenQuad( + frameData, + plane.corners[0], + plane.corners[1], + plane.corners[2], + plane.corners[3], + plane.fillColor); + AppendScreenQuadOutline( + frameData, + plane.corners, + plane.active ? 2.6f : (plane.hovered ? 2.0f : 1.4f), + plane.outlineColor); + } + + for (const SceneViewportMoveGizmoHandleDrawData& handle : drawData.handles) { + if (!handle.visible) { + continue; + } + + const float thickness = handle.active ? 4.0f : (handle.hovered ? 3.0f : 2.0f); + const Math::Vector2 direction = NormalizeVector2(handle.end - handle.start); + const float arrowLength = + (std::min)(kSceneViewportMoveArrowLengthPixels, (handle.end - handle.start).Magnitude()); + const Math::Vector2 normal(-direction.y, direction.x); + const Math::Vector2 arrowBase = handle.end - direction * arrowLength; + const Math::Vector2 arrowLeft = arrowBase + normal * kSceneViewportMoveArrowHalfWidthPixels; + const Math::Vector2 arrowRight = arrowBase - normal * kSceneViewportMoveArrowHalfWidthPixels; + + AppendScreenSegmentQuad(frameData, handle.start, arrowBase, thickness, handle.color); + AppendScreenTriangle(frameData, handle.end, arrowLeft, arrowRight, handle.color); + } +} + +inline void AppendRotateGizmoHandleScreenTriangles( + SceneViewportOverlayFrameData& frameData, + const SceneViewportRotateGizmoHandleDrawData& handle, + bool frontPass) { + if (!handle.visible) { + return; + } + + const bool isViewHandle = handle.axis == SceneViewportRotateGizmoAxis::View; + if (isViewHandle && !frontPass) { + return; + } + + const float thickness = handle.active ? 3.6f : (handle.hovered ? 3.0f : 2.1f); + for (const SceneViewportRotateGizmoSegmentDrawData& segment : handle.segments) { + if (!segment.visible || (!isViewHandle && segment.frontFacing != frontPass)) { + continue; + } + + Math::Color drawColor = handle.color; + if (!isViewHandle && !frontPass) { + drawColor = LerpColor(handle.color, Math::Color(0.72f, 0.72f, 0.72f, 1.0f), 0.78f); + drawColor = WithAlpha(drawColor, handle.active ? 0.55f : 0.38f); + } else if (isViewHandle) { + drawColor = WithAlpha(drawColor, handle.active ? 0.95f : (handle.hovered ? 0.88f : 0.78f)); + } + + AppendScreenSegmentQuad(frameData, segment.start, segment.end, thickness, drawColor); + } +} + +inline void AppendRotateGizmoAngleFillScreenTriangles( + SceneViewportOverlayFrameData& frameData, + const SceneViewportRotateGizmoAngleFillDrawData& angleFill) { + if (!angleFill.visible || angleFill.arcPointCount < 2u) { + return; + } + + for (size_t index = 0; index + 1u < angleFill.arcPointCount; ++index) { + AppendScreenTriangle( + frameData, + angleFill.pivot, + angleFill.arcPoints[index], + angleFill.arcPoints[index + 1u], + angleFill.fillColor); + } + + for (size_t index = 0; index + 1u < angleFill.arcPointCount; ++index) { + AppendScreenSegmentQuad( + frameData, + angleFill.arcPoints[index], + angleFill.arcPoints[index + 1u], + 2.0f, + angleFill.outlineColor); + } + + AppendScreenSegmentQuad( + frameData, + angleFill.pivot, + angleFill.arcPoints[0], + 1.6f, + angleFill.outlineColor); + AppendScreenSegmentQuad( + frameData, + angleFill.pivot, + angleFill.arcPoints[angleFill.arcPointCount - 1u], + 1.6f, + angleFill.outlineColor); +} + +inline void AppendRotateGizmoScreenTriangles( + SceneViewportOverlayFrameData& frameData, + const SceneViewportRotateGizmoDrawData& drawData) { + if (!drawData.visible) { + return; + } + + for (const SceneViewportRotateGizmoHandleDrawData& handle : drawData.handles) { + if (handle.axis == SceneViewportRotateGizmoAxis::View) { + AppendRotateGizmoHandleScreenTriangles(frameData, handle, true); + } + } + + for (const SceneViewportRotateGizmoHandleDrawData& handle : drawData.handles) { + if (handle.axis != SceneViewportRotateGizmoAxis::View) { + AppendRotateGizmoHandleScreenTriangles(frameData, handle, false); + } + } + + AppendRotateGizmoAngleFillScreenTriangles(frameData, drawData.angleFill); + + for (const SceneViewportRotateGizmoHandleDrawData& handle : drawData.handles) { + if (handle.axis != SceneViewportRotateGizmoAxis::View) { + AppendRotateGizmoHandleScreenTriangles(frameData, handle, true); + } + } +} + +inline void AppendScaleGizmoScreenTriangles( + SceneViewportOverlayFrameData& frameData, + const SceneViewportScaleGizmoDrawData& drawData) { + if (!drawData.visible) { + return; + } + + constexpr Math::Color kScaleCapOutlineColor(24.0f / 255.0f, 24.0f / 255.0f, 24.0f / 255.0f, 220.0f / 255.0f); + + for (const SceneViewportScaleGizmoAxisHandleDrawData& handle : drawData.axisHandles) { + if (!handle.visible) { + continue; + } + + const float thickness = handle.active ? 4.0f : (handle.hovered ? 3.0f : 2.2f); + const Math::Vector2 direction = NormalizeVector2(handle.capCenter - handle.start); + const Math::Vector2 lineEnd = handle.capCenter - direction * handle.capHalfSize; + const Math::Vector2 capHalfSize(handle.capHalfSize, handle.capHalfSize); + AppendScreenSegmentQuad(frameData, handle.start, lineEnd, thickness, handle.color); + AppendScreenRect(frameData, handle.capCenter, capHalfSize, handle.color); + AppendScreenRectOutline( + frameData, + handle.capCenter, + capHalfSize, + handle.active ? 2.0f : 1.0f, + kScaleCapOutlineColor); + } + + if (drawData.centerHandle.visible) { + const Math::Vector2 halfSize(drawData.centerHandle.halfSize, drawData.centerHandle.halfSize); + AppendScreenRect( + frameData, + drawData.centerHandle.center, + halfSize, + drawData.centerHandle.fillColor); + AppendScreenRectOutline( + frameData, + drawData.centerHandle.center, + halfSize, + drawData.centerHandle.active ? 2.0f : 1.0f, + drawData.centerHandle.outlineColor); + } +} + +} // namespace Detail + +inline void AppendTransformGizmoHandleRecords( + SceneViewportOverlayFrameData& frameData, + const SceneViewportTransformGizmoHandleBuildInputs& inputs) { + if (inputs.moveGizmo != nullptr) { + Detail::AppendMoveGizmoHandleRecords(frameData, *inputs.moveGizmo, inputs.moveEntityId); + } + + if (inputs.rotateGizmo != nullptr) { + Detail::AppendRotateGizmoHandleRecords(frameData, *inputs.rotateGizmo, inputs.rotateEntityId); + } + + if (inputs.scaleGizmo != nullptr) { + Detail::AppendScaleGizmoHandleRecords(frameData, *inputs.scaleGizmo, inputs.scaleEntityId); + } +} + +inline void AppendTransformGizmoScreenTriangles( + SceneViewportOverlayFrameData& frameData, + const SceneViewportTransformGizmoHandleBuildInputs& inputs) { + if (inputs.moveGizmo != nullptr) { + Detail::AppendMoveGizmoScreenTriangles(frameData, *inputs.moveGizmo); + } + + if (inputs.rotateGizmo != nullptr) { + Detail::AppendRotateGizmoScreenTriangles(frameData, *inputs.rotateGizmo); + } + + if (inputs.scaleGizmo != nullptr) { + Detail::AppendScaleGizmoScreenTriangles(frameData, *inputs.scaleGizmo); + } +} + +inline SceneViewportOverlayFrameData BuildSceneViewportTransformGizmoOverlayFrameData( + const SceneViewportOverlayData& overlay, + const SceneViewportTransformGizmoHandleBuildInputs& inputs) { + SceneViewportOverlayFrameData frameData = {}; + frameData.overlay = overlay; + AppendTransformGizmoScreenTriangles(frameData, inputs); + AppendTransformGizmoHandleRecords(frameData, inputs); + return frameData; +} + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Viewport/SceneViewportOverlayHitTester.h b/editor/src/Viewport/SceneViewportOverlayHitTester.h new file mode 100644 index 00000000..fc3df571 --- /dev/null +++ b/editor/src/Viewport/SceneViewportOverlayHitTester.h @@ -0,0 +1,186 @@ +#pragma once + +#include "SceneViewportEditorOverlayData.h" +#include "SceneViewportMath.h" + +#include +#include + +namespace XCEngine { +namespace Editor { + +namespace Detail { + +inline bool IsPointInsideSceneViewportScreenRect( + const Math::Vector2& point, + const Math::Vector2& center, + const Math::Vector2& halfSize) { + return std::abs(point.x - center.x) <= halfSize.x && + std::abs(point.y - center.y) <= halfSize.y; +} + +inline Math::Vector2 ComputeSceneViewportScreenQuadCenter( + const std::array& corners) { + Math::Vector2 center = Math::Vector2::Zero(); + for (const Math::Vector2& corner : corners) { + center += corner; + } + return center * 0.25f; +} + +inline bool IsPointInsideSceneViewportScreenQuad( + const Math::Vector2& point, + const std::array& corners) { + float previousCross = 0.0f; + for (size_t index = 0; index < corners.size(); ++index) { + const Math::Vector2 edgeStart = corners[index]; + const Math::Vector2 edgeEnd = corners[(index + 1u) % corners.size()]; + const Math::Vector2 edge = edgeEnd - edgeStart; + const Math::Vector2 toPoint = point - edgeStart; + const float cross = Math::Vector2::Cross(edge, toPoint); + if (std::abs(cross) <= Math::EPSILON) { + continue; + } + + if (previousCross != 0.0f && cross * previousCross < 0.0f) { + return false; + } + + previousCross = cross; + } + + return true; +} + +inline bool TryBuildSceneViewportOverlayHandleHitMetrics( + const SceneViewportOverlayFrameData& frameData, + const Math::Vector2& viewportSize, + const SceneViewportOverlayHandleRecord& handleRecord, + const Math::Vector2& viewportMousePosition, + float& outDistanceSq, + float& outDepth) { + if (!frameData.overlay.valid || + viewportSize.x <= 1.0f || + viewportSize.y <= 1.0f || + handleRecord.kind == SceneViewportOverlayHandleKind::None) { + return false; + } + + switch (handleRecord.shape) { + case SceneViewportOverlayHandleShape::WorldRect: { + if (handleRecord.sizePixels.x <= Math::EPSILON || + handleRecord.sizePixels.y <= Math::EPSILON) { + return false; + } + + const SceneViewportProjectedPoint projectedPoint = ProjectSceneViewportWorldPoint( + frameData.overlay, + viewportSize.x, + viewportSize.y, + handleRecord.worldPosition); + if (!projectedPoint.visible) { + return false; + } + + const Math::Vector2 center = projectedPoint.screenPosition; + const Math::Vector2 halfSize = handleRecord.sizePixels * 0.5f; + if (!IsPointInsideSceneViewportScreenRect(viewportMousePosition, center, halfSize)) { + return false; + } + + outDistanceSq = (center - viewportMousePosition).SqrMagnitude(); + outDepth = projectedPoint.ndcDepth; + return true; + } + case SceneViewportOverlayHandleShape::ScreenSegment: { + if (handleRecord.hitThicknessPixels <= Math::EPSILON || + (handleRecord.screenEnd - handleRecord.screenStart).SqrMagnitude() <= Math::EPSILON) { + return false; + } + + const float maxDistanceSq = handleRecord.hitThicknessPixels * handleRecord.hitThicknessPixels; + const float distanceSq = DistanceToSegmentSquared( + viewportMousePosition, + handleRecord.screenStart, + handleRecord.screenEnd); + if (distanceSq > maxDistanceSq) { + return false; + } + + outDistanceSq = distanceSq; + outDepth = handleRecord.sortDepth; + return true; + } + case SceneViewportOverlayHandleShape::ScreenRect: { + if (handleRecord.screenHalfSize.x <= Math::EPSILON || + handleRecord.screenHalfSize.y <= Math::EPSILON) { + return false; + } + + if (!IsPointInsideSceneViewportScreenRect( + viewportMousePosition, + handleRecord.screenCenter, + handleRecord.screenHalfSize)) { + return false; + } + + outDistanceSq = (handleRecord.screenCenter - viewportMousePosition).SqrMagnitude(); + outDepth = handleRecord.sortDepth; + return true; + } + case SceneViewportOverlayHandleShape::ScreenQuad: { + if (!IsPointInsideSceneViewportScreenQuad(viewportMousePosition, handleRecord.screenQuad)) { + return false; + } + + const Math::Vector2 center = ComputeSceneViewportScreenQuadCenter(handleRecord.screenQuad); + outDistanceSq = (center - viewportMousePosition).SqrMagnitude(); + outDepth = handleRecord.sortDepth; + return true; + } + case SceneViewportOverlayHandleShape::None: + default: + return false; + } +} + +} // namespace Detail + +inline SceneViewportOverlayHandleHitResult HitTestSceneViewportOverlayHandles( + const SceneViewportOverlayFrameData& frameData, + const Math::Vector2& viewportSize, + const Math::Vector2& viewportMousePosition) { + constexpr float kMetricEpsilon = 0.001f; + + SceneViewportOverlayHandleHitResult result = {}; + for (const SceneViewportOverlayHandleRecord& handleRecord : frameData.handleRecords) { + float distanceSq = 0.0f; + float depth = 0.0f; + if (!Detail::TryBuildSceneViewportOverlayHandleHitMetrics( + frameData, + viewportSize, + handleRecord, + viewportMousePosition, + distanceSq, + depth)) { + continue; + } + + if (handleRecord.priority > result.priority || + (handleRecord.priority == result.priority && + (depth + kMetricEpsilon < result.depth || + (std::abs(depth - result.depth) <= kMetricEpsilon && distanceSq < result.distanceSq)))) { + result.kind = handleRecord.kind; + result.handleId = handleRecord.handleId; + result.entityId = handleRecord.entityId; + result.priority = handleRecord.priority; + result.distanceSq = distanceSq; + result.depth = depth; + } + } + + return result; +} + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Viewport/SceneViewportOverlayRenderer.cpp b/editor/src/Viewport/SceneViewportOverlayRenderer.cpp index dfa0df7f..fe6c7526 100644 --- a/editor/src/Viewport/SceneViewportOverlayRenderer.cpp +++ b/editor/src/Viewport/SceneViewportOverlayRenderer.cpp @@ -1,305 +1,16 @@ #include "SceneViewportOverlayRenderer.h" -#include "SceneViewportOrientationGizmo.h" -#include -#include +#include "SceneViewportOrientationGizmo.h" namespace XCEngine { namespace Editor { -namespace { - -constexpr float kMoveGizmoArrowLength = 14.0f; -constexpr float kMoveGizmoArrowHalfWidth = 7.0f; - -ImU32 ToImGuiColor(const Math::Color& color) { - const auto toChannel = [](float value) -> int { - return static_cast(std::clamp(value, 0.0f, 1.0f) * 255.0f + 0.5f); - }; - - return IM_COL32( - toChannel(color.r), - toChannel(color.g), - toChannel(color.b), - toChannel(color.a)); -} - -Math::Color WithAlpha(const Math::Color& color, float alpha) { - return Math::Color(color.r, color.g, color.b, alpha); -} - -Math::Color LerpColor(const Math::Color& a, const Math::Color& b, float t) { - return Math::Color( - a.r + (b.r - a.r) * t, - a.g + (b.g - a.g) * t, - a.b + (b.b - a.b) * t, - a.a + (b.a - a.a) * t); -} - -ImVec2 NormalizeImVec2(const ImVec2& value, const ImVec2& fallback = ImVec2(1.0f, 0.0f)) { - const float lengthSq = value.x * value.x + value.y * value.y; - if (lengthSq <= 1e-6f) { - return fallback; - } - - const float inverseLength = 1.0f / std::sqrt(lengthSq); - return ImVec2(value.x * inverseLength, value.y * inverseLength); -} - -void DrawSceneMoveGizmoPlane( - ImDrawList* drawList, - const ImVec2& viewportMin, - const SceneViewportMoveGizmoPlaneDrawData& plane) { - if (drawList == nullptr || !plane.visible) { - return; - } - - ImVec2 points[4] = {}; - for (size_t index = 0; index < plane.corners.size(); ++index) { - points[index] = ImVec2( - viewportMin.x + plane.corners[index].x, - viewportMin.y + plane.corners[index].y); - } - - drawList->AddConvexPolyFilled(points, 4, ToImGuiColor(plane.fillColor)); - drawList->AddPolyline( - points, - 4, - ToImGuiColor(plane.outlineColor), - true, - plane.active ? 2.6f : (plane.hovered ? 2.0f : 1.4f)); -} - -void DrawSceneMoveGizmoAxis( - ImDrawList* drawList, - const ImVec2& viewportMin, - const SceneViewportMoveGizmoHandleDrawData& handle) { - if (drawList == nullptr || !handle.visible) { - return; - } - - const ImU32 color = ToImGuiColor(handle.color); - const float thickness = handle.active ? 4.0f : (handle.hovered ? 3.0f : 2.0f); - const ImVec2 start(viewportMin.x + handle.start.x, viewportMin.y + handle.start.y); - const ImVec2 end(viewportMin.x + handle.end.x, viewportMin.y + handle.end.y); - const ImVec2 direction = NormalizeImVec2(ImVec2(end.x - start.x, end.y - start.y)); - const ImVec2 normal(-direction.y, direction.x); - const ImVec2 arrowBase( - end.x - direction.x * kMoveGizmoArrowLength, - end.y - direction.y * kMoveGizmoArrowLength); - const ImVec2 arrowLeft( - arrowBase.x + normal.x * kMoveGizmoArrowHalfWidth, - arrowBase.y + normal.y * kMoveGizmoArrowHalfWidth); - const ImVec2 arrowRight( - arrowBase.x - normal.x * kMoveGizmoArrowHalfWidth, - arrowBase.y - normal.y * kMoveGizmoArrowHalfWidth); - - drawList->AddLine(start, arrowBase, color, thickness); - const ImVec2 triangle[3] = { end, arrowLeft, arrowRight }; - drawList->AddConvexPolyFilled(triangle, 3, color); -} - -void DrawSceneRotateGizmoHandle( - ImDrawList* drawList, - const ImVec2& viewportMin, - const SceneViewportRotateGizmoHandleDrawData& handle, - bool frontPass) { - if (drawList == nullptr || !handle.visible) { - return; - } - - const bool isViewHandle = handle.axis == SceneViewportRotateGizmoAxis::View; - if (isViewHandle && !frontPass) { - return; - } - - const float thickness = handle.active ? 3.6f : (handle.hovered ? 3.0f : 2.1f); - for (const SceneViewportRotateGizmoSegmentDrawData& segment : handle.segments) { - if (!segment.visible || (!isViewHandle && segment.frontFacing != frontPass)) { - continue; - } - - Math::Color drawColor = handle.color; - if (!isViewHandle && !frontPass) { - drawColor = LerpColor(handle.color, Math::Color(0.72f, 0.72f, 0.72f, 1.0f), 0.78f); - drawColor = WithAlpha(drawColor, handle.active ? 0.55f : 0.38f); - } else if (isViewHandle) { - drawColor = WithAlpha(drawColor, handle.active ? 0.95f : (handle.hovered ? 0.88f : 0.78f)); - } - - drawList->AddLine( - ImVec2(viewportMin.x + segment.start.x, viewportMin.y + segment.start.y), - ImVec2(viewportMin.x + segment.end.x, viewportMin.y + segment.end.y), - ToImGuiColor(drawColor), - thickness); - } -} - -void DrawSceneRotateGizmoAngleFill( - ImDrawList* drawList, - const ImVec2& viewportMin, - const SceneViewportRotateGizmoAngleFillDrawData& angleFill) { - if (drawList == nullptr || !angleFill.visible || angleFill.arcPointCount < 2) { - return; - } - - const ImVec2 pivot(viewportMin.x + angleFill.pivot.x, viewportMin.y + angleFill.pivot.y); - const ImU32 fillColor = ToImGuiColor(angleFill.fillColor); - const ImU32 outlineColor = ToImGuiColor(angleFill.outlineColor); - - ImVec2 fillPoints[kSceneViewportRotateGizmoAngleFillPointCount + 1] = {}; - fillPoints[0] = pivot; - for (size_t index = 0; index < angleFill.arcPointCount; ++index) { - fillPoints[index + 1] = ImVec2( - viewportMin.x + angleFill.arcPoints[index].x, - viewportMin.y + angleFill.arcPoints[index].y); - } - drawList->AddConvexPolyFilled( - fillPoints, - static_cast(angleFill.arcPointCount + 1), - fillColor); - - for (size_t index = 0; index + 1 < angleFill.arcPointCount; ++index) { - drawList->AddLine( - ImVec2(viewportMin.x + angleFill.arcPoints[index].x, viewportMin.y + angleFill.arcPoints[index].y), - ImVec2( - viewportMin.x + angleFill.arcPoints[index + 1].x, - viewportMin.y + angleFill.arcPoints[index + 1].y), - outlineColor, - 2.0f); - } - - drawList->AddLine( - pivot, - ImVec2(viewportMin.x + angleFill.arcPoints.front().x, viewportMin.y + angleFill.arcPoints.front().y), - outlineColor, - 1.6f); - drawList->AddLine( - pivot, - ImVec2( - viewportMin.x + angleFill.arcPoints[angleFill.arcPointCount - 1].x, - viewportMin.y + angleFill.arcPoints[angleFill.arcPointCount - 1].y), - outlineColor, - 1.6f); -} - -void DrawSceneScaleGizmoAxis( - ImDrawList* drawList, - const ImVec2& viewportMin, - const SceneViewportScaleGizmoAxisHandleDrawData& handle) { - if (drawList == nullptr || !handle.visible) { - return; - } - - const ImU32 color = ToImGuiColor(handle.color); - const float thickness = handle.active ? 4.0f : (handle.hovered ? 3.0f : 2.2f); - const ImVec2 start(viewportMin.x + handle.start.x, viewportMin.y + handle.start.y); - const ImVec2 capCenter(viewportMin.x + handle.capCenter.x, viewportMin.y + handle.capCenter.y); - const ImVec2 direction = NormalizeImVec2(ImVec2(capCenter.x - start.x, capCenter.y - start.y)); - const ImVec2 lineEnd( - capCenter.x - direction.x * handle.capHalfSize, - capCenter.y - direction.y * handle.capHalfSize); - const ImVec2 capMin(capCenter.x - handle.capHalfSize, capCenter.y - handle.capHalfSize); - const ImVec2 capMax(capCenter.x + handle.capHalfSize, capCenter.y + handle.capHalfSize); - - drawList->AddLine(start, lineEnd, color, thickness); - drawList->AddRectFilled(capMin, capMax, color, 1.2f); - drawList->AddRect(capMin, capMax, IM_COL32(24, 24, 24, 220), 1.2f, 0, handle.active ? 2.0f : 1.0f); -} - -void DrawSceneScaleGizmoCenterHandle( - ImDrawList* drawList, - const ImVec2& viewportMin, - const SceneViewportScaleGizmoCenterHandleDrawData& handle) { - if (drawList == nullptr || !handle.visible) { - return; - } - - const ImVec2 center(viewportMin.x + handle.center.x, viewportMin.y + handle.center.y); - const ImVec2 handleMin(center.x - handle.halfSize, center.y - handle.halfSize); - const ImVec2 handleMax(center.x + handle.halfSize, center.y + handle.halfSize); - drawList->AddRectFilled(handleMin, handleMax, ToImGuiColor(handle.fillColor), 1.2f); - drawList->AddRect( - handleMin, - handleMax, - ToImGuiColor(handle.outlineColor), - 1.2f, - 0, - handle.active ? 2.0f : 1.0f); -} - -void DrawSceneMoveGizmo( - ImDrawList* drawList, - const ImVec2& viewportMin, - const SceneViewportMoveGizmoDrawData& moveGizmo) { - if (drawList == nullptr || !moveGizmo.visible) { - return; - } - - for (const SceneViewportMoveGizmoPlaneDrawData& plane : moveGizmo.planes) { - DrawSceneMoveGizmoPlane(drawList, viewportMin, plane); - } - - for (const SceneViewportMoveGizmoHandleDrawData& handle : moveGizmo.handles) { - DrawSceneMoveGizmoAxis(drawList, viewportMin, handle); - } -} - -void DrawSceneRotateGizmo( - ImDrawList* drawList, - const ImVec2& viewportMin, - const SceneViewportRotateGizmoDrawData& rotateGizmo) { - if (drawList == nullptr || !rotateGizmo.visible) { - return; - } - - for (const SceneViewportRotateGizmoHandleDrawData& handle : rotateGizmo.handles) { - if (handle.axis == SceneViewportRotateGizmoAxis::View) { - DrawSceneRotateGizmoHandle(drawList, viewportMin, handle, true); - } - } - - for (const SceneViewportRotateGizmoHandleDrawData& handle : rotateGizmo.handles) { - if (handle.axis != SceneViewportRotateGizmoAxis::View) { - DrawSceneRotateGizmoHandle(drawList, viewportMin, handle, false); - } - } - - DrawSceneRotateGizmoAngleFill(drawList, viewportMin, rotateGizmo.angleFill); - - for (const SceneViewportRotateGizmoHandleDrawData& handle : rotateGizmo.handles) { - if (handle.axis != SceneViewportRotateGizmoAxis::View) { - DrawSceneRotateGizmoHandle(drawList, viewportMin, handle, true); - } - } -} - -void DrawSceneScaleGizmo( - ImDrawList* drawList, - const ImVec2& viewportMin, - const SceneViewportScaleGizmoDrawData& scaleGizmo) { - if (drawList == nullptr || !scaleGizmo.visible) { - return; - } - - for (const SceneViewportScaleGizmoAxisHandleDrawData& handle : scaleGizmo.axisHandles) { - DrawSceneScaleGizmoAxis(drawList, viewportMin, handle); - } - - DrawSceneScaleGizmoCenterHandle(drawList, viewportMin, scaleGizmo.centerHandle); -} - -} // namespace - void DrawSceneViewportOverlay( ImDrawList* drawList, const SceneViewportOverlayData& overlay, const ImVec2& viewportMin, const ImVec2& viewportMax, - const ImVec2& viewportSize, - const SceneViewportMoveGizmoDrawData* moveGizmo, - const SceneViewportRotateGizmoDrawData* rotateGizmo, - const SceneViewportScaleGizmoDrawData* scaleGizmo) { + const ImVec2& viewportSize) { if (drawList == nullptr || viewportSize.x <= 1.0f || viewportSize.y <= 1.0f) { return; } @@ -308,15 +19,6 @@ void DrawSceneViewportOverlay( if (overlay.valid) { DrawSceneViewportOrientationGizmo(drawList, overlay, viewportMin, viewportMax); } - if (moveGizmo != nullptr) { - DrawSceneMoveGizmo(drawList, viewportMin, *moveGizmo); - } - if (rotateGizmo != nullptr) { - DrawSceneRotateGizmo(drawList, viewportMin, *rotateGizmo); - } - if (scaleGizmo != nullptr) { - DrawSceneScaleGizmo(drawList, viewportMin, *scaleGizmo); - } drawList->PopClipRect(); } diff --git a/editor/src/Viewport/SceneViewportOverlayRenderer.h b/editor/src/Viewport/SceneViewportOverlayRenderer.h index efd74f2e..887d3c5a 100644 --- a/editor/src/Viewport/SceneViewportOverlayRenderer.h +++ b/editor/src/Viewport/SceneViewportOverlayRenderer.h @@ -1,9 +1,6 @@ #pragma once #include "IViewportHostService.h" -#include "SceneViewportMoveGizmo.h" -#include "SceneViewportRotateGizmo.h" -#include "SceneViewportScaleGizmo.h" #include @@ -15,10 +12,7 @@ void DrawSceneViewportOverlay( const SceneViewportOverlayData& overlay, const ImVec2& viewportMin, const ImVec2& viewportMax, - const ImVec2& viewportSize, - const SceneViewportMoveGizmoDrawData* moveGizmo = nullptr, - const SceneViewportRotateGizmoDrawData* rotateGizmo = nullptr, - const SceneViewportScaleGizmoDrawData* scaleGizmo = nullptr); + const ImVec2& viewportSize); } // namespace Editor } // namespace XCEngine diff --git a/editor/src/Viewport/SceneViewportRotateGizmo.cpp b/editor/src/Viewport/SceneViewportRotateGizmo.cpp index 34daa0bc..8a024acd 100644 --- a/editor/src/Viewport/SceneViewportRotateGizmo.cpp +++ b/editor/src/Viewport/SceneViewportRotateGizmo.cpp @@ -19,6 +19,21 @@ constexpr float kRotateGizmoViewRadiusPixels = 106.0f; constexpr float kRotateGizmoHoverThresholdPixels = 9.0f; constexpr float kRotateGizmoAngleFillMinRadians = 0.01f; +Math::Vector3 GetBaseRotateAxisVector(SceneViewportRotateGizmoAxis axis) { + switch (axis) { + case SceneViewportRotateGizmoAxis::X: + return Math::Vector3::Right(); + case SceneViewportRotateGizmoAxis::Y: + return Math::Vector3::Up(); + case SceneViewportRotateGizmoAxis::Z: + return Math::Vector3::Forward(); + case SceneViewportRotateGizmoAxis::View: + case SceneViewportRotateGizmoAxis::None: + default: + return Math::Vector3::Zero(); + } +} + Math::Vector3 NormalizeVector3(const Math::Vector3& value, const Math::Vector3& fallback) { return value.SqrMagnitude() <= Math::EPSILON ? fallback : value.Normalized(); } @@ -30,6 +45,22 @@ bool IsMouseInsideViewport(const SceneViewportRotateGizmoContext& context) { context.mousePosition.y <= context.viewportSize.y; } +Math::Quaternion ComputeStableWorldRotation(const Components::GameObject* gameObject) { + if (gameObject == nullptr || gameObject->GetTransform() == nullptr) { + return Math::Quaternion::Identity(); + } + + const Components::TransformComponent* transform = gameObject->GetTransform(); + Math::Quaternion worldRotation = transform->GetLocalRotation(); + for (const Components::TransformComponent* parent = transform->GetParent(); + parent != nullptr; + parent = parent->GetParent()) { + worldRotation = parent->GetLocalRotation() * worldRotation; + } + + return worldRotation.Normalized(); +} + Math::Color GetRotateAxisBaseColor(SceneViewportRotateGizmoAxis axis) { switch (axis) { case SceneViewportRotateGizmoAxis::X: @@ -48,14 +79,13 @@ Math::Color GetRotateAxisBaseColor(SceneViewportRotateGizmoAxis axis) { Math::Vector3 GetRotateAxisVector( SceneViewportRotateGizmoAxis axis, - const SceneViewportOverlayData& overlay) { + const SceneViewportOverlayData& overlay, + const Math::Quaternion& axisOrientation) { switch (axis) { case SceneViewportRotateGizmoAxis::X: - return Math::Vector3::Right(); case SceneViewportRotateGizmoAxis::Y: - return Math::Vector3::Up(); case SceneViewportRotateGizmoAxis::Z: - return Math::Vector3::Forward(); + return NormalizeVector3(axisOrientation * GetBaseRotateAxisVector(axis), GetBaseRotateAxisVector(axis)); case SceneViewportRotateGizmoAxis::View: return NormalizeVector3(overlay.cameraForward, Math::Vector3::Forward()); case SceneViewportRotateGizmoAxis::None: @@ -67,20 +97,21 @@ Math::Vector3 GetRotateAxisVector( bool GetRotateRingBasis( SceneViewportRotateGizmoAxis axis, const SceneViewportOverlayData& overlay, + const Math::Quaternion& axisOrientation, Math::Vector3& outBasisA, Math::Vector3& outBasisB) { switch (axis) { case SceneViewportRotateGizmoAxis::X: - outBasisA = Math::Vector3::Up(); - outBasisB = Math::Vector3::Forward(); + outBasisA = NormalizeVector3(axisOrientation * Math::Vector3::Up(), Math::Vector3::Up()); + outBasisB = NormalizeVector3(axisOrientation * Math::Vector3::Forward(), Math::Vector3::Forward()); return true; case SceneViewportRotateGizmoAxis::Y: - outBasisA = Math::Vector3::Forward(); - outBasisB = Math::Vector3::Right(); + outBasisA = NormalizeVector3(axisOrientation * Math::Vector3::Forward(), Math::Vector3::Forward()); + outBasisB = NormalizeVector3(axisOrientation * Math::Vector3::Right(), Math::Vector3::Right()); return true; case SceneViewportRotateGizmoAxis::Z: - outBasisA = Math::Vector3::Right(); - outBasisB = Math::Vector3::Up(); + outBasisA = NormalizeVector3(axisOrientation * Math::Vector3::Right(), Math::Vector3::Right()); + outBasisB = NormalizeVector3(axisOrientation * Math::Vector3::Up(), Math::Vector3::Up()); return true; case SceneViewportRotateGizmoAxis::View: outBasisA = NormalizeVector3(overlay.cameraRight, Math::Vector3::Right()); @@ -147,11 +178,12 @@ SceneViewportRotateGizmoAxis GetRotateAxisForIndex(size_t index) { bool TryComputeRingAngleFromWorldDirection( SceneViewportRotateGizmoAxis axis, const SceneViewportOverlayData& overlay, + const Math::Quaternion& axisOrientation, const Math::Vector3& directionWorld, float& outAngle) { Math::Vector3 basisA = Math::Vector3::Zero(); Math::Vector3 basisB = Math::Vector3::Zero(); - if (!GetRotateRingBasis(axis, overlay, basisA, basisB)) { + if (!GetRotateRingBasis(axis, overlay, axisOrientation, basisA, basisB)) { return false; } @@ -171,7 +203,7 @@ bool TryComputeRingAngleFromWorldDirection( void SceneViewportRotateGizmo::Update(const SceneViewportRotateGizmoContext& context) { BuildDrawData(context); if (m_activeAxis == SceneViewportRotateGizmoAxis::None && IsMouseInsideViewport(context)) { - m_hoveredAxis = HitTestAxis(context.mousePosition); + m_hoveredAxis = EvaluateHit(context.mousePosition).axis; } else if (m_activeAxis == SceneViewportRotateGizmoAxis::None) { m_hoveredAxis = SceneViewportRotateGizmoAxis::None; } else { @@ -190,8 +222,8 @@ bool SceneViewportRotateGizmo::TryBeginDrag(const SceneViewportRotateGizmoContex return false; } - const Math::Vector3 pivotWorldPosition = context.selectedObject->GetTransform()->GetPosition(); - const Math::Vector3 worldAxis = GetRotateAxisVector(m_hoveredAxis, context.overlay); + const Math::Vector3 pivotWorldPosition = context.pivotWorldPosition; + const Math::Vector3 worldAxis = GetRotateAxisVector(m_hoveredAxis, context.overlay, context.axisOrientation); if (worldAxis.SqrMagnitude() <= Math::EPSILON) { return false; } @@ -225,6 +257,7 @@ bool SceneViewportRotateGizmo::TryBeginDrag(const SceneViewportRotateGizmoContex if (!TryComputeRingAngleFromWorldDirection( m_hoveredAxis, context.overlay, + context.axisOrientation, startDirection, startRingAngle)) { return false; @@ -238,12 +271,31 @@ bool SceneViewportRotateGizmo::TryBeginDrag(const SceneViewportRotateGizmoContex m_activeAxis = m_hoveredAxis; m_activeEntityId = context.selectedObject->GetID(); + m_localSpace = context.localSpace && m_hoveredAxis != SceneViewportRotateGizmoAxis::View; + m_rotateAroundSharedPivot = context.rotateAroundSharedPivot; m_activeWorldAxis = worldAxis.Normalized(); m_screenSpaceDrag = useScreenSpaceDrag; m_dragPlane = dragPlane; - m_dragStartWorldRotation = context.selectedObject->GetTransform()->GetRotation(); m_dragStartRingAngle = startRingAngle; m_dragCurrentDeltaRadians = 0.0f; + m_dragStartPivotWorldPosition = pivotWorldPosition; + m_dragObjects = context.selectedObjects; + if (m_dragObjects.empty()) { + m_dragObjects.push_back(context.selectedObject); + } + m_dragStartWorldPositions.clear(); + m_dragStartWorldRotations.clear(); + m_dragStartWorldPositions.reserve(m_dragObjects.size()); + m_dragStartWorldRotations.reserve(m_dragObjects.size()); + for (Components::GameObject* gameObject : m_dragObjects) { + if (gameObject != nullptr && gameObject->GetTransform() != nullptr) { + m_dragStartWorldPositions.push_back(gameObject->GetTransform()->GetPosition()); + m_dragStartWorldRotations.push_back(gameObject->GetTransform()->GetRotation()); + } else { + m_dragStartWorldPositions.push_back(Math::Vector3::Zero()); + m_dragStartWorldRotations.push_back(Math::Quaternion::Identity()); + } + } RefreshHandleState(); return true; } @@ -251,7 +303,10 @@ bool SceneViewportRotateGizmo::TryBeginDrag(const SceneViewportRotateGizmoContex void SceneViewportRotateGizmo::UpdateDrag(const SceneViewportRotateGizmoContext& context) { if (m_activeAxis == SceneViewportRotateGizmoAxis::None || context.selectedObject == nullptr || - context.selectedObject->GetID() != m_activeEntityId) { + context.selectedObject->GetID() != m_activeEntityId || + m_dragObjects.empty() || + m_dragObjects.size() != m_dragStartWorldPositions.size() || + m_dragObjects.size() != m_dragStartWorldRotations.size()) { return; } @@ -275,7 +330,7 @@ void SceneViewportRotateGizmo::UpdateDrag(const SceneViewportRotateGizmoContext& return; } - const Math::Vector3 pivotWorldPosition = context.selectedObject->GetTransform()->GetPosition(); + const Math::Vector3 pivotWorldPosition = m_dragStartPivotWorldPosition; const Math::Vector3 hitPoint = worldRay.GetPoint(hitDistance); const Math::Vector3 currentDirection = Math::Vector3::ProjectOnPlane(hitPoint - pivotWorldPosition, m_activeWorldAxis); if (currentDirection.SqrMagnitude() <= Math::EPSILON) { @@ -285,6 +340,7 @@ void SceneViewportRotateGizmo::UpdateDrag(const SceneViewportRotateGizmoContext& if (!TryComputeRingAngleFromWorldDirection( m_activeAxis, context.overlay, + context.axisOrientation, currentDirection, currentRingAngle)) { return; @@ -293,9 +349,37 @@ void SceneViewportRotateGizmo::UpdateDrag(const SceneViewportRotateGizmoContext& const float deltaRadians = NormalizeSignedAngleRadians(currentRingAngle - m_dragStartRingAngle); m_dragCurrentDeltaRadians = deltaRadians; - const Math::Quaternion deltaRotation = Math::Quaternion::FromAxisAngle(m_activeWorldAxis, deltaRadians); - context.selectedObject->GetTransform()->SetRotation(deltaRotation * m_dragStartWorldRotation); - BuildDrawData(context); + const Math::Quaternion worldDeltaRotation = Math::Quaternion::FromAxisAngle(m_activeWorldAxis, deltaRadians); + const Math::Vector3 localAxis = GetBaseRotateAxisVector(m_activeAxis); + const Math::Quaternion localDeltaRotation = + localAxis.SqrMagnitude() > Math::EPSILON + ? Math::Quaternion::FromAxisAngle(localAxis, deltaRadians) + : Math::Quaternion::Identity(); + for (size_t index = 0; index < m_dragObjects.size(); ++index) { + Components::GameObject* gameObject = m_dragObjects[index]; + if (gameObject == nullptr || gameObject->GetTransform() == nullptr) { + continue; + } + + if (m_rotateAroundSharedPivot) { + gameObject->GetTransform()->SetPosition( + m_dragStartPivotWorldPosition + + worldDeltaRotation * (m_dragStartWorldPositions[index] - m_dragStartPivotWorldPosition)); + } else { + gameObject->GetTransform()->SetPosition(m_dragStartWorldPositions[index]); + } + if (m_localSpace && m_activeAxis != SceneViewportRotateGizmoAxis::View) { + gameObject->GetTransform()->SetRotation(m_dragStartWorldRotations[index] * localDeltaRotation); + } else { + gameObject->GetTransform()->SetRotation(worldDeltaRotation * m_dragStartWorldRotations[index]); + } + } + SceneViewportRotateGizmoContext drawContext = context; + drawContext.pivotWorldPosition = m_dragStartPivotWorldPosition; + if (drawContext.localSpace && drawContext.selectedObject != nullptr) { + drawContext.axisOrientation = ComputeStableWorldRotation(drawContext.selectedObject); + } + BuildDrawData(drawContext); m_hoveredAxis = m_activeAxis; RefreshHandleState(); } @@ -312,10 +396,15 @@ void SceneViewportRotateGizmo::EndDrag(IUndoManager& undoManager) { m_activeAxis = SceneViewportRotateGizmoAxis::None; m_activeEntityId = 0; m_screenSpaceDrag = false; + m_localSpace = false; + m_rotateAroundSharedPivot = false; m_activeWorldAxis = Math::Vector3::Zero(); - m_dragStartWorldRotation = Math::Quaternion::Identity(); m_dragStartRingAngle = 0.0f; m_dragCurrentDeltaRadians = 0.0f; + m_dragStartPivotWorldPosition = Math::Vector3::Zero(); + m_dragObjects.clear(); + m_dragStartWorldPositions.clear(); + m_dragStartWorldRotations.clear(); RefreshHandleState(); } @@ -327,10 +416,15 @@ void SceneViewportRotateGizmo::CancelDrag(IUndoManager* undoManager) { m_activeAxis = SceneViewportRotateGizmoAxis::None; m_activeEntityId = 0; m_screenSpaceDrag = false; + m_localSpace = false; + m_rotateAroundSharedPivot = false; m_activeWorldAxis = Math::Vector3::Zero(); - m_dragStartWorldRotation = Math::Quaternion::Identity(); m_dragStartRingAngle = 0.0f; m_dragCurrentDeltaRadians = 0.0f; + m_dragStartPivotWorldPosition = Math::Vector3::Zero(); + m_dragObjects.clear(); + m_dragStartWorldPositions.clear(); + m_dragStartWorldRotations.clear(); m_hoveredAxis = SceneViewportRotateGizmoAxis::None; RefreshHandleState(); } @@ -351,18 +445,57 @@ const SceneViewportRotateGizmoDrawData& SceneViewportRotateGizmo::GetDrawData() return m_drawData; } +SceneViewportRotateGizmoHitResult SceneViewportRotateGizmo::EvaluateHit(const Math::Vector2& mousePosition) const { + SceneViewportRotateGizmoHitResult result = {}; + if (!m_drawData.visible) { + return result; + } + + const float hoverThresholdSq = kRotateGizmoHoverThresholdPixels * kRotateGizmoHoverThresholdPixels; + for (const SceneViewportRotateGizmoHandleDrawData& handle : m_drawData.handles) { + if (!handle.visible) { + continue; + } + + for (const SceneViewportRotateGizmoSegmentDrawData& segment : handle.segments) { + if (!segment.visible || + (handle.axis != SceneViewportRotateGizmoAxis::View && !segment.frontFacing)) { + continue; + } + + const float distanceSq = DistanceToSegmentSquared(mousePosition, segment.start, segment.end); + if (distanceSq > result.distanceSq || distanceSq > hoverThresholdSq) { + continue; + } + + result.axis = handle.axis; + result.distanceSq = distanceSq; + } + } + + return result; +} + +void SceneViewportRotateGizmo::SetHoveredHandle(SceneViewportRotateGizmoAxis axis) { + if (m_activeAxis != SceneViewportRotateGizmoAxis::None) { + return; + } + + m_hoveredAxis = axis; + RefreshHandleState(); +} + void SceneViewportRotateGizmo::BuildDrawData(const SceneViewportRotateGizmoContext& context) { m_drawData = {}; - const Components::GameObject* selectedObject = context.selectedObject; - if (selectedObject == nullptr || + if ((context.selectedObject == nullptr && context.selectedObjects.empty()) || !context.overlay.valid || context.viewportSize.x <= 1.0f || context.viewportSize.y <= 1.0f) { return; } - const Math::Vector3 pivotWorldPosition = selectedObject->GetTransform()->GetPosition(); + const Math::Vector3 pivotWorldPosition = context.pivotWorldPosition; const SceneViewportProjectedPoint projectedPivot = ProjectSceneViewportWorldPoint( context.overlay, context.viewportSize.x, @@ -383,6 +516,7 @@ void SceneViewportRotateGizmo::BuildDrawData(const SceneViewportRotateGizmoConte m_drawData.visible = true; m_drawData.pivot = projectedPivot.screenPosition; const bool hasActiveDragFeedback = + !context.localSpace && m_activeAxis != SceneViewportRotateGizmoAxis::None && m_activeAxis != SceneViewportRotateGizmoAxis::View && std::abs(m_dragCurrentDeltaRadians) > Math::EPSILON; @@ -398,7 +532,7 @@ void SceneViewportRotateGizmo::BuildDrawData(const SceneViewportRotateGizmoConte Math::Vector3 basisA = Math::Vector3::Zero(); Math::Vector3 basisB = Math::Vector3::Zero(); - if (!GetRotateRingBasis(handle.axis, context.overlay, basisA, basisB)) { + if (!GetRotateRingBasis(handle.axis, context.overlay, context.axisOrientation, basisA, basisB)) { continue; } if (hasActiveDragFeedback && handle.axis != SceneViewportRotateGizmoAxis::View) { @@ -468,7 +602,7 @@ void SceneViewportRotateGizmo::BuildDrawData(const SceneViewportRotateGizmoConte Math::Vector3 basisA = Math::Vector3::Zero(); Math::Vector3 basisB = Math::Vector3::Zero(); - if (GetRotateRingBasis(m_activeAxis, context.overlay, basisA, basisB)) { + if (GetRotateRingBasis(m_activeAxis, context.overlay, context.axisOrientation, basisA, basisB)) { const float ringRadiusWorld = worldUnitsPerPixel * GetRotateRingRadiusPixels(m_activeAxis); const float sweepRadians = NormalizeSignedAngleRadians(m_dragCurrentDeltaRadians); const float sweepAbs = std::abs(sweepRadians); @@ -519,39 +653,6 @@ void SceneViewportRotateGizmo::RefreshHandleState() { } } -SceneViewportRotateGizmoAxis SceneViewportRotateGizmo::HitTestAxis(const Math::Vector2& mousePosition) const { - if (!m_drawData.visible) { - return SceneViewportRotateGizmoAxis::None; - } - - const float hoverThresholdSq = kRotateGizmoHoverThresholdPixels * kRotateGizmoHoverThresholdPixels; - SceneViewportRotateGizmoAxis bestAxis = SceneViewportRotateGizmoAxis::None; - float bestDistanceSq = hoverThresholdSq; - - for (const SceneViewportRotateGizmoHandleDrawData& handle : m_drawData.handles) { - if (!handle.visible) { - continue; - } - - for (const SceneViewportRotateGizmoSegmentDrawData& segment : handle.segments) { - if (!segment.visible || - (handle.axis != SceneViewportRotateGizmoAxis::View && !segment.frontFacing)) { - continue; - } - - const float distanceSq = DistanceToSegmentSquared(mousePosition, segment.start, segment.end); - if (distanceSq > bestDistanceSq) { - continue; - } - - bestDistanceSq = distanceSq; - bestAxis = handle.axis; - } - } - - return bestAxis; -} - bool SceneViewportRotateGizmo::TryGetClosestRingAngle( SceneViewportRotateGizmoAxis axis, const Math::Vector2& mousePosition, diff --git a/editor/src/Viewport/SceneViewportRotateGizmo.h b/editor/src/Viewport/SceneViewportRotateGizmo.h index 1bf602ac..1d6880e8 100644 --- a/editor/src/Viewport/SceneViewportRotateGizmo.h +++ b/editor/src/Viewport/SceneViewportRotateGizmo.h @@ -10,6 +10,7 @@ #include #include +#include namespace XCEngine { namespace Components { @@ -71,6 +72,20 @@ struct SceneViewportRotateGizmoContext { Math::Vector2 viewportSize = Math::Vector2::Zero(); Math::Vector2 mousePosition = Math::Vector2::Zero(); Components::GameObject* selectedObject = nullptr; + std::vector selectedObjects = {}; + Math::Vector3 pivotWorldPosition = Math::Vector3::Zero(); + Math::Quaternion axisOrientation = Math::Quaternion::Identity(); + bool localSpace = false; + bool rotateAroundSharedPivot = false; +}; + +struct SceneViewportRotateGizmoHitResult { + SceneViewportRotateGizmoAxis axis = SceneViewportRotateGizmoAxis::None; + float distanceSq = Math::FLOAT_MAX; + + bool HasHit() const { + return axis != SceneViewportRotateGizmoAxis::None; + } }; class SceneViewportRotateGizmo { @@ -85,11 +100,12 @@ public: bool IsActive() const; uint64_t GetActiveEntityId() const; const SceneViewportRotateGizmoDrawData& GetDrawData() const; + SceneViewportRotateGizmoHitResult EvaluateHit(const Math::Vector2& mousePosition) const; + void SetHoveredHandle(SceneViewportRotateGizmoAxis axis); private: void BuildDrawData(const SceneViewportRotateGizmoContext& context); void RefreshHandleState(); - SceneViewportRotateGizmoAxis HitTestAxis(const Math::Vector2& mousePosition) const; bool TryGetClosestRingAngle( SceneViewportRotateGizmoAxis axis, const Math::Vector2& mousePosition, @@ -101,11 +117,16 @@ private: SceneViewportRotateGizmoAxis m_activeAxis = SceneViewportRotateGizmoAxis::None; uint64_t m_activeEntityId = 0; bool m_screenSpaceDrag = false; + bool m_localSpace = false; + bool m_rotateAroundSharedPivot = false; Math::Vector3 m_activeWorldAxis = Math::Vector3::Zero(); Math::Plane m_dragPlane = {}; - Math::Quaternion m_dragStartWorldRotation = Math::Quaternion::Identity(); float m_dragStartRingAngle = 0.0f; float m_dragCurrentDeltaRadians = 0.0f; + Math::Vector3 m_dragStartPivotWorldPosition = Math::Vector3::Zero(); + std::vector m_dragObjects = {}; + std::vector m_dragStartWorldPositions = {}; + std::vector m_dragStartWorldRotations = {}; }; } // namespace Editor diff --git a/editor/src/Viewport/SceneViewportScaleGizmo.cpp b/editor/src/Viewport/SceneViewportScaleGizmo.cpp index f4aa8a6b..637c97d7 100644 --- a/editor/src/Viewport/SceneViewportScaleGizmo.cpp +++ b/editor/src/Viewport/SceneViewportScaleGizmo.cpp @@ -130,7 +130,7 @@ float ComputeVisualScaleFactor(float current, float start) { void SceneViewportScaleGizmo::Update(const SceneViewportScaleGizmoContext& context) { BuildDrawData(context); if (m_activeHandle == SceneViewportScaleGizmoHandle::None && IsMouseInsideViewport(context)) { - m_hoveredHandle = HitTestHandle(context.mousePosition); + m_hoveredHandle = EvaluateHit(context.mousePosition).handle; } else if (m_activeHandle == SceneViewportScaleGizmoHandle::None) { m_hoveredHandle = SceneViewportScaleGizmoHandle::None; } else { @@ -158,7 +158,7 @@ bool SceneViewportScaleGizmo::TryBeginDrag(const SceneViewportScaleGizmoContext& activeScreenDirection = handle->end - handle->start; if (activeScreenDirection.SqrMagnitude() <= Math::EPSILON) { - const Math::Vector3 pivotWorldPosition = context.selectedObject->GetTransform()->GetPosition(); + const Math::Vector3 pivotWorldPosition = context.pivotWorldPosition; if (!ProjectSceneViewportAxisDirectionAtPoint( context.overlay, context.viewportSize.x, @@ -310,6 +310,68 @@ const SceneViewportScaleGizmoDrawData& SceneViewportScaleGizmo::GetDrawData() co return m_drawData; } +SceneViewportScaleGizmoHitResult SceneViewportScaleGizmo::EvaluateHit(const Math::Vector2& mousePosition) const { + SceneViewportScaleGizmoHitResult result = {}; + if (!m_drawData.visible) { + return result; + } + + if (m_drawData.centerHandle.visible && + IsPointInsideSquare( + mousePosition, + m_drawData.centerHandle.center, + m_drawData.centerHandle.halfSize + 2.0f)) { + result.handle = SceneViewportScaleGizmoHandle::Uniform; + result.distanceSq = (m_drawData.centerHandle.center - mousePosition).SqrMagnitude(); + return result; + } + + for (const SceneViewportScaleGizmoAxisHandleDrawData& handle : m_drawData.axisHandles) { + if (!handle.visible || + !IsPointInsideSquare(mousePosition, handle.capCenter, handle.capHalfSize + 2.0f)) { + continue; + } + + const float distanceSq = (handle.capCenter - mousePosition).SqrMagnitude(); + if (distanceSq >= result.distanceSq) { + continue; + } + + result.handle = handle.handle; + result.distanceSq = distanceSq; + } + + if (result.handle != SceneViewportScaleGizmoHandle::None) { + return result; + } + + const float hoverThresholdSq = kScaleGizmoHoverThresholdPixels * kScaleGizmoHoverThresholdPixels; + for (const SceneViewportScaleGizmoAxisHandleDrawData& handle : m_drawData.axisHandles) { + if (!handle.visible) { + continue; + } + + const float distanceSq = DistanceToSegmentSquared(mousePosition, handle.start, handle.end); + if (distanceSq > result.distanceSq || distanceSq > hoverThresholdSq) { + continue; + } + + result.handle = handle.handle; + result.distanceSq = distanceSq; + } + + return result; +} + +void SceneViewportScaleGizmo::SetHoveredHandle(SceneViewportScaleGizmoHandle handle) { + if (m_activeHandle != SceneViewportScaleGizmoHandle::None) { + return; + } + + m_hoveredHandle = handle; + RefreshHandleState(); +} + void SceneViewportScaleGizmo::BuildDrawData(const SceneViewportScaleGizmoContext& context) { m_drawData = {}; @@ -321,7 +383,7 @@ void SceneViewportScaleGizmo::BuildDrawData(const SceneViewportScaleGizmoContext return; } - const Math::Vector3 pivotWorldPosition = selectedObject->GetTransform()->GetPosition(); + const Math::Vector3 pivotWorldPosition = context.pivotWorldPosition; const SceneViewportProjectedPoint projectedPivot = ProjectSceneViewportWorldPoint( context.overlay, context.viewportSize.x, @@ -435,58 +497,6 @@ void SceneViewportScaleGizmo::RefreshHandleState() { m_drawData.centerHandle.active ? 1.0f : (m_drawData.centerHandle.hovered ? 0.96f : 0.88f)); } -SceneViewportScaleGizmoHandle SceneViewportScaleGizmo::HitTestHandle(const Math::Vector2& mousePosition) const { - if (!m_drawData.visible) { - return SceneViewportScaleGizmoHandle::None; - } - - if (m_drawData.centerHandle.visible && - IsPointInsideSquare( - mousePosition, - m_drawData.centerHandle.center, - m_drawData.centerHandle.halfSize + 2.0f)) { - return SceneViewportScaleGizmoHandle::Uniform; - } - - SceneViewportScaleGizmoHandle bestHandle = SceneViewportScaleGizmoHandle::None; - float bestDistanceSq = Math::FLOAT_MAX; - for (const SceneViewportScaleGizmoAxisHandleDrawData& handle : m_drawData.axisHandles) { - if (!handle.visible || - !IsPointInsideSquare(mousePosition, handle.capCenter, handle.capHalfSize + 2.0f)) { - continue; - } - - const float distanceSq = (handle.capCenter - mousePosition).SqrMagnitude(); - if (distanceSq >= bestDistanceSq) { - continue; - } - - bestDistanceSq = distanceSq; - bestHandle = handle.handle; - } - - if (bestHandle != SceneViewportScaleGizmoHandle::None) { - return bestHandle; - } - - bestDistanceSq = kScaleGizmoHoverThresholdPixels * kScaleGizmoHoverThresholdPixels; - for (const SceneViewportScaleGizmoAxisHandleDrawData& handle : m_drawData.axisHandles) { - if (!handle.visible) { - continue; - } - - const float distanceSq = DistanceToSegmentSquared(mousePosition, handle.start, handle.end); - if (distanceSq > bestDistanceSq) { - continue; - } - - bestDistanceSq = distanceSq; - bestHandle = handle.handle; - } - - return bestHandle; -} - const SceneViewportScaleGizmoAxisHandleDrawData* SceneViewportScaleGizmo::FindAxisHandleDrawData( SceneViewportScaleGizmoHandle handle) const { for (const SceneViewportScaleGizmoAxisHandleDrawData& drawHandle : m_drawData.axisHandles) { diff --git a/editor/src/Viewport/SceneViewportScaleGizmo.h b/editor/src/Viewport/SceneViewportScaleGizmo.h index 213a96d9..0ecdd7c7 100644 --- a/editor/src/Viewport/SceneViewportScaleGizmo.h +++ b/editor/src/Viewport/SceneViewportScaleGizmo.h @@ -3,6 +3,7 @@ #include "IViewportHostService.h" #include +#include #include #include @@ -59,9 +60,20 @@ struct SceneViewportScaleGizmoContext { Math::Vector2 viewportSize = Math::Vector2::Zero(); Math::Vector2 mousePosition = Math::Vector2::Zero(); Components::GameObject* selectedObject = nullptr; + Math::Vector3 pivotWorldPosition = Math::Vector3::Zero(); + Math::Quaternion axisOrientation = Math::Quaternion::Identity(); bool uniformOnly = false; }; +struct SceneViewportScaleGizmoHitResult { + SceneViewportScaleGizmoHandle handle = SceneViewportScaleGizmoHandle::None; + float distanceSq = Math::FLOAT_MAX; + + bool HasHit() const { + return handle != SceneViewportScaleGizmoHandle::None; + } +}; + class SceneViewportScaleGizmo { public: void Update(const SceneViewportScaleGizmoContext& context); @@ -74,11 +86,12 @@ public: bool IsActive() const; uint64_t GetActiveEntityId() const; const SceneViewportScaleGizmoDrawData& GetDrawData() const; + SceneViewportScaleGizmoHitResult EvaluateHit(const Math::Vector2& mousePosition) const; + void SetHoveredHandle(SceneViewportScaleGizmoHandle handle); private: void BuildDrawData(const SceneViewportScaleGizmoContext& context); void RefreshHandleState(); - SceneViewportScaleGizmoHandle HitTestHandle(const Math::Vector2& mousePosition) const; const SceneViewportScaleGizmoAxisHandleDrawData* FindAxisHandleDrawData( SceneViewportScaleGizmoHandle handle) const; diff --git a/editor/src/Viewport/SceneViewportTransformGizmoFrameBuilder.h b/editor/src/Viewport/SceneViewportTransformGizmoFrameBuilder.h new file mode 100644 index 00000000..23bae169 --- /dev/null +++ b/editor/src/Viewport/SceneViewportTransformGizmoFrameBuilder.h @@ -0,0 +1,323 @@ +#pragma once + +#include "Core/IEditorContext.h" +#include "Core/ISceneManager.h" +#include "Core/ISelectionManager.h" +#include "SceneViewportEditorOverlayData.h" +#include "SceneViewportMoveGizmo.h" +#include "SceneViewportRotateGizmo.h" +#include "SceneViewportScaleGizmo.h" + +#include +#include + +#include +#include + +namespace XCEngine { +namespace Editor { + +enum class SceneViewportActiveGizmoKind : uint8_t { + None = 0, + Move, + Rotate, + Scale +}; + +struct SceneViewportSelectionGizmoState { + Components::GameObject* primaryObject = nullptr; + std::vector selectedObjects = {}; + Math::Vector3 pivotWorldPosition = Math::Vector3::Zero(); + Math::Quaternion primaryWorldRotation = Math::Quaternion::Identity(); +}; + +struct SceneViewportTransformGizmoFrameState { + SceneViewportOverlayData overlay = {}; + SceneViewportSelectionGizmoState selectionState = {}; + SceneViewportMoveGizmoContext moveContext = {}; + SceneViewportRotateGizmoContext rotateContext = {}; + SceneViewportScaleGizmoContext scaleContext = {}; + SceneViewportActiveGizmoKind activeGizmoKind = SceneViewportActiveGizmoKind::None; +}; + +inline SceneViewportActiveGizmoKind GetActiveSceneViewportGizmoKind( + const SceneViewportMoveGizmo& moveGizmo, + const SceneViewportRotateGizmo& rotateGizmo, + const SceneViewportScaleGizmo& scaleGizmo) { + if (moveGizmo.IsActive()) { + return SceneViewportActiveGizmoKind::Move; + } + if (rotateGizmo.IsActive()) { + return SceneViewportActiveGizmoKind::Rotate; + } + if (scaleGizmo.IsActive()) { + return SceneViewportActiveGizmoKind::Scale; + } + + return SceneViewportActiveGizmoKind::None; +} + +inline Math::Quaternion ComputeStableWorldRotation(const Components::GameObject* gameObject) { + if (gameObject == nullptr || gameObject->GetTransform() == nullptr) { + return Math::Quaternion::Identity(); + } + + const auto* transform = gameObject->GetTransform(); + Math::Quaternion worldRotation = transform->GetLocalRotation(); + for (const auto* parent = transform->GetParent(); + parent != nullptr; + parent = parent->GetParent()) { + worldRotation = parent->GetLocalRotation() * worldRotation; + } + + return worldRotation.Normalized(); +} + +inline Math::Vector3 GetGameObjectPivotWorldPosition(const Components::GameObject* gameObject) { + if (gameObject == nullptr || gameObject->GetTransform() == nullptr) { + return Math::Vector3::Zero(); + } + + return gameObject->GetTransform()->GetPosition(); +} + +inline Math::Vector3 GetGameObjectCenterWorldPosition(const Components::GameObject* gameObject) { + if (gameObject == nullptr || gameObject->GetTransform() == nullptr) { + return Math::Vector3::Zero(); + } + + if (auto* meshFilter = gameObject->GetComponent()) { + if (Resources::Mesh* mesh = meshFilter->GetMesh(); + mesh != nullptr && mesh->IsValid()) { + return gameObject->GetTransform()->TransformPoint(mesh->GetBounds().center); + } + } + + return gameObject->GetTransform()->GetPosition(); +} + +inline SceneViewportSelectionGizmoState BuildSceneViewportSelectionGizmoState( + IEditorContext& context, + bool useCenterPivot) { + SceneViewportSelectionGizmoState state = {}; + const uint64_t primaryEntityId = context.GetSelectionManager().GetSelectedEntity(); + if (primaryEntityId != 0) { + state.primaryObject = context.GetSceneManager().GetEntity(primaryEntityId); + } + + const std::vector& selectedEntities = context.GetSelectionManager().GetSelectedEntities(); + state.selectedObjects.reserve(selectedEntities.size()); + for (uint64_t entityId : selectedEntities) { + if (entityId == 0) { + continue; + } + + if (auto* gameObject = context.GetSceneManager().GetEntity(entityId)) { + state.selectedObjects.push_back(gameObject); + } + } + + if (state.primaryObject == nullptr && !state.selectedObjects.empty()) { + state.primaryObject = state.selectedObjects.back(); + } + if (state.primaryObject != nullptr && state.selectedObjects.empty()) { + state.selectedObjects.push_back(state.primaryObject); + } + if (state.primaryObject != nullptr) { + state.primaryWorldRotation = ComputeStableWorldRotation(state.primaryObject); + } + if (state.selectedObjects.empty()) { + return state; + } + + if (useCenterPivot) { + Math::Vector3 centerSum = Math::Vector3::Zero(); + for (const auto* gameObject : state.selectedObjects) { + centerSum += GetGameObjectCenterWorldPosition(gameObject); + } + state.pivotWorldPosition = centerSum / static_cast(state.selectedObjects.size()); + } else { + state.pivotWorldPosition = GetGameObjectPivotWorldPosition(state.primaryObject); + } + + return state; +} + +inline SceneViewportMoveGizmoContext BuildMoveGizmoContext( + const SceneViewportSelectionGizmoState& selectionState, + const SceneViewportOverlayData& overlay, + const Math::Vector2& viewportSize, + const Math::Vector2& mousePosition, + bool localSpace) { + SceneViewportMoveGizmoContext gizmoContext = {}; + gizmoContext.overlay = overlay; + gizmoContext.viewportSize = viewportSize; + gizmoContext.mousePosition = mousePosition; + gizmoContext.selectedObject = selectionState.primaryObject; + gizmoContext.selectedObjects = selectionState.selectedObjects; + gizmoContext.pivotWorldPosition = selectionState.pivotWorldPosition; + gizmoContext.axisOrientation = localSpace + ? selectionState.primaryWorldRotation + : Math::Quaternion::Identity(); + + return gizmoContext; +} + +inline SceneViewportRotateGizmoContext BuildRotateGizmoContext( + const SceneViewportSelectionGizmoState& selectionState, + const SceneViewportOverlayData& overlay, + const Math::Vector2& viewportSize, + const Math::Vector2& mousePosition, + bool localSpace, + bool rotateAroundSharedPivot) { + SceneViewportRotateGizmoContext gizmoContext = {}; + gizmoContext.overlay = overlay; + gizmoContext.viewportSize = viewportSize; + gizmoContext.mousePosition = mousePosition; + gizmoContext.selectedObject = selectionState.primaryObject; + gizmoContext.selectedObjects = selectionState.selectedObjects; + gizmoContext.pivotWorldPosition = selectionState.pivotWorldPosition; + gizmoContext.axisOrientation = localSpace + ? selectionState.primaryWorldRotation + : Math::Quaternion::Identity(); + gizmoContext.localSpace = localSpace; + gizmoContext.rotateAroundSharedPivot = rotateAroundSharedPivot; + + return gizmoContext; +} + +inline SceneViewportScaleGizmoContext BuildScaleGizmoContext( + const SceneViewportSelectionGizmoState& selectionState, + const SceneViewportOverlayData& overlay, + const Math::Vector2& viewportSize, + const Math::Vector2& mousePosition, + bool localSpace) { + SceneViewportScaleGizmoContext gizmoContext = {}; + gizmoContext.overlay = overlay; + gizmoContext.viewportSize = viewportSize; + gizmoContext.mousePosition = mousePosition; + gizmoContext.selectedObject = selectionState.primaryObject; + gizmoContext.pivotWorldPosition = selectionState.pivotWorldPosition; + gizmoContext.axisOrientation = localSpace + ? selectionState.primaryWorldRotation + : Math::Quaternion::Identity(); + + return gizmoContext; +} + +inline void CancelSceneViewportTransformGizmoDrags( + IEditorContext& context, + SceneViewportMoveGizmo& moveGizmo, + SceneViewportRotateGizmo& rotateGizmo, + SceneViewportScaleGizmo& scaleGizmo) { + if (moveGizmo.IsActive()) { + moveGizmo.CancelDrag(&context.GetUndoManager()); + } + if (rotateGizmo.IsActive()) { + rotateGizmo.CancelDrag(&context.GetUndoManager()); + } + if (scaleGizmo.IsActive()) { + scaleGizmo.CancelDrag(&context.GetUndoManager()); + } +} + +inline SceneViewportTransformGizmoFrameState RefreshSceneViewportTransformGizmos( + IEditorContext& context, + const SceneViewportOverlayData& overlay, + const Math::Vector2& viewportSize, + const Math::Vector2& mousePosition, + bool useCenterPivot, + bool localSpace, + bool usingTransformTool, + bool showingMoveGizmo, + SceneViewportMoveGizmo& moveGizmo, + bool showingRotateGizmo, + SceneViewportRotateGizmo& rotateGizmo, + bool showingScaleGizmo, + SceneViewportScaleGizmo& scaleGizmo) { + SceneViewportTransformGizmoFrameState state = {}; + state.overlay = overlay; + state.selectionState = BuildSceneViewportSelectionGizmoState(context, useCenterPivot); + + if (showingMoveGizmo) { + state.moveContext = BuildMoveGizmoContext( + state.selectionState, + overlay, + viewportSize, + mousePosition, + localSpace); + if (moveGizmo.IsActive() && + (state.moveContext.selectedObject == nullptr || + context.GetSelectionManager().GetSelectedEntity() != moveGizmo.GetActiveEntityId())) { + moveGizmo.CancelDrag(&context.GetUndoManager()); + } + } else if (moveGizmo.IsActive()) { + moveGizmo.CancelDrag(&context.GetUndoManager()); + } + + if (showingRotateGizmo) { + state.rotateContext = BuildRotateGizmoContext( + state.selectionState, + overlay, + viewportSize, + mousePosition, + localSpace, + useCenterPivot); + if (rotateGizmo.IsActive() && + (state.rotateContext.selectedObject == nullptr || + context.GetSelectionManager().GetSelectedEntity() != rotateGizmo.GetActiveEntityId())) { + rotateGizmo.CancelDrag(&context.GetUndoManager()); + } + } else if (rotateGizmo.IsActive()) { + rotateGizmo.CancelDrag(&context.GetUndoManager()); + } + + if (showingScaleGizmo) { + state.scaleContext = BuildScaleGizmoContext( + state.selectionState, + overlay, + viewportSize, + mousePosition, + localSpace); + state.scaleContext.uniformOnly = usingTransformTool; + if (scaleGizmo.IsActive() && + (state.scaleContext.selectedObject == nullptr || + context.GetSelectionManager().GetSelectedEntity() != scaleGizmo.GetActiveEntityId())) { + scaleGizmo.CancelDrag(&context.GetUndoManager()); + } + } else if (scaleGizmo.IsActive()) { + scaleGizmo.CancelDrag(&context.GetUndoManager()); + } + + state.activeGizmoKind = GetActiveSceneViewportGizmoKind(moveGizmo, rotateGizmo, scaleGizmo); + + if (showingMoveGizmo) { + SceneViewportMoveGizmoContext updateContext = state.moveContext; + if (state.activeGizmoKind != SceneViewportActiveGizmoKind::None && + state.activeGizmoKind != SceneViewportActiveGizmoKind::Move) { + updateContext.mousePosition = Math::Vector2(-1.0f, -1.0f); + } + moveGizmo.Update(updateContext); + } + if (showingRotateGizmo) { + SceneViewportRotateGizmoContext updateContext = state.rotateContext; + if (state.activeGizmoKind != SceneViewportActiveGizmoKind::None && + state.activeGizmoKind != SceneViewportActiveGizmoKind::Rotate) { + updateContext.mousePosition = Math::Vector2(-1.0f, -1.0f); + } + rotateGizmo.Update(updateContext); + } + if (showingScaleGizmo) { + SceneViewportScaleGizmoContext updateContext = state.scaleContext; + if (state.activeGizmoKind != SceneViewportActiveGizmoKind::None && + state.activeGizmoKind != SceneViewportActiveGizmoKind::Scale) { + updateContext.mousePosition = Math::Vector2(-1.0f, -1.0f); + } + scaleGizmo.Update(updateContext); + } + + return state; +} + +} // namespace Editor +} // namespace XCEngine diff --git a/editor/src/Viewport/ViewportHostRenderFlowUtils.h b/editor/src/Viewport/ViewportHostRenderFlowUtils.h index 6e50e6bb..751dccfd 100644 --- a/editor/src/Viewport/ViewportHostRenderFlowUtils.h +++ b/editor/src/Viewport/ViewportHostRenderFlowUtils.h @@ -166,7 +166,9 @@ inline void ApplySceneViewportRenderRequestSetup( const Rendering::BuiltinPostProcessRequest* builtinPostProcess, Rendering::RenderPassSequence* postPasses, Rendering::CameraRenderRequest& request) { + request.preScenePasses = nullptr; request.postScenePasses = nullptr; + request.overlayPasses = nullptr; request.objectId = {}; request.builtinPostProcess = {}; diff --git a/editor/src/Viewport/ViewportHostService.h b/editor/src/Viewport/ViewportHostService.h index 8ac0f8c3..7590c075 100644 --- a/editor/src/Viewport/ViewportHostService.h +++ b/editor/src/Viewport/ViewportHostService.h @@ -4,7 +4,11 @@ #include "Core/ISceneManager.h" #include "Core/ISelectionManager.h" #include "IViewportHostService.h" +#include "Passes/SceneViewportEditorOverlayPass.h" #include "SceneViewportCameraController.h" +#include "SceneViewportEditorOverlayData.h" +#include "SceneViewportOverlayHandleBuilder.h" +#include "SceneViewportOverlayBuilder.h" #include "ViewportHostRenderFlowUtils.h" #include "ViewportHostRenderTargets.h" #include "ViewportObjectIdPicker.h" @@ -12,6 +16,7 @@ #include #include +#include #include #include #include @@ -24,7 +29,9 @@ #include #include +#include #include +#include #include #include #include @@ -35,6 +42,133 @@ namespace Editor { namespace { constexpr bool kDebugSceneSelectionMask = false; +constexpr uint64_t kSceneViewportOverlaySignatureOffsetBasis = 14695981039346656037ull; +constexpr uint64_t kSceneViewportOverlaySignaturePrime = 1099511628211ull; + +void HashSceneViewportOverlayBytes(uint64_t& hash, const void* data, size_t size) { + const auto* bytes = static_cast(data); + for (size_t index = 0; index < size; ++index) { + hash ^= static_cast(bytes[index]); + hash *= kSceneViewportOverlaySignaturePrime; + } +} + +template +void HashSceneViewportOverlayValue(uint64_t& hash, const TValue& value) { + HashSceneViewportOverlayBytes(hash, &value, sizeof(TValue)); +} + +void HashSceneViewportOverlayFloat(uint64_t& hash, float value) { + uint32_t bits = 0u; + std::memcpy(&bits, &value, sizeof(bits)); + HashSceneViewportOverlayValue(hash, bits); +} + +void HashSceneViewportOverlayVector3(uint64_t& hash, const Math::Vector3& value) { + HashSceneViewportOverlayFloat(hash, value.x); + HashSceneViewportOverlayFloat(hash, value.y); + HashSceneViewportOverlayFloat(hash, value.z); +} + +void HashSceneViewportOverlayQuaternion(uint64_t& hash, const Math::Quaternion& value) { + HashSceneViewportOverlayFloat(hash, value.x); + HashSceneViewportOverlayFloat(hash, value.y); + HashSceneViewportOverlayFloat(hash, value.z); + HashSceneViewportOverlayFloat(hash, value.w); +} + +void HashSceneViewportOverlayRect(uint64_t& hash, const Math::Rect& value) { + HashSceneViewportOverlayFloat(hash, value.x); + HashSceneViewportOverlayFloat(hash, value.y); + HashSceneViewportOverlayFloat(hash, value.width); + HashSceneViewportOverlayFloat(hash, value.height); +} + +void HashSceneViewportOverlayTransform(uint64_t& hash, const Components::TransformComponent& transform) { + HashSceneViewportOverlayVector3(hash, transform.GetPosition()); + HashSceneViewportOverlayQuaternion(hash, transform.GetRotation()); + HashSceneViewportOverlayVector3(hash, transform.GetScale()); +} + +uint64_t BuildSceneViewEditorOverlayContentSignature( + const Components::Scene* scene, + const std::vector& selectedObjectIds) { + uint64_t hash = kSceneViewportOverlaySignatureOffsetBasis; + + HashSceneViewportOverlayValue(hash, static_cast(selectedObjectIds.size())); + for (uint64_t entityId : selectedObjectIds) { + HashSceneViewportOverlayValue(hash, entityId); + } + + if (scene == nullptr) { + return hash; + } + + for (Components::CameraComponent* camera : scene->FindObjectsOfType()) { + Components::GameObject* gameObject = camera != nullptr ? camera->GetGameObject() : nullptr; + HashSceneViewportOverlayValue(hash, static_cast(1u)); + HashSceneViewportOverlayValue(hash, gameObject != nullptr ? gameObject->GetID() : 0ull); + HashSceneViewportOverlayValue(hash, camera != nullptr && camera->IsEnabled()); + HashSceneViewportOverlayValue(hash, gameObject != nullptr && gameObject->IsActiveInHierarchy()); + if (camera == nullptr || + gameObject == nullptr || + !camera->IsEnabled() || + !gameObject->IsActiveInHierarchy() || + gameObject->GetTransform() == nullptr) { + continue; + } + + HashSceneViewportOverlayTransform(hash, *gameObject->GetTransform()); + HashSceneViewportOverlayValue(hash, static_cast(camera->GetProjectionType())); + HashSceneViewportOverlayFloat(hash, camera->GetFieldOfView()); + HashSceneViewportOverlayFloat(hash, camera->GetOrthographicSize()); + HashSceneViewportOverlayFloat(hash, camera->GetNearClipPlane()); + HashSceneViewportOverlayFloat(hash, camera->GetFarClipPlane()); + HashSceneViewportOverlayRect(hash, camera->GetViewportRect()); + } + + for (Components::LightComponent* light : scene->FindObjectsOfType()) { + Components::GameObject* gameObject = light != nullptr ? light->GetGameObject() : nullptr; + HashSceneViewportOverlayValue(hash, static_cast(2u)); + HashSceneViewportOverlayValue(hash, gameObject != nullptr ? gameObject->GetID() : 0ull); + HashSceneViewportOverlayValue(hash, light != nullptr && light->IsEnabled()); + HashSceneViewportOverlayValue(hash, gameObject != nullptr && gameObject->IsActiveInHierarchy()); + if (light == nullptr || + gameObject == nullptr || + !light->IsEnabled() || + !gameObject->IsActiveInHierarchy() || + gameObject->GetTransform() == nullptr) { + continue; + } + + HashSceneViewportOverlayTransform(hash, *gameObject->GetTransform()); + HashSceneViewportOverlayValue(hash, static_cast(light->GetLightType())); + } + + return hash; +} + +bool AreEqualSceneViewportVector3(const Math::Vector3& lhs, const Math::Vector3& rhs) { + constexpr float kEpsilon = 1e-4f; + return std::abs(lhs.x - rhs.x) <= kEpsilon && + std::abs(lhs.y - rhs.y) <= kEpsilon && + std::abs(lhs.z - rhs.z) <= kEpsilon; +} + +bool AreEqualSceneViewportOverlayData( + const SceneViewportOverlayData& lhs, + const SceneViewportOverlayData& rhs) { + constexpr float kEpsilon = 1e-4f; + return lhs.valid == rhs.valid && + AreEqualSceneViewportVector3(lhs.cameraPosition, rhs.cameraPosition) && + AreEqualSceneViewportVector3(lhs.cameraForward, rhs.cameraForward) && + AreEqualSceneViewportVector3(lhs.cameraRight, rhs.cameraRight) && + AreEqualSceneViewportVector3(lhs.cameraUp, rhs.cameraUp) && + std::abs(lhs.verticalFovDegrees - rhs.verticalFovDegrees) <= kEpsilon && + std::abs(lhs.nearClipPlane - rhs.nearClipPlane) <= kEpsilon && + std::abs(lhs.farClipPlane - rhs.farClipPlane) <= kEpsilon && + std::abs(lhs.orbitDistance - rhs.orbitDistance) <= kEpsilon; +} Math::Vector3 GetSceneViewportOrientationAxisVector(SceneViewportOrientationAxis axis) { switch (axis) { @@ -71,7 +205,9 @@ public: entry = {}; } + m_sceneViewportEditorOverlayRenderer.Shutdown(); m_sceneViewCamera = {}; + ResetSceneViewEditorOverlayFrameData(); m_sceneViewLastRenderContext = {}; m_device = nullptr; m_backend = nullptr; @@ -84,6 +220,8 @@ public: entry.requestedWidth = 0; entry.requestedHeight = 0; } + m_sceneViewTransientTransformGizmoOverlay = {}; + m_sceneViewTransientTransformGizmoInputs = {}; } EditorViewportFrame RequestViewport(EditorViewportKind kind, const ImVec2& requestedSize) override { @@ -212,6 +350,30 @@ public: return data; } + const SceneViewportOverlayFrameData& GetSceneViewEditorOverlayFrameData(IEditorContext& context) override { + EnsureSceneViewEditorOverlayFrameData(context); + return m_sceneViewEditorOverlayFrameData; + } + + const SceneViewportOverlayFrameData& GetSceneViewInteractionOverlayFrameData( + IEditorContext& context, + const SceneViewportOverlayData& overlay, + const SceneViewportTransformGizmoHandleBuildInputs& inputs) override { + EnsureSceneViewEditorOverlayFrameData(context); + m_sceneViewInteractionOverlayFrameData = m_sceneViewEditorOverlayFrameData; + AppendSceneViewportOverlayFrameData( + m_sceneViewInteractionOverlayFrameData, + BuildSceneViewportTransformGizmoOverlayFrameData(overlay, inputs)); + return m_sceneViewInteractionOverlayFrameData; + } + + void SetSceneViewTransientTransformGizmoOverlayData( + const SceneViewportOverlayData& overlay, + const SceneViewportTransformGizmoHandleBuildInputs& inputs) override { + m_sceneViewTransientTransformGizmoOverlay = overlay; + m_sceneViewTransientTransformGizmoInputs = inputs; + } + void RenderRequestedViewports( IEditorContext& context, const Rendering::RenderContext& renderContext) override { @@ -256,6 +418,7 @@ private: struct SceneViewportRenderState { SceneViewportOverlayData overlay = {}; Rendering::BuiltinPostProcessRequest builtinPostProcess = {}; + SceneViewportOverlayFrameData editorOverlayFrameData = {}; std::vector selectedObjectIds; }; @@ -365,6 +528,86 @@ private: return BuildViewportColorSurface(entry.renderTargets); } + void ResetSceneViewEditorOverlayFrameData() { + m_sceneViewEditorOverlayFrameData = {}; + m_sceneViewInteractionOverlayFrameData = {}; + m_sceneViewEditorOverlayScene = nullptr; + m_sceneViewEditorOverlaySelectedObjectIds.clear(); + m_sceneViewEditorOverlayViewportWidth = 0u; + m_sceneViewEditorOverlayViewportHeight = 0u; + m_sceneViewEditorOverlayContentSignature = 0u; + m_sceneViewEditorOverlayCached = false; + } + + void ResolveSceneViewEditorOverlayViewportSize( + const ViewportEntry& entry, + uint32_t& outWidth, + uint32_t& outHeight) const { + outWidth = entry.requestedWidth > 0u ? entry.requestedWidth : entry.renderTargets.width; + outHeight = entry.requestedHeight > 0u ? entry.requestedHeight : entry.renderTargets.height; + } + + bool ShouldRebuildSceneViewEditorOverlayFrameData( + const Components::Scene* scene, + const SceneViewportOverlayData& overlay, + uint32_t viewportWidth, + uint32_t viewportHeight, + const std::vector& selectedObjectIds, + uint64_t contentSignature) const { + return !m_sceneViewEditorOverlayCached || + m_sceneViewEditorOverlayScene != scene || + m_sceneViewEditorOverlayViewportWidth != viewportWidth || + m_sceneViewEditorOverlayViewportHeight != viewportHeight || + m_sceneViewEditorOverlaySelectedObjectIds != selectedObjectIds || + m_sceneViewEditorOverlayContentSignature != contentSignature || + !AreEqualSceneViewportOverlayData(m_sceneViewEditorOverlayFrameData.overlay, overlay); + } + + void EnsureSceneViewEditorOverlayFrameData(IEditorContext& context) { + if (!EnsureSceneViewCamera()) { + ResetSceneViewEditorOverlayFrameData(); + return; + } + + const ViewportEntry& entry = GetEntry(EditorViewportKind::Scene); + uint32_t viewportWidth = 0u; + uint32_t viewportHeight = 0u; + ResolveSceneViewEditorOverlayViewportSize(entry, viewportWidth, viewportHeight); + + const Components::Scene* scene = context.GetSceneManager().GetScene(); + const SceneViewportOverlayData overlay = GetSceneViewOverlayData(); + const std::vector selectedObjectIds = context.GetSelectionManager().GetSelectedEntities(); + const uint64_t contentSignature = + BuildSceneViewEditorOverlayContentSignature(scene, selectedObjectIds); + if (!ShouldRebuildSceneViewEditorOverlayFrameData( + scene, + overlay, + viewportWidth, + viewportHeight, + selectedObjectIds, + contentSignature)) { + return; + } + + m_sceneViewEditorOverlayFrameData = {}; + m_sceneViewEditorOverlayFrameData.overlay = overlay; + if (scene != nullptr && overlay.valid && viewportWidth > 0u && viewportHeight > 0u) { + m_sceneViewEditorOverlayFrameData = SceneViewportOverlayBuilder::Build( + context, + overlay, + viewportWidth, + viewportHeight, + selectedObjectIds); + } + + m_sceneViewEditorOverlayScene = scene; + m_sceneViewEditorOverlaySelectedObjectIds = selectedObjectIds; + m_sceneViewEditorOverlayViewportWidth = viewportWidth; + m_sceneViewEditorOverlayViewportHeight = viewportHeight; + m_sceneViewEditorOverlayContentSignature = contentSignature; + m_sceneViewEditorOverlayCached = true; + } + void ApplyViewportRenderFailure( ViewportEntry& entry, const Rendering::RenderContext& renderContext, @@ -399,6 +642,7 @@ private: } outState.selectedObjectIds = context.GetSelectionManager().GetSelectedEntities(); + outState.editorOverlayFrameData = GetSceneViewEditorOverlayFrameData(context); const SceneViewportBuiltinPostProcessBuildResult builtinPostProcess = BuildSceneViewportBuiltinPostProcess( outState.overlay, @@ -456,6 +700,18 @@ private: &sceneState.builtinPostProcess, nullptr, requests[0]); + SceneViewportOverlayFrameData renderOverlayFrameData = sceneState.editorOverlayFrameData; + AppendSceneViewportOverlayFrameData( + renderOverlayFrameData, + BuildSceneViewTransientTransformGizmoOverlayFrameData()); + Rendering::RenderPassSequence overlayPassSequence = {}; + if (renderOverlayFrameData.HasOverlayPrimitives()) { + overlayPassSequence.AddPass( + CreateSceneViewportEditorOverlayPass( + m_sceneViewportEditorOverlayRenderer, + renderOverlayFrameData)); + requests[0].overlayPasses = &overlayPassSequence; + } requests[0].hasClearColorOverride = true; requests[0].clearColorOverride = Math::Color(0.27f, 0.27f, 0.27f, 1.0f); @@ -600,12 +856,29 @@ private: }); } + SceneViewportOverlayFrameData BuildSceneViewTransientTransformGizmoOverlayFrameData() const { + return BuildSceneViewportTransformGizmoOverlayFrameData( + m_sceneViewTransientTransformGizmoOverlay, + m_sceneViewTransientTransformGizmoInputs); + } + UI::ImGuiBackendBridge* m_backend = nullptr; RHI::RHIDevice* m_device = nullptr; std::unique_ptr m_sceneRenderer; Rendering::RenderContext m_sceneViewLastRenderContext = {}; std::array m_entries = {}; SceneViewCameraState m_sceneViewCamera; + SceneViewportOverlayFrameData m_sceneViewEditorOverlayFrameData = {}; + SceneViewportOverlayFrameData m_sceneViewInteractionOverlayFrameData = {}; + SceneViewportOverlayData m_sceneViewTransientTransformGizmoOverlay = {}; + SceneViewportTransformGizmoHandleBuildInputs m_sceneViewTransientTransformGizmoInputs = {}; + const Components::Scene* m_sceneViewEditorOverlayScene = nullptr; + std::vector m_sceneViewEditorOverlaySelectedObjectIds = {}; + uint32_t m_sceneViewEditorOverlayViewportWidth = 0u; + uint32_t m_sceneViewEditorOverlayViewportHeight = 0u; + uint64_t m_sceneViewEditorOverlayContentSignature = 0u; + bool m_sceneViewEditorOverlayCached = false; + SceneViewportEditorOverlayPassRenderer m_sceneViewportEditorOverlayRenderer; }; } // namespace Editor diff --git a/editor/src/panels/GameViewPanel.cpp b/editor/src/panels/GameViewPanel.cpp index 0c7a12df..cbcd1114 100644 --- a/editor/src/panels/GameViewPanel.cpp +++ b/editor/src/panels/GameViewPanel.cpp @@ -1,12 +1,166 @@ #include "Actions/ActionRouting.h" +#include "Core/EventBus.h" +#include "Core/EditorEvents.h" #include "GameViewPanel.h" #include "ViewportPanelContent.h" #include "UI/UI.h" + +#include + #include namespace XCEngine { namespace Editor { +namespace { + +void SetKeyState(GameViewInputFrameEvent& event, XCEngine::Input::KeyCode key, bool isDown) { + const size_t index = static_cast(key); + if (index < event.keyDown.size()) { + event.keyDown[index] = isDown; + } +} + +void SetMouseButtonState(GameViewInputFrameEvent& event, XCEngine::Input::MouseButton button, bool isDown) { + const size_t index = static_cast(button); + if (index < event.mouseButtonDown.size()) { + event.mouseButtonDown[index] = isDown; + } +} + +void FillGameViewKeyboardState(const ImGuiIO& io, GameViewInputFrameEvent& event) { + using XCEngine::Input::KeyCode; + + const struct KeyMapping { + ImGuiKey imguiKey; + KeyCode keyCode; + } keyMappings[] = { + {ImGuiKey_A, KeyCode::A}, + {ImGuiKey_B, KeyCode::B}, + {ImGuiKey_C, KeyCode::C}, + {ImGuiKey_D, KeyCode::D}, + {ImGuiKey_E, KeyCode::E}, + {ImGuiKey_F, KeyCode::F}, + {ImGuiKey_G, KeyCode::G}, + {ImGuiKey_H, KeyCode::H}, + {ImGuiKey_I, KeyCode::I}, + {ImGuiKey_J, KeyCode::J}, + {ImGuiKey_K, KeyCode::K}, + {ImGuiKey_L, KeyCode::L}, + {ImGuiKey_M, KeyCode::M}, + {ImGuiKey_N, KeyCode::N}, + {ImGuiKey_O, KeyCode::O}, + {ImGuiKey_P, KeyCode::P}, + {ImGuiKey_Q, KeyCode::Q}, + {ImGuiKey_R, KeyCode::R}, + {ImGuiKey_S, KeyCode::S}, + {ImGuiKey_T, KeyCode::T}, + {ImGuiKey_U, KeyCode::U}, + {ImGuiKey_V, KeyCode::V}, + {ImGuiKey_W, KeyCode::W}, + {ImGuiKey_X, KeyCode::X}, + {ImGuiKey_Y, KeyCode::Y}, + {ImGuiKey_Z, KeyCode::Z}, + {ImGuiKey_0, KeyCode::Zero}, + {ImGuiKey_1, KeyCode::One}, + {ImGuiKey_2, KeyCode::Two}, + {ImGuiKey_3, KeyCode::Three}, + {ImGuiKey_4, KeyCode::Four}, + {ImGuiKey_5, KeyCode::Five}, + {ImGuiKey_6, KeyCode::Six}, + {ImGuiKey_7, KeyCode::Seven}, + {ImGuiKey_8, KeyCode::Eight}, + {ImGuiKey_9, KeyCode::Nine}, + {ImGuiKey_Space, KeyCode::Space}, + {ImGuiKey_Tab, KeyCode::Tab}, + {ImGuiKey_Enter, KeyCode::Enter}, + {ImGuiKey_Escape, KeyCode::Escape}, + {ImGuiKey_LeftShift, KeyCode::LeftShift}, + {ImGuiKey_RightShift, KeyCode::RightShift}, + {ImGuiKey_LeftCtrl, KeyCode::LeftCtrl}, + {ImGuiKey_RightCtrl, KeyCode::RightCtrl}, + {ImGuiKey_LeftAlt, KeyCode::LeftAlt}, + {ImGuiKey_RightAlt, KeyCode::RightAlt}, + {ImGuiKey_UpArrow, KeyCode::Up}, + {ImGuiKey_DownArrow, KeyCode::Down}, + {ImGuiKey_LeftArrow, KeyCode::Left}, + {ImGuiKey_RightArrow, KeyCode::Right}, + {ImGuiKey_Home, KeyCode::Home}, + {ImGuiKey_End, KeyCode::End}, + {ImGuiKey_PageUp, KeyCode::PageUp}, + {ImGuiKey_PageDown, KeyCode::PageDown}, + {ImGuiKey_Delete, KeyCode::Delete}, + {ImGuiKey_Backspace, KeyCode::Backspace}, + {ImGuiKey_F1, KeyCode::F1}, + {ImGuiKey_F2, KeyCode::F2}, + {ImGuiKey_F3, KeyCode::F3}, + {ImGuiKey_F4, KeyCode::F4}, + {ImGuiKey_F5, KeyCode::F5}, + {ImGuiKey_F6, KeyCode::F6}, + {ImGuiKey_F7, KeyCode::F7}, + {ImGuiKey_F8, KeyCode::F8}, + {ImGuiKey_F9, KeyCode::F9}, + {ImGuiKey_F10, KeyCode::F10}, + {ImGuiKey_F11, KeyCode::F11}, + {ImGuiKey_F12, KeyCode::F12}, + {ImGuiKey_Minus, KeyCode::Minus}, + {ImGuiKey_Equal, KeyCode::Equals}, + {ImGuiKey_LeftBracket, KeyCode::BracketLeft}, + {ImGuiKey_RightBracket, KeyCode::BracketRight}, + {ImGuiKey_Semicolon, KeyCode::Semicolon}, + {ImGuiKey_Apostrophe, KeyCode::Quote}, + {ImGuiKey_Comma, KeyCode::Comma}, + {ImGuiKey_Period, KeyCode::Period}, + {ImGuiKey_Slash, KeyCode::Slash}, + {ImGuiKey_Backslash, KeyCode::Backslash}, + {ImGuiKey_GraveAccent, KeyCode::Backtick}, + }; + + for (const KeyMapping& mapping : keyMappings) { + SetKeyState(event, mapping.keyCode, ImGui::IsKeyDown(mapping.imguiKey)); + } +} + +void FillGameViewMouseState(const ImGuiIO& io, GameViewInputFrameEvent& event) { + (void)io; + SetMouseButtonState(event, XCEngine::Input::MouseButton::Left, ImGui::IsMouseDown(ImGuiMouseButton_Left)); + SetMouseButtonState(event, XCEngine::Input::MouseButton::Right, ImGui::IsMouseDown(ImGuiMouseButton_Right)); + SetMouseButtonState(event, XCEngine::Input::MouseButton::Middle, ImGui::IsMouseDown(ImGuiMouseButton_Middle)); +} + +GameViewInputFrameEvent BuildGameViewInputFrame(const ViewportPanelContentResult& content) { + GameViewInputFrameEvent event = {}; + if (!content.hasViewportArea) { + return event; + } + + const ImGuiIO& io = ImGui::GetIO(); + event.hovered = content.hovered; + event.focused = content.focused; + event.mousePosition = XCEngine::Math::Vector2( + io.MousePos.x - content.itemMin.x, + io.MousePos.y - content.itemMin.y); + event.mouseDelta = XCEngine::Math::Vector2(io.MouseDelta.x, io.MouseDelta.y); + event.mouseWheel = content.hovered ? io.MouseWheel : 0.0f; + + if (event.hovered || event.focused) { + FillGameViewKeyboardState(io, event); + FillGameViewMouseState(io, event); + } + + return event; +} + +void PublishGameViewInputFrame(IEditorContext* context, const GameViewInputFrameEvent& event) { + if (context == nullptr) { + return; + } + + context->GetEventBus().Publish(event); +} + +} // namespace + GameViewPanel::GameViewPanel() : Panel("Game") {} void GameViewPanel::Render() { @@ -14,10 +168,12 @@ void GameViewPanel::Render() { UI::PanelWindowScope panel(m_name.c_str()); ImGui::PopStyleVar(); if (!panel.IsOpen()) { + PublishGameViewInputFrame(m_context, GameViewInputFrameEvent{}); return; } - RenderViewportPanelContent(*m_context, EditorViewportKind::Game); + const ViewportPanelContentResult content = RenderViewportPanelContent(*m_context, EditorViewportKind::Game); + PublishGameViewInputFrame(m_context, BuildGameViewInputFrame(content)); Actions::ObserveInactiveActionRoute(*m_context); } diff --git a/editor/src/panels/InspectorPanel.h b/editor/src/panels/InspectorPanel.h index 5c4d2e4b..3ba6dc1d 100644 --- a/editor/src/panels/InspectorPanel.h +++ b/editor/src/panels/InspectorPanel.h @@ -1,10 +1,18 @@ #pragma once #include "Panel.h" +#include "Core/AssetItem.h" +#include "Core/EditorActionRoute.h" #include "UI/PopupState.h" +#include +#include + +#include #include #include +#include +#include namespace XCEngine { namespace Components { @@ -23,7 +31,55 @@ public: void OnDetach() override; void Render() override; + enum class SubjectMode { + None, + GameObject, + MaterialAsset, + UnsupportedAsset + }; + + struct MaterialTagEditRow { + std::array name{}; + std::array value{}; + }; + + struct MaterialAssetState { + std::string assetPath; + std::string assetFullPath; + std::string assetName; + std::array shaderPath{}; + std::array shaderPass{}; + int renderQueue = static_cast(::XCEngine::Resources::MaterialRenderQueue::Geometry); + ::XCEngine::Resources::MaterialRenderState renderState{}; + std::vector tags; + std::string errorMessage; + bool dirty = false; + bool loaded = false; + + void Reset() { + assetPath.clear(); + assetFullPath.clear(); + assetName.clear(); + shaderPath.fill('\0'); + shaderPass.fill('\0'); + renderQueue = static_cast(::XCEngine::Resources::MaterialRenderQueue::Geometry); + renderState = ::XCEngine::Resources::MaterialRenderState(); + tags.clear(); + errorMessage.clear(); + dirty = false; + loaded = false; + } + }; + private: + void SyncSubject(); + void SetSubjectMode(SubjectMode mode); + void InspectMaterialAsset(const AssetItemPtr& item); + void ClearMaterialAsset(); + void RenderMaterialAsset(); + void RenderUnsupportedAsset(); + bool SaveMaterialAsset(); + void ReloadMaterialAsset(); void RenderGameObject(::XCEngine::Components::GameObject* gameObject); void RenderComponent(::XCEngine::Components::Component* component, ::XCEngine::Components::GameObject* gameObject); void RenderEmptyState(const char* title, const char* subtitle = nullptr); @@ -31,6 +87,11 @@ private: uint64_t m_selectionHandlerId = 0; uint64_t m_selectedEntityId = 0; + SubjectMode m_subjectMode = SubjectMode::None; + EditorActionRoute m_lastExplicitRoute = EditorActionRoute::None; + AssetItemPtr m_selectedAssetItem; + ::XCEngine::Resources::ResourceHandle<::XCEngine::Resources::Material> m_selectedMaterial; + MaterialAssetState m_materialAssetState; UI::DeferredPopupState m_addComponentPopup; std::function m_deferredContextAction; }; diff --git a/editor/src/panels/MenuBar.cpp b/editor/src/panels/MenuBar.cpp index dea5beef..76ce97e9 100644 --- a/editor/src/panels/MenuBar.cpp +++ b/editor/src/panels/MenuBar.cpp @@ -21,6 +21,10 @@ constexpr float kRunToolbarHeight = 32.0f; constexpr float kRunToolbarButtonExtent = 24.0f; constexpr float kRunToolbarButtonSpacing = 8.0f; constexpr float kRunToolbarIconInset = 3.0f; +constexpr ImVec2 kMainMenuFramePadding(6.0f, 2.0f); +constexpr ImVec4 kMainMenuTextColor(0.08f, 0.08f, 0.08f, 1.0f); +constexpr ImVec4 kMainMenuItemHoveredColor(0.88f, 0.88f, 0.88f, 1.0f); +constexpr ImVec4 kMainMenuItemActiveColor(0.82f, 0.82f, 0.82f, 1.0f); constexpr ImVec4 kRunToolbarBackgroundColor(0.1f, 0.1f, 0.1f, 1.0f); std::string BuildRunToolbarIconPath(const char* fileName) { @@ -108,9 +112,14 @@ void MenuBar::RenderChrome() { } Actions::HandleMenuBarShortcuts(*m_context); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.08f, 0.08f, 0.08f, 1.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, kMainMenuFramePadding); + ImGui::PushStyleColor(ImGuiCol_Text, kMainMenuTextColor); + ImGui::PushStyleColor(ImGuiCol_Header, kMainMenuItemActiveColor); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, kMainMenuItemHoveredColor); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, kMainMenuItemActiveColor); Actions::DrawMainMenuBar(*m_context, m_aboutPopup); - ImGui::PopStyleColor(); + ImGui::PopStyleColor(4); + ImGui::PopStyleVar(); RenderRunToolbar(); } diff --git a/editor/src/panels/ProjectPanel.cpp b/editor/src/panels/ProjectPanel.cpp index f41d6191..606d934b 100644 --- a/editor/src/panels/ProjectPanel.cpp +++ b/editor/src/panels/ProjectPanel.cpp @@ -5,11 +5,16 @@ #include "Core/IEditorContext.h" #include "Core/IProjectManager.h" #include "Core/AssetItem.h" +#include "Platform/Win32Utf8.h" +#include "Utils/ProjectFileUtils.h" #include "UI/UI.h" #include #include +#include #include +#include +#include namespace XCEngine { namespace Editor { @@ -86,6 +91,52 @@ UI::AssetTileOptions MakeProjectAssetTileOptions() { return options; } +std::string BuildProjectRelativeAssetPath(const std::string& projectPath, const std::string& fullPath) { + if (projectPath.empty() || fullPath.empty()) { + return {}; + } + + return ProjectFileUtils::MakeProjectRelativePath(projectPath, fullPath); +} + +bool ShowPathInExplorer(const std::string& fullPath, bool selectTarget) { + if (fullPath.empty()) { + return false; + } + + namespace fs = std::filesystem; + + std::error_code ec; + const fs::path targetPath = fs::path(Platform::Utf8ToWide(fullPath)).lexically_normal(); + if (targetPath.empty() || !fs::exists(targetPath, ec)) { + return false; + } + + HINSTANCE result = nullptr; + if (selectTarget) { + const std::wstring parameters = L"/select,\"" + targetPath.native() + L"\""; + const std::wstring workingDirectory = targetPath.parent_path().native(); + result = ShellExecuteW( + nullptr, + L"open", + L"explorer.exe", + parameters.c_str(), + workingDirectory.empty() ? nullptr : workingDirectory.c_str(), + SW_SHOWNORMAL); + } else { + const std::wstring workingDirectory = targetPath.parent_path().native(); + result = ShellExecuteW( + nullptr, + L"open", + targetPath.c_str(), + nullptr, + workingDirectory.empty() ? nullptr : workingDirectory.c_str(), + SW_SHOWNORMAL); + } + + return reinterpret_cast(result) > 32; +} + } // namespace ProjectPanel::ProjectPanel() : Panel("Project") { @@ -186,6 +237,93 @@ void ProjectPanel::CancelRename() { m_renameState.Cancel(); } +ProjectPanel::ContextMenuTarget ProjectPanel::BuildContextMenuTarget( + IProjectManager& manager, + const AssetItemPtr& item) const { + ContextMenuTarget target; + target.item = item; + if (item) { + target.subjectPath = item->fullPath; + target.createFolderPath = item->isFolder ? item->fullPath : std::string(); + target.showInExplorerSelect = true; + return target; + } + + if (const AssetItemPtr currentFolder = manager.GetCurrentFolder()) { + target.subjectPath = currentFolder->fullPath; + target.createFolderPath = currentFolder->fullPath; + } + + return target; +} + +void ProjectPanel::DrawProjectContextMenu(IProjectManager& manager, const ContextMenuTarget& target) { + auto* managerPtr = &manager; + const bool canCreate = !target.createFolderPath.empty(); + const bool canShowInExplorer = !target.subjectPath.empty(); + const bool canOpen = target.item != nullptr && Commands::CanOpenAsset(target.item); + const bool canDelete = target.item != nullptr; + const bool canRename = target.item != nullptr; + const std::string copyPath = BuildProjectRelativeAssetPath( + m_context ? m_context->GetProjectPath() : std::string(), + target.subjectPath); + const bool canCopyPath = !copyPath.empty(); + + const auto queueCreateAsset = [this, managerPtr, target](auto createFn) { + QueueDeferredAction(m_deferredContextAction, [this, managerPtr, target, createFn]() { + if (!target.createFolderPath.empty() && target.item && target.item->isFolder) { + managerPtr->NavigateToFolder(target.item); + } + + if (AssetItemPtr createdItem = createFn(*managerPtr)) { + BeginRename(createdItem); + } + }); + }; + + UI::DrawContextSubmenu("Create", [&]() { + Actions::DrawMenuAction(Actions::MakeAction("Folder", nullptr, false, canCreate), [&]() { + queueCreateAsset([](IProjectManager& createManager) { + return Commands::CreateFolder(createManager, "New Folder"); + }); + }); + + Actions::DrawMenuAction(Actions::MakeAction("Material", nullptr, false, canCreate), [&]() { + queueCreateAsset([](IProjectManager& createManager) { + return Commands::CreateMaterial(createManager, "New Material"); + }); + }); + }, canCreate); + + Actions::DrawMenuAction(Actions::MakeAction("Show in Explore", nullptr, false, canShowInExplorer), [&]() { + QueueDeferredAction(m_deferredContextAction, [target]() { + ShowPathInExplorer(target.subjectPath, target.showInExplorerSelect); + }); + }); + + Actions::DrawMenuAction(Actions::MakeOpenAssetAction(canOpen), [&]() { + QueueDeferredAction(m_deferredContextAction, [this, target]() { + Actions::OpenProjectAsset(*m_context, target.item); + }); + }); + + Actions::DrawMenuAction(Actions::MakeDeleteAssetAction(canDelete), [&]() { + QueueDeferredAction(m_deferredContextAction, [this, target]() { + Commands::DeleteAsset(m_context->GetProjectManager(), target.item); + }); + }); + + Actions::DrawMenuAction(Actions::MakeAction("Rename", nullptr, false, canRename), [&]() { + QueueDeferredAction(m_deferredContextAction, [this, target]() { + BeginRename(target.item); + }); + }); + + Actions::DrawMenuAction(Actions::MakeAction("Copy Path", nullptr, false, canCopyPath), [copyPath]() { + ImGui::SetClipboardText(copyPath.c_str()); + }); +} + void ProjectPanel::Render() { UI::PanelWindowScope panel(m_name.c_str()); if (!panel.IsOpen()) { @@ -265,7 +403,6 @@ void ProjectPanel::RenderToolbar() { } void ProjectPanel::RenderFolderTreePane(IProjectManager& manager) { - auto* managerPtr = &manager; ImGui::PushStyleColor(ImGuiCol_ChildBg, UI::ProjectNavigationPaneBackgroundColor()); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, UI::ProjectNavigationPanePadding()); const bool open = ImGui::BeginChild("ProjectFolderTree", ImVec2(m_navigationWidth, 0.0f), false); @@ -287,13 +424,7 @@ void ProjectPanel::RenderFolderTreePane(IProjectManager& manager) { } if (UI::BeginContextMenuForWindow("##ProjectFolderTreeContext")) { - Actions::DrawMenuAction(Actions::MakeCreateFolderAction(), [&]() { - QueueDeferredAction(m_deferredContextAction, [this, managerPtr]() { - if (AssetItemPtr createdFolder = Commands::CreateFolder(*managerPtr, "New Folder")) { - BeginRename(createdFolder); - } - }); - }); + DrawProjectContextMenu(manager, BuildContextMenuTarget(manager, nullptr)); UI::EndContextMenu(); } @@ -351,7 +482,6 @@ void ProjectPanel::RenderFolderTreeNode( } void ProjectPanel::RenderBrowserPane(IProjectManager& manager) { - auto* managerPtr = &manager; ImGui::PushStyleColor(ImGuiCol_ChildBg, UI::ProjectBrowserPaneBackgroundColor()); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); const bool open = ImGui::BeginChild("ProjectBrowser", ImVec2(0.0f, 0.0f), false); @@ -393,7 +523,6 @@ void ProjectPanel::RenderBrowserPane(IProjectManager& manager) { } const float tileWidth = UI::AssetTileSize().x; - const float tileHeight = UI::AssetTileSize().y; const float spacing = UI::AssetGridSpacing().x; const float rowSpacing = UI::AssetGridSpacing().y; const float panelWidth = ImGui::GetContentRegionAvail().x; @@ -402,19 +531,41 @@ void ProjectPanel::RenderBrowserPane(IProjectManager& manager) { columns = 1; } + const int rowCount = visibleItems.empty() ? 0 : (static_cast(visibleItems.size()) + columns - 1) / columns; + std::vector rowHeights(static_cast(rowCount), UI::AssetTileSize().y); + AssetItemPtr pendingSelection; AssetItemPtr pendingOpenTarget; const std::string selectedItemPath = manager.GetSelectedItemPath(); const ImVec2 gridOrigin = ImGui::GetCursorPos(); + for (int visibleIndex = 0; visibleIndex < static_cast(visibleItems.size()); ++visibleIndex) { + const AssetItemPtr& item = visibleItems[visibleIndex]; + const bool isRenaming = item && m_renameState.IsEditing(item->fullPath); + UI::AssetTileOptions tileOptions = MakeProjectAssetTileOptions(); + tileOptions.drawLabel = !isRenaming; + const ImVec2 tileSize = UI::ComputeAssetTileSize(GetProjectAssetDisplayName(item).c_str(), tileOptions); + const int row = visibleIndex / columns; + rowHeights[static_cast(row)] = (std::max)(rowHeights[static_cast(row)], tileSize.y); + } + + std::vector rowOffsets(static_cast(rowCount), gridOrigin.y); + float nextRowY = gridOrigin.y; + for (int row = 0; row < rowCount; ++row) { + rowOffsets[static_cast(row)] = nextRowY; + nextRowY += rowHeights[static_cast(row)] + rowSpacing; + } + + int renderedItemCount = 0; for (int visibleIndex = 0; visibleIndex < static_cast(visibleItems.size()); ++visibleIndex) { const int column = visibleIndex % columns; const int row = visibleIndex / columns; ImGui::SetCursorPos(ImVec2( gridOrigin.x + column * (tileWidth + spacing), - gridOrigin.y + row * (tileHeight + rowSpacing))); + rowOffsets[static_cast(row)])); const AssetItemPtr& item = visibleItems[visibleIndex]; const AssetItemInteraction interaction = RenderAssetItem(item, selectedItemPath == item->fullPath); + ++renderedItemCount; if (interaction.clicked) { pendingSelection = item; } @@ -427,9 +578,14 @@ void ProjectPanel::RenderBrowserPane(IProjectManager& manager) { } } - if (!visibleItems.empty()) { - const int rowCount = (static_cast(visibleItems.size()) + columns - 1) / columns; - ImGui::SetCursorPosY(gridOrigin.y + rowCount * tileHeight + (rowCount - 1) * rowSpacing); + if (renderedItemCount > 0) { + const int renderedRowCount = (renderedItemCount + columns - 1) / columns; + float contentBottom = gridOrigin.y; + for (int row = 0; row < renderedRowCount; ++row) { + contentBottom = rowOffsets[static_cast(row)] + rowHeights[static_cast(row)]; + } + ImGui::SetCursorPos(ImVec2(gridOrigin.x, contentBottom)); + ImGui::Dummy(ImVec2(0.0f, 0.0f)); } if (visibleItems.empty() && !searchQuery.Empty()) { @@ -449,21 +605,7 @@ void ProjectPanel::RenderBrowserPane(IProjectManager& manager) { } if (UI::BeginContextMenuForWindow("##ProjectBrowserContext")) { - Actions::DrawMenuAction(Actions::MakeCreateFolderAction(), [&]() { - QueueDeferredAction(m_deferredContextAction, [this, managerPtr]() { - if (AssetItemPtr createdFolder = Commands::CreateFolder(*managerPtr, "New Folder")) { - BeginRename(createdFolder); - } - }); - }); - if (manager.CanNavigateBack()) { - Actions::DrawMenuSeparator(); - Actions::DrawMenuAction(Actions::MakeNavigateBackAction(true), [&]() { - QueueDeferredAction(m_deferredContextAction, [managerPtr]() { - managerPtr->NavigateBack(); - }); - }); - } + DrawProjectContextMenu(manager, BuildContextMenuTarget(manager, nullptr)); UI::EndContextMenu(); } @@ -570,21 +712,7 @@ ProjectPanel::AssetItemInteraction ProjectPanel::RenderAssetItem(const AssetItem Actions::BeginProjectAssetDrag(item, iconKind); if (UI::BeginContextMenuForLastItem("##ProjectItemContext")) { - Actions::DrawMenuAction(Actions::MakeOpenAssetAction(Commands::CanOpenAsset(item)), [&]() { - QueueDeferredAction(m_deferredContextAction, [this, item]() { - Actions::OpenProjectAsset(*m_context, item); - }); - }); - Actions::DrawMenuAction(Actions::MakeAction("Rename", nullptr, false, item != nullptr), [&]() { - QueueDeferredAction(m_deferredContextAction, [this, item]() { - BeginRename(item); - }); - }); - Actions::DrawMenuAction(Actions::MakeDeleteAssetAction(item != nullptr), [&]() { - QueueDeferredAction(m_deferredContextAction, [this, item]() { - Commands::DeleteAsset(m_context->GetProjectManager(), item); - }); - }); + DrawProjectContextMenu(m_context->GetProjectManager(), BuildContextMenuTarget(m_context->GetProjectManager(), item)); UI::EndContextMenu(); } diff --git a/editor/src/panels/ProjectPanel.h b/editor/src/panels/ProjectPanel.h index c4e78a96..5a934504 100644 --- a/editor/src/panels/ProjectPanel.h +++ b/editor/src/panels/ProjectPanel.h @@ -41,12 +41,21 @@ private: bool openRequested = false; }; + struct ContextMenuTarget { + AssetItemPtr item; + std::string subjectPath; + std::string createFolderPath; + bool showInExplorerSelect = false; + }; + void BeginAssetDragDropFrame(); void RegisterFolderDropTarget(IProjectManager& manager, const AssetItemPtr& folder); void FinalizeAssetDragDrop(IProjectManager& manager); void BeginRename(const AssetItemPtr& item); bool CommitRename(IProjectManager& manager); void CancelRename(); + ContextMenuTarget BuildContextMenuTarget(IProjectManager& manager, const AssetItemPtr& item) const; + void DrawProjectContextMenu(IProjectManager& manager, const ContextMenuTarget& target); void RenderToolbar(); void RenderFolderTreePane(IProjectManager& manager); void RenderFolderTreeNode(IProjectManager& manager, const AssetItemPtr& folder, const std::string& currentFolderPath); diff --git a/editor/src/panels/SceneViewPanel.cpp b/editor/src/panels/SceneViewPanel.cpp index dae0b540..5de56cd8 100644 --- a/editor/src/panels/SceneViewPanel.cpp +++ b/editor/src/panels/SceneViewPanel.cpp @@ -3,8 +3,13 @@ #include "Core/ISceneManager.h" #include "Core/ISelectionManager.h" #include "SceneViewPanel.h" +#include "Viewport/SceneViewportEditorOverlayData.h" +#include "Viewport/SceneViewportOverlayHandleBuilder.h" +#include "Viewport/SceneViewportOverlayHitTester.h" +#include "Viewport/SceneViewportMath.h" #include "Viewport/SceneViewportOrientationGizmo.h" #include "Viewport/SceneViewportOverlayRenderer.h" +#include "Viewport/SceneViewportTransformGizmoFrameBuilder.h" #include "ViewportPanelContent.h" #include "Platform/Win32Utf8.h" #include "UI/UI.h" @@ -13,9 +18,11 @@ #include +#include #include #include #include +#include namespace XCEngine { namespace Editor { @@ -28,13 +35,209 @@ struct SceneViewportToolOverlayResult { SceneViewportToolMode clickedTool = SceneViewportToolMode::Move; }; -enum class SceneViewportActiveGizmoKind : uint8_t { +enum class SceneViewportInteractionKind : uint8_t { None = 0, - Move, - Rotate, - Scale + MoveGizmo, + RotateGizmo, + ScaleGizmo, + OrientationGizmo, + SceneIcon }; +struct SceneViewportInteractionCandidate { + SceneViewportInteractionKind kind = SceneViewportInteractionKind::None; + int priority = 0; + int secondaryPriority = 0; + float distanceSq = Math::FLOAT_MAX; + float depth = Math::FLOAT_MAX; + uint64_t entityId = 0; + SceneViewportGizmoAxis moveAxis = SceneViewportGizmoAxis::None; + SceneViewportGizmoPlane movePlane = SceneViewportGizmoPlane::None; + SceneViewportRotateGizmoAxis rotateAxis = SceneViewportRotateGizmoAxis::None; + SceneViewportScaleGizmoHandle scaleHandle = SceneViewportScaleGizmoHandle::None; + SceneViewportOrientationAxis orientationAxis = SceneViewportOrientationAxis::None; + + bool HasHit() const { + return kind != SceneViewportInteractionKind::None; + } +}; + +const char* GetSceneViewportPivotModeLabel(SceneViewportPivotMode mode) { + return mode == SceneViewportPivotMode::Pivot ? "Pivot" : "Center"; +} + +const char* GetSceneViewportTransformSpaceModeLabel(SceneViewportTransformSpaceMode mode) { + return mode == SceneViewportTransformSpaceMode::Global ? "Global" : "Local"; +} + +SceneViewportActiveGizmoKind ToActiveGizmoKind(SceneViewportInteractionKind kind) { + switch (kind) { + case SceneViewportInteractionKind::MoveGizmo: + return SceneViewportActiveGizmoKind::Move; + case SceneViewportInteractionKind::RotateGizmo: + return SceneViewportActiveGizmoKind::Rotate; + case SceneViewportInteractionKind::ScaleGizmo: + return SceneViewportActiveGizmoKind::Scale; + case SceneViewportInteractionKind::OrientationGizmo: + case SceneViewportInteractionKind::SceneIcon: + case SceneViewportInteractionKind::None: + default: + return SceneViewportActiveGizmoKind::None; + } +} + +bool IsBetterSceneViewportInteractionCandidate( + const SceneViewportInteractionCandidate& candidate, + const SceneViewportInteractionCandidate& current) { + constexpr float kMetricEpsilon = 0.001f; + + if (!candidate.HasHit()) { + return false; + } + + if (!current.HasHit()) { + return true; + } + + if (candidate.priority != current.priority) { + return candidate.priority > current.priority; + } + + if (candidate.distanceSq + kMetricEpsilon < current.distanceSq) { + return true; + } + if (current.distanceSq + kMetricEpsilon < candidate.distanceSq) { + return false; + } + + if (candidate.depth + kMetricEpsilon < current.depth) { + return true; + } + if (current.depth + kMetricEpsilon < candidate.depth) { + return false; + } + + return candidate.secondaryPriority > current.secondaryPriority; +} + +void AccumulateSceneViewportInteractionCandidate( + const SceneViewportInteractionCandidate& candidate, + SceneViewportInteractionCandidate& bestCandidate) { + if (IsBetterSceneViewportInteractionCandidate(candidate, bestCandidate)) { + bestCandidate = candidate; + } +} + +SceneViewportInteractionCandidate BuildOrientationGizmoInteractionCandidate( + SceneViewportOrientationAxis axis) { + SceneViewportInteractionCandidate candidate = {}; + if (axis == SceneViewportOrientationAxis::None) { + return candidate; + } + + candidate.kind = SceneViewportInteractionKind::OrientationGizmo; + candidate.priority = 200; + candidate.distanceSq = 0.0f; + candidate.depth = 0.0f; + candidate.orientationAxis = axis; + return candidate; +} + +SceneViewportInteractionCandidate BuildOverlayHandleInteractionCandidate( + const SceneViewportOverlayHandleHitResult& hitResult) { + SceneViewportInteractionCandidate candidate = {}; + if (!hitResult.HasHit()) { + return candidate; + } + + candidate.priority = hitResult.priority; + candidate.distanceSq = hitResult.distanceSq; + candidate.depth = hitResult.depth; + candidate.entityId = hitResult.entityId; + switch (hitResult.kind) { + case SceneViewportOverlayHandleKind::SceneIcon: + candidate.kind = SceneViewportInteractionKind::SceneIcon; + return candidate; + case SceneViewportOverlayHandleKind::MoveAxis: + candidate.kind = SceneViewportInteractionKind::MoveGizmo; + candidate.moveAxis = static_cast(hitResult.handleId); + return candidate; + case SceneViewportOverlayHandleKind::MovePlane: + candidate.kind = SceneViewportInteractionKind::MoveGizmo; + candidate.movePlane = static_cast(hitResult.handleId); + return candidate; + case SceneViewportOverlayHandleKind::RotateAxis: + candidate.kind = SceneViewportInteractionKind::RotateGizmo; + candidate.rotateAxis = static_cast(hitResult.handleId); + return candidate; + case SceneViewportOverlayHandleKind::ScaleAxis: + case SceneViewportOverlayHandleKind::ScaleUniform: + candidate.kind = SceneViewportInteractionKind::ScaleGizmo; + candidate.scaleHandle = static_cast(hitResult.handleId); + return candidate; + case SceneViewportOverlayHandleKind::None: + default: + return SceneViewportInteractionCandidate{}; + } + + return candidate; +} + +float GetSceneToolbarToggleWidth(const char* firstLabel, const char* secondLabel) { + constexpr float kHorizontalPadding = 10.0f; + constexpr float kMinWidth = 68.0f; + const float maxLabelWidth = (std::max)( + ImGui::CalcTextSize(firstLabel).x, + ImGui::CalcTextSize(secondLabel).x); + return (std::max)(kMinWidth, maxLabelWidth + kHorizontalPadding * 2.0f); +} + +void RenderSceneViewportTopBar( + SceneViewportPivotMode& pivotMode, + SceneViewportTransformSpaceMode& transformSpaceMode) { + constexpr float kSceneToolbarHeight = 24.0f; + constexpr float kSceneToolbarPaddingY = 0.0f; + constexpr float kSceneToolbarButtonHeight = kSceneToolbarHeight - kSceneToolbarPaddingY * 2.0f; + constexpr ImVec2 kSceneToolbarButtonFramePadding(8.0f, 1.0f); + + UI::PanelToolbarScope toolbar( + "SceneToolbar", + kSceneToolbarHeight, + ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse, + true, + ImVec2(UI::ToolbarPadding().x, kSceneToolbarPaddingY), + ImVec2(0.0f, UI::ToolbarItemSpacing().y), + ImVec4(0.23f, 0.23f, 0.23f, 1.0f)); + if (!toolbar.IsOpen()) { + return; + } + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, kSceneToolbarButtonFramePadding); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 0.0f); + + if (UI::ToolbarButton( + GetSceneViewportPivotModeLabel(pivotMode), + true, + ImVec2(GetSceneToolbarToggleWidth("Pivot", "Center"), kSceneToolbarButtonHeight))) { + pivotMode = pivotMode == SceneViewportPivotMode::Pivot + ? SceneViewportPivotMode::Center + : SceneViewportPivotMode::Pivot; + } + + ImGui::SameLine(0.0f, 0.0f); + + if (UI::ToolbarButton( + GetSceneViewportTransformSpaceModeLabel(transformSpaceMode), + true, + ImVec2(GetSceneToolbarToggleWidth("Global", "Local"), kSceneToolbarButtonHeight))) { + transformSpaceMode = transformSpaceMode == SceneViewportTransformSpaceMode::Global + ? SceneViewportTransformSpaceMode::Local + : SceneViewportTransformSpaceMode::Global; + } + + ImGui::PopStyleVar(2); +} + const char* GetSceneViewportToolTooltip(SceneViewportToolMode toolMode) { switch (toolMode) { case SceneViewportToolMode::ViewMove: @@ -69,6 +272,19 @@ const char* GetSceneViewportToolIconBaseName(SceneViewportToolMode toolMode) { } } +std::string BuildSceneViewportIconPath(const char* iconBaseName, bool active = false) { + const std::filesystem::path exeDir( + XCEngine::Editor::Platform::Utf8ToWide(XCEngine::Editor::Platform::GetExecutableDirectoryUtf8())); + std::filesystem::path iconPath = + exeDir / L".." / L".." / L"resources" / L"Icons" / + std::filesystem::path(XCEngine::Editor::Platform::Utf8ToWide(iconBaseName)); + if (active) { + iconPath += L"_on"; + } + iconPath += L".png"; + return XCEngine::Editor::Platform::WideToUtf8(iconPath.lexically_normal().wstring()); +} + const std::string& GetSceneViewportToolIconPath(SceneViewportToolMode toolMode, bool active) { static std::string cachedPaths[5][2] = {}; const size_t toolIndex = static_cast(toolMode); @@ -78,16 +294,7 @@ const std::string& GetSceneViewportToolIconPath(SceneViewportToolMode toolMode, return cachedPath; } - const std::filesystem::path exeDir( - XCEngine::Editor::Platform::Utf8ToWide(XCEngine::Editor::Platform::GetExecutableDirectoryUtf8())); - std::filesystem::path iconPath = - (exeDir / L".." / L".." / L"resources" / L"Icons" / - std::filesystem::path(XCEngine::Editor::Platform::Utf8ToWide(GetSceneViewportToolIconBaseName(toolMode)))); - if (active) { - iconPath += L"_on"; - } - iconPath += L".png"; - cachedPath = XCEngine::Editor::Platform::WideToUtf8(iconPath.lexically_normal().wstring()); + cachedPath = BuildSceneViewportIconPath(GetSceneViewportToolIconBaseName(toolMode), active); return cachedPath; } @@ -205,72 +412,6 @@ bool ShouldBeginSceneViewportNavigationDrag( ImGui::IsMouseClicked(button); } -SceneViewportMoveGizmoContext BuildMoveGizmoContext( - IEditorContext& context, - const SceneViewportOverlayData& overlay, - const ViewportPanelContentResult& content, - const ImVec2& mousePosition) { - SceneViewportMoveGizmoContext gizmoContext = {}; - gizmoContext.overlay = overlay; - gizmoContext.viewportSize = Math::Vector2(content.availableSize.x, content.availableSize.y); - gizmoContext.mousePosition = Math::Vector2( - mousePosition.x - content.itemMin.x, - mousePosition.y - content.itemMin.y); - - if (context.GetSelectionManager().GetSelectionCount() == 1) { - const uint64_t selectedEntity = context.GetSelectionManager().GetSelectedEntity(); - if (selectedEntity != 0) { - gizmoContext.selectedObject = context.GetSceneManager().GetEntity(selectedEntity); - } - } - - return gizmoContext; -} - -SceneViewportRotateGizmoContext BuildRotateGizmoContext( - IEditorContext& context, - const SceneViewportOverlayData& overlay, - const ViewportPanelContentResult& content, - const ImVec2& mousePosition) { - SceneViewportRotateGizmoContext gizmoContext = {}; - gizmoContext.overlay = overlay; - gizmoContext.viewportSize = Math::Vector2(content.availableSize.x, content.availableSize.y); - gizmoContext.mousePosition = Math::Vector2( - mousePosition.x - content.itemMin.x, - mousePosition.y - content.itemMin.y); - - if (context.GetSelectionManager().GetSelectionCount() == 1) { - const uint64_t selectedEntity = context.GetSelectionManager().GetSelectedEntity(); - if (selectedEntity != 0) { - gizmoContext.selectedObject = context.GetSceneManager().GetEntity(selectedEntity); - } - } - - return gizmoContext; -} - -SceneViewportScaleGizmoContext BuildScaleGizmoContext( - IEditorContext& context, - const SceneViewportOverlayData& overlay, - const ViewportPanelContentResult& content, - const ImVec2& mousePosition) { - SceneViewportScaleGizmoContext gizmoContext = {}; - gizmoContext.overlay = overlay; - gizmoContext.viewportSize = Math::Vector2(content.availableSize.x, content.availableSize.y); - gizmoContext.mousePosition = Math::Vector2( - mousePosition.x - content.itemMin.x, - mousePosition.y - content.itemMin.y); - - if (context.GetSelectionManager().GetSelectionCount() == 1) { - const uint64_t selectedEntity = context.GetSelectionManager().GetSelectedEntity(); - if (selectedEntity != 0) { - gizmoContext.selectedObject = context.GetSceneManager().GetEntity(selectedEntity); - } - } - - return gizmoContext; -} - } // namespace SceneViewPanel::SceneViewPanel() : Panel("Scene") {} @@ -283,6 +424,7 @@ void SceneViewPanel::Render() { return; } + RenderSceneViewportTopBar(m_pivotMode, m_transformSpaceMode); const ViewportPanelContentResult content = RenderViewportPanelContent(*m_context, EditorViewportKind::Scene); if (IViewportHostService* viewportHostService = m_context->GetViewportHostService()) { const ImGuiIO& io = ImGui::GetIO(); @@ -304,8 +446,20 @@ void SceneViewPanel::Render() { m_toolMode = toolOverlay.clickedTool; } - if (content.focused && !io.WantTextInput && !m_lookDragging && !m_panDragging) { - if (ImGui::IsKeyPressed(ImGuiKey_W, false)) { + const bool allowToolShortcut = !io.WantTextInput && !m_lookDragging && !m_panDragging; + if (allowToolShortcut) { + if (ImGui::IsKeyPressed(ImGuiKey_Q, false)) { + if (m_moveGizmo.IsActive()) { + m_moveGizmo.CancelDrag(&m_context->GetUndoManager()); + } + if (m_rotateGizmo.IsActive()) { + m_rotateGizmo.CancelDrag(&m_context->GetUndoManager()); + } + if (m_scaleGizmo.IsActive()) { + m_scaleGizmo.CancelDrag(&m_context->GetUndoManager()); + } + m_toolMode = SceneViewportToolMode::ViewMove; + } else if (ImGui::IsKeyPressed(ImGuiKey_W, false)) { if (m_rotateGizmo.IsActive()) { m_rotateGizmo.CancelDrag(&m_context->GetUndoManager()); } @@ -337,103 +491,68 @@ void SceneViewPanel::Render() { const bool showingMoveGizmo = m_toolMode == SceneViewportToolMode::Move || usingTransformTool; const bool showingRotateGizmo = m_toolMode == SceneViewportToolMode::Rotate || usingTransformTool; const bool showingScaleGizmo = m_toolMode == SceneViewportToolMode::Scale || usingTransformTool; + const bool useCenterPivot = m_pivotMode == SceneViewportPivotMode::Center; + const bool localSpace = m_transformSpaceMode == SceneViewportTransformSpaceMode::Local; + const Math::Vector2 viewportSize(content.availableSize.x, content.availableSize.y); + const Math::Vector2 localMousePosition( + io.MousePos.x - content.itemMin.x, + io.MousePos.y - content.itemMin.y); SceneViewportOverlayData overlay = {}; - SceneViewportMoveGizmoContext moveGizmoContext = {}; - SceneViewportRotateGizmoContext rotateGizmoContext = {}; - SceneViewportScaleGizmoContext scaleGizmoContext = {}; + SceneViewportTransformGizmoFrameState gizmoFrameState = {}; + SceneViewportOverlayFrameData emptySceneOverlayFrameData = {}; SceneViewportActiveGizmoKind activeGizmoKind = SceneViewportActiveGizmoKind::None; if (hasInteractiveViewport) { overlay = viewportHostService->GetSceneViewOverlayData(); - if (showingMoveGizmo) { - moveGizmoContext = BuildMoveGizmoContext(*m_context, overlay, content, io.MousePos); - if (m_moveGizmo.IsActive() && - (moveGizmoContext.selectedObject == nullptr || - m_context->GetSelectionManager().GetSelectedEntity() != m_moveGizmo.GetActiveEntityId())) { - m_moveGizmo.CancelDrag(&m_context->GetUndoManager()); - } - } else if (m_moveGizmo.IsActive()) { - m_moveGizmo.CancelDrag(&m_context->GetUndoManager()); - } - - if (showingRotateGizmo) { - rotateGizmoContext = BuildRotateGizmoContext(*m_context, overlay, content, io.MousePos); - if (m_rotateGizmo.IsActive() && - (rotateGizmoContext.selectedObject == nullptr || - m_context->GetSelectionManager().GetSelectedEntity() != m_rotateGizmo.GetActiveEntityId())) { - m_rotateGizmo.CancelDrag(&m_context->GetUndoManager()); - } - } else if (m_rotateGizmo.IsActive()) { - m_rotateGizmo.CancelDrag(&m_context->GetUndoManager()); - } - - if (showingScaleGizmo) { - scaleGizmoContext = BuildScaleGizmoContext(*m_context, overlay, content, io.MousePos); - scaleGizmoContext.uniformOnly = usingTransformTool; - if (m_scaleGizmo.IsActive() && - (scaleGizmoContext.selectedObject == nullptr || - m_context->GetSelectionManager().GetSelectedEntity() != m_scaleGizmo.GetActiveEntityId())) { - m_scaleGizmo.CancelDrag(&m_context->GetUndoManager()); - } - } else if (m_scaleGizmo.IsActive()) { - m_scaleGizmo.CancelDrag(&m_context->GetUndoManager()); - } - - if (m_moveGizmo.IsActive()) { - activeGizmoKind = SceneViewportActiveGizmoKind::Move; - } else if (m_rotateGizmo.IsActive()) { - activeGizmoKind = SceneViewportActiveGizmoKind::Rotate; - } else if (m_scaleGizmo.IsActive()) { - activeGizmoKind = SceneViewportActiveGizmoKind::Scale; - } - - if (showingMoveGizmo) { - SceneViewportMoveGizmoContext updateContext = moveGizmoContext; - if (activeGizmoKind != SceneViewportActiveGizmoKind::None && - activeGizmoKind != SceneViewportActiveGizmoKind::Move) { - updateContext.mousePosition = Math::Vector2(-1.0f, -1.0f); - } - m_moveGizmo.Update(updateContext); - } - if (showingRotateGizmo) { - SceneViewportRotateGizmoContext updateContext = rotateGizmoContext; - if (activeGizmoKind != SceneViewportActiveGizmoKind::None && - activeGizmoKind != SceneViewportActiveGizmoKind::Rotate) { - updateContext.mousePosition = Math::Vector2(-1.0f, -1.0f); - } - m_rotateGizmo.Update(updateContext); - } - if (showingScaleGizmo) { - SceneViewportScaleGizmoContext updateContext = scaleGizmoContext; - if (activeGizmoKind != SceneViewportActiveGizmoKind::None && - activeGizmoKind != SceneViewportActiveGizmoKind::Scale) { - updateContext.mousePosition = Math::Vector2(-1.0f, -1.0f); - } - m_scaleGizmo.Update(updateContext); - } + gizmoFrameState = RefreshSceneViewportTransformGizmos( + *m_context, + overlay, + viewportSize, + localMousePosition, + useCenterPivot, + localSpace, + usingTransformTool, + showingMoveGizmo, + m_moveGizmo, + showingRotateGizmo, + m_rotateGizmo, + showingScaleGizmo, + m_scaleGizmo); + activeGizmoKind = gizmoFrameState.activeGizmoKind; } else { - if (m_moveGizmo.IsActive()) { - m_moveGizmo.CancelDrag(&m_context->GetUndoManager()); - } - if (m_rotateGizmo.IsActive()) { - m_rotateGizmo.CancelDrag(&m_context->GetUndoManager()); - } - if (m_scaleGizmo.IsActive()) { - m_scaleGizmo.CancelDrag(&m_context->GetUndoManager()); - } + CancelSceneViewportTransformGizmoDrags(*m_context, m_moveGizmo, m_rotateGizmo, m_scaleGizmo); } - const bool moveGizmoHovering = showingMoveGizmo && m_moveGizmo.IsHoveringHandle(); - const bool rotateGizmoHovering = showingRotateGizmo && m_rotateGizmo.IsHoveringHandle(); - const bool scaleGizmoHovering = showingScaleGizmo && m_scaleGizmo.IsHoveringHandle(); + const SceneViewportTransformGizmoHandleBuildInputs interactionGizmoInputs = + hasInteractiveViewport + ? BuildSceneViewportTransformGizmoHandleBuildInputs( + showingMoveGizmo, + m_moveGizmo, + gizmoFrameState.moveContext, + showingRotateGizmo, + m_rotateGizmo, + gizmoFrameState.rotateContext, + showingScaleGizmo, + m_scaleGizmo, + gizmoFrameState.scaleContext) + : SceneViewportTransformGizmoHandleBuildInputs{}; + const SceneViewportOverlayFrameData& interactionOverlayFrameData = + hasInteractiveViewport + ? viewportHostService->GetSceneViewInteractionOverlayFrameData( + *m_context, + overlay, + interactionGizmoInputs) + : emptySceneOverlayFrameData; + const SceneViewportOverlayHandleHitResult overlayHandleHit = + hasInteractiveViewport + ? HitTestSceneViewportOverlayHandles( + interactionOverlayFrameData, + Math::Vector2(content.availableSize.x, content.availableSize.y), + localMousePosition) + : SceneViewportOverlayHandleHitResult{}; const bool moveGizmoActive = showingMoveGizmo && m_moveGizmo.IsActive(); const bool rotateGizmoActive = showingRotateGizmo && m_rotateGizmo.IsActive(); const bool scaleGizmoActive = showingScaleGizmo && m_scaleGizmo.IsActive(); - const SceneViewportActiveGizmoKind hoveredGizmoKind = scaleGizmoHovering - ? SceneViewportActiveGizmoKind::Scale - : (moveGizmoHovering ? SceneViewportActiveGizmoKind::Move - : (rotateGizmoHovering ? SceneViewportActiveGizmoKind::Rotate - : SceneViewportActiveGizmoKind::None)); if (moveGizmoActive) { activeGizmoKind = SceneViewportActiveGizmoKind::Move; } else if (rotateGizmoActive) { @@ -443,44 +562,83 @@ void SceneViewPanel::Render() { } else { activeGizmoKind = SceneViewportActiveGizmoKind::None; } - const bool gizmoHovering = hoveredGizmoKind != SceneViewportActiveGizmoKind::None; const bool gizmoActive = activeGizmoKind != SceneViewportActiveGizmoKind::None; - - const bool beginTransformGizmo = - hasInteractiveViewport && - content.clickedLeft && - !m_lookDragging && - !m_panDragging && - !toolOverlay.hovered && - gizmoHovering; - const SceneViewportOrientationAxis orientationAxisHit = + SceneViewportInteractionCandidate hoveredInteraction = {}; + const bool canResolveViewportInteraction = hasInteractiveViewport && viewportContentHovered && !usingViewMoveTool && !m_lookDragging && !m_panDragging && - !gizmoHovering && - !gizmoActive - ? HitTestSceneViewportOrientationGizmo( - overlay, - content.itemMin, - content.itemMax, - io.MousePos) - : SceneViewportOrientationAxis::None; + !toolOverlay.hovered && + !gizmoActive; + if (canResolveViewportInteraction) { + AccumulateSceneViewportInteractionCandidate( + BuildOverlayHandleInteractionCandidate(overlayHandleHit), + hoveredInteraction); + + AccumulateSceneViewportInteractionCandidate( + BuildOrientationGizmoInteractionCandidate( + HitTestSceneViewportOrientationGizmo( + overlay, + content.itemMin, + content.itemMax, + io.MousePos)), + hoveredInteraction); + } + + if (!gizmoActive) { + if (showingMoveGizmo) { + m_moveGizmo.SetHoveredHandle( + hoveredInteraction.kind == SceneViewportInteractionKind::MoveGizmo + ? hoveredInteraction.moveAxis + : SceneViewportGizmoAxis::None, + hoveredInteraction.kind == SceneViewportInteractionKind::MoveGizmo + ? hoveredInteraction.movePlane + : SceneViewportGizmoPlane::None); + } + if (showingRotateGizmo) { + m_rotateGizmo.SetHoveredHandle( + hoveredInteraction.kind == SceneViewportInteractionKind::RotateGizmo + ? hoveredInteraction.rotateAxis + : SceneViewportRotateGizmoAxis::None); + } + if (showingScaleGizmo) { + m_scaleGizmo.SetHoveredHandle( + hoveredInteraction.kind == SceneViewportInteractionKind::ScaleGizmo + ? hoveredInteraction.scaleHandle + : SceneViewportScaleGizmoHandle::None); + } + } + + const SceneViewportActiveGizmoKind hoveredGizmoKind = + ToActiveGizmoKind(hoveredInteraction.kind); + const bool gizmoHovering = hoveredGizmoKind != SceneViewportActiveGizmoKind::None; + const SceneViewportOrientationAxis orientationAxisHit = + hoveredInteraction.kind == SceneViewportInteractionKind::OrientationGizmo + ? hoveredInteraction.orientationAxis + : SceneViewportOrientationAxis::None; + const uint64_t clickedSceneIconEntity = + hoveredInteraction.kind == SceneViewportInteractionKind::SceneIcon + ? hoveredInteraction.entityId + : 0; + const bool beginTransformGizmo = + hasInteractiveViewport && + content.clickedLeft && + gizmoHovering; const bool orientationGizmoClick = hasInteractiveViewport && content.clickedLeft && orientationAxisHit != SceneViewportOrientationAxis::None; + const bool sceneIconClick = + hasInteractiveViewport && + content.clickedLeft && + clickedSceneIconEntity != 0; const bool selectClick = hasInteractiveViewport && content.clickedLeft && - viewportContentHovered && - !usingViewMoveTool && - !m_lookDragging && - !m_panDragging && - !orientationGizmoClick && - !gizmoHovering && - !gizmoActive; + canResolveViewportInteraction && + !hoveredInteraction.HasHit(); const bool beginLeftPanDrag = usingViewMoveTool ? ShouldBeginSceneViewportNavigationDrag( hasInteractiveViewport, @@ -525,47 +683,32 @@ void SceneViewPanel::Render() { io.MouseDelta.y); } - if (toolOverlay.clicked || beginTransformGizmo || orientationGizmoClick || selectClick || beginLookDrag || + if (toolOverlay.clicked || beginTransformGizmo || orientationGizmoClick || sceneIconClick || selectClick || beginLookDrag || beginPanDrag) { ImGui::SetWindowFocus(); } if (beginTransformGizmo) { if (hoveredGizmoKind == SceneViewportActiveGizmoKind::Scale) { - m_scaleGizmo.TryBeginDrag(scaleGizmoContext, m_context->GetUndoManager()); + m_scaleGizmo.TryBeginDrag(gizmoFrameState.scaleContext, m_context->GetUndoManager()); } else if (hoveredGizmoKind == SceneViewportActiveGizmoKind::Move) { - m_moveGizmo.TryBeginDrag(moveGizmoContext, m_context->GetUndoManager()); + m_moveGizmo.TryBeginDrag(gizmoFrameState.moveContext, m_context->GetUndoManager()); } else if (hoveredGizmoKind == SceneViewportActiveGizmoKind::Rotate) { - m_rotateGizmo.TryBeginDrag(rotateGizmoContext, m_context->GetUndoManager()); + m_rotateGizmo.TryBeginDrag(gizmoFrameState.rotateContext, m_context->GetUndoManager()); } } if (orientationGizmoClick) { viewportHostService->AlignSceneViewToOrientationAxis(orientationAxisHit); - overlay = viewportHostService->GetSceneViewOverlayData(); - if (showingMoveGizmo) { - moveGizmoContext = BuildMoveGizmoContext(*m_context, overlay, content, io.MousePos); - m_moveGizmo.Update(moveGizmoContext); - } - if (showingRotateGizmo) { - rotateGizmoContext = BuildRotateGizmoContext(*m_context, overlay, content, io.MousePos); - m_rotateGizmo.Update(rotateGizmoContext); - } - if (showingScaleGizmo) { - scaleGizmoContext = BuildScaleGizmoContext(*m_context, overlay, content, io.MousePos); - scaleGizmoContext.uniformOnly = usingTransformTool; - m_scaleGizmo.Update(scaleGizmoContext); - } } - if (selectClick) { - const ImVec2 localMousePosition( - io.MousePos.x - content.itemMin.x, - io.MousePos.y - content.itemMin.y); + if (sceneIconClick) { + m_context->GetSelectionManager().SetSelectedEntity(clickedSceneIconEntity); + } else if (selectClick) { const uint64_t selectedEntity = viewportHostService->PickSceneViewEntity( *m_context, content.availableSize, - localMousePosition); + ImVec2(localMousePosition.x, localMousePosition.y)); if (selectedEntity != 0) { m_context->GetSelectionManager().SetSelectedEntity(selectedEntity); } else { @@ -576,11 +719,11 @@ void SceneViewPanel::Render() { if (gizmoActive) { if (ImGui::IsMouseDown(ImGuiMouseButton_Left)) { if (activeGizmoKind == SceneViewportActiveGizmoKind::Move) { - m_moveGizmo.UpdateDrag(moveGizmoContext); + m_moveGizmo.UpdateDrag(gizmoFrameState.moveContext); } else if (activeGizmoKind == SceneViewportActiveGizmoKind::Rotate) { - m_rotateGizmo.UpdateDrag(rotateGizmoContext); + m_rotateGizmo.UpdateDrag(gizmoFrameState.rotateContext); } else if (activeGizmoKind == SceneViewportActiveGizmoKind::Scale) { - m_scaleGizmo.UpdateDrag(scaleGizmoContext); + m_scaleGizmo.UpdateDrag(gizmoFrameState.scaleContext); } } else { if (activeGizmoKind == SceneViewportActiveGizmoKind::Move) { @@ -707,52 +850,41 @@ void SceneViewPanel::Render() { if (content.hasViewportArea && content.frame.hasTexture) { overlay = viewportHostService->GetSceneViewOverlayData(); - SceneViewportActiveGizmoKind drawActiveGizmoKind = SceneViewportActiveGizmoKind::None; - if (m_moveGizmo.IsActive()) { - drawActiveGizmoKind = SceneViewportActiveGizmoKind::Move; - } else if (m_rotateGizmo.IsActive()) { - drawActiveGizmoKind = SceneViewportActiveGizmoKind::Rotate; - } else if (m_scaleGizmo.IsActive()) { - drawActiveGizmoKind = SceneViewportActiveGizmoKind::Scale; - } - if (showingMoveGizmo) { - moveGizmoContext = BuildMoveGizmoContext(*m_context, overlay, content, io.MousePos); - SceneViewportMoveGizmoContext updateContext = moveGizmoContext; - if (drawActiveGizmoKind != SceneViewportActiveGizmoKind::None && - drawActiveGizmoKind != SceneViewportActiveGizmoKind::Move) { - updateContext.mousePosition = Math::Vector2(-1.0f, -1.0f); - } - m_moveGizmo.Update(updateContext); - } - if (showingRotateGizmo) { - rotateGizmoContext = BuildRotateGizmoContext(*m_context, overlay, content, io.MousePos); - SceneViewportRotateGizmoContext updateContext = rotateGizmoContext; - if (drawActiveGizmoKind != SceneViewportActiveGizmoKind::None && - drawActiveGizmoKind != SceneViewportActiveGizmoKind::Rotate) { - updateContext.mousePosition = Math::Vector2(-1.0f, -1.0f); - } - m_rotateGizmo.Update(updateContext); - } - if (showingScaleGizmo) { - scaleGizmoContext = BuildScaleGizmoContext(*m_context, overlay, content, io.MousePos); - scaleGizmoContext.uniformOnly = usingTransformTool; - SceneViewportScaleGizmoContext updateContext = scaleGizmoContext; - if (drawActiveGizmoKind != SceneViewportActiveGizmoKind::None && - drawActiveGizmoKind != SceneViewportActiveGizmoKind::Scale) { - updateContext.mousePosition = Math::Vector2(-1.0f, -1.0f); - } - m_scaleGizmo.Update(updateContext); - } + const SceneViewportTransformGizmoFrameState drawGizmoFrameState = + RefreshSceneViewportTransformGizmos( + *m_context, + overlay, + viewportSize, + localMousePosition, + useCenterPivot, + localSpace, + usingTransformTool, + showingMoveGizmo, + m_moveGizmo, + showingRotateGizmo, + m_rotateGizmo, + showingScaleGizmo, + m_scaleGizmo); + + viewportHostService->SetSceneViewTransientTransformGizmoOverlayData( + overlay, + BuildSceneViewportTransformGizmoHandleBuildInputs( + showingMoveGizmo, + m_moveGizmo, + drawGizmoFrameState.moveContext, + showingRotateGizmo, + m_rotateGizmo, + drawGizmoFrameState.rotateContext, + showingScaleGizmo, + m_scaleGizmo, + drawGizmoFrameState.scaleContext)); DrawSceneViewportOverlay( ImGui::GetWindowDrawList(), overlay, content.itemMin, content.itemMax, - content.availableSize, - showingMoveGizmo ? &m_moveGizmo.GetDrawData() : nullptr, - showingRotateGizmo ? &m_rotateGizmo.GetDrawData() : nullptr, - showingScaleGizmo ? &m_scaleGizmo.GetDrawData() : nullptr); + content.availableSize); } } diff --git a/editor/src/panels/SceneViewPanel.h b/editor/src/panels/SceneViewPanel.h index 51c0eab3..8170aa98 100644 --- a/editor/src/panels/SceneViewPanel.h +++ b/editor/src/panels/SceneViewPanel.h @@ -18,6 +18,16 @@ enum class SceneViewportToolMode : uint8_t { Transform }; +enum class SceneViewportPivotMode : uint8_t { + Pivot = 0, + Center +}; + +enum class SceneViewportTransformSpaceMode : uint8_t { + Global = 0, + Local +}; + class SceneViewPanel : public Panel { public: SceneViewPanel(); @@ -25,6 +35,8 @@ public: private: SceneViewportToolMode m_toolMode = SceneViewportToolMode::Move; + SceneViewportPivotMode m_pivotMode = SceneViewportPivotMode::Pivot; + SceneViewportTransformSpaceMode m_transformSpaceMode = SceneViewportTransformSpaceMode::Global; bool m_lookDragging = false; bool m_panDragging = false; int m_panDragButton = ImGuiMouseButton_Middle; diff --git a/editor/src/panels/ViewportPanelContent.h b/editor/src/panels/ViewportPanelContent.h index 412ad329..f4ea9513 100644 --- a/editor/src/panels/ViewportPanelContent.h +++ b/editor/src/panels/ViewportPanelContent.h @@ -59,6 +59,7 @@ inline void RenderViewportInteractionSurface( ViewportPanelContentResult& result, EditorViewportKind kind, const ImVec2& interactionSize) { + ImGui::SetNextItemAllowOverlap(); ImGui::InvisibleButton( GetViewportInteractionSurfaceId(kind), interactionSize, diff --git a/editor/tab.png b/editor/tab.png deleted file mode 100644 index 1becf22d8fb7be0f4cc83d8745077c2e578a2576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2442 zcmbVOc{r478y{t<6p@4Mp~cojWsfX#W|Xb69AqrV5;B&tHMZh7%vdHwMwlpxL?anv z$|N+lA%xK|I$6eK#+0oF!}p&5zU#ZL@A|&${PDccdq3Cp-0%I~_wV<+Z?v-`^w0r? z10WFSkR8nSDzFa&D{P-A@MMPtZv&eU@+#CC)G(;T1`Od~D+enOh=3K}_7ef@{gE&a zBnTwY`S%i{Mm!Aw&Q$Gety~h|+-V>CYr%V|-y=dK^{fr+AKr5b?2$P%tZm=%^m2)K zNS0`D3&9d?6y$Zi__$Zx?rHL;>DNZf(c&nAeCLXj@REX*tPAZ~y)NA~HH%OmYFSNi8=) zo`^5h6@sh@AAmIbcVng;c3b)QLR~%OLA3l;TlGI>^0O+d@JC!-TwWw^#g&$pW_9~t zCq-vGb8lQ=&f_*Ckm@y~c3xhJ@W%TE1=1;kb@v8u@_WF4G;f7CTK3dfMgWW9(De-? zm;-O$f;xQfe*OA&%DdR!!Ql`-dE;n!c=!}K9_y3B7ipa6Z;M@ujxS0jRH>l9E-mr5 zSBLnY(BwuZJw~k?-H5s)kR23?Jlo}oAy;I6M3BZv=Rngs%tVVKJ~PS|)o-)Z@M zwJeq@1Oyio6Z1Km)Ec`aTkE1t#*VV*)+c;eT;j|^h8+AMiG=IF55DH^P91&({mxI~ z%uw(#rnG5t{A7Ew88lDnFFp$&yt^Y%vPdfNJ=4?GC0t!y9TOWH_4%!kr>7^qEmp@U zf*F87NPsds^960IhBxUKp-{1zlr251%7wl+M?v@@Y9j9qwe)=0;^Lw&3RQ|m?>7wp z)MdtdZ3Fx{n6ho4tgPHM8`ajUl35;vUT@Ifwv z=+`l1SL}8L8t`&bUP0j<@5k(qt)t4yw88Un9QvIh)@(nRGWRY+{NTZZcO7fk%gaH& zzPBqXR1h=mxidW0%6xxd@6#l&hG8lF^FXS@s^ir(42^%@SQ(P(AHQEBb%7D*PWqoboaSnO(_PUE-F9eYtI z)K7K|ev!kO>nqaHl->_<(Zr-Up0ltRl=DfliiiNKCa+0xxm-|lOUp{9q-B6)!~(Ro zt<5x!$E0Pdru0j5?Ep7 zcjw~mzP`SjzG&Mt9PTI(+5@8qQ8n3Y0+Qv(Ox;c1PO((Mo=n{B?d|0#zFS;81zgCK zR4uqvy-#@0$MNw!AL#U+Y;b!|z6R7d>F1gG`FY5B@V&spQWp(yj~g4Yjg%b)%8Vqg z)8qlIn5^?Xp)6YtJi=h~KYb|w>!N=!7lwW1k3R6%3H zd+2m|%I=O?Zf-8f-roMh#00gc2Ns7XGEw40hJ%xnMy zr~<$y(B!U7*POgO14F}>#qLexiAJBAmX_j3%JSz@VTL@kDb#5@X`x zRz@y^{XAqPGSe{_42KIO7H|oWI|PA%$IP5OZ(xu{ojrDV-x)(gQJj<`26|-(9U26}%h)`4&$gPAa%wZn7E}J5L^9dsBGDP0em(XB5a8g|t5=KarDbKpJrz_btsv8~ zBmdsFoSD7jF{Tdc`D*2ka^}6Tg(OU%NBwVvw1NT(u`|KEAw$H&ZRNm=$(zPXdDMz2 zO{D*K4`IzFrC;hFeyDkb)Kbg0tQG!0Ti}|#y0(^9<&!6(2B{%_JMS>h+@7O2Cp#g< z&w{0gH`kZ=bA?VX7+lWe%SdsO9R=Arw4z>0d2d}w`Qyycd^FHRWD55AhTXW)qZp?o0p0L92DGgNbNDywl_zy| zbO7?R-u2V>)e8cT^CBJp*A(E~ffeW;Pv$_26$R^&Qa1mQ`+qz${P%f7 ZAS7VAges13oPhZWWCwAyZLs!D`xkrCuEPKT diff --git a/editor/unity.png b/editor/unity.png deleted file mode 100644 index 32d51c66c8403b4a89902bd5a4568a343968725b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 804969 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≶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%0AO!(S69!8#^sc?`4`tZ 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%0AQGT9(x)L)Dn`!nBCQvjS5{gARu2JFEw_v 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

WvslgI*{@AI&#&bRi;F;F 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
    VDL+I~c`Y_xgSdh27E)%$grolUiNYH5CA# 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 Wb0{3WVoU-4=x7?;!K*)h_kRH*!2#C* diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index f3552228..538672b5 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -246,6 +246,8 @@ add_library(XCEngine STATIC ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Core/Asset/AssetRef.h ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Core/Asset/ArtifactFormats.h ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Core/Asset/AssetDatabase.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Core/Asset/AssetImportService.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Core/Asset/ProjectAssetIndex.h ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Core/Asset/ResourceTypes.h ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Core/Asset/ImportSettings.h ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Core/Asset/ResourceHandle.h @@ -255,6 +257,8 @@ add_library(XCEngine STATIC ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Core/Asset/ResourceDependencyGraph.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Core/Asset/AssetGUID.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Core/Asset/AssetDatabase.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/Core/Asset/AssetImportService.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/Core/Asset/ProjectAssetIndex.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Core/Asset/ResourceManager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Core/Asset/ResourceCache.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Core/Asset/AsyncLoader.cpp diff --git a/engine/include/XCEngine/Components/MeshFilterComponent.h b/engine/include/XCEngine/Components/MeshFilterComponent.h index e883eccf..8f97bdd4 100644 --- a/engine/include/XCEngine/Components/MeshFilterComponent.h +++ b/engine/include/XCEngine/Components/MeshFilterComponent.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -32,12 +33,14 @@ private: struct PendingMeshLoadState; void BeginAsyncMeshLoad(const std::string& meshPath); + void EnsureDeferredAsyncMeshLoadStarted(); void ResolvePendingMesh(); Resources::ResourceHandle m_mesh; std::string m_meshPath; Resources::AssetRef m_meshRef; std::shared_ptr m_pendingMeshLoad; + bool m_asyncMeshLoadRequested = false; }; } // namespace Components diff --git a/engine/include/XCEngine/Components/MeshRendererComponent.h b/engine/include/XCEngine/Components/MeshRendererComponent.h index efc0e2dc..59ad8d37 100644 --- a/engine/include/XCEngine/Components/MeshRendererComponent.h +++ b/engine/include/XCEngine/Components/MeshRendererComponent.h @@ -46,6 +46,7 @@ private: struct PendingMaterialLoadState; void BeginAsyncMaterialLoad(size_t index, const std::string& materialPath); + void EnsureDeferredAsyncMaterialLoadStarted(size_t index); void ResolvePendingMaterials(); void EnsureMaterialSlot(size_t index); static std::string MaterialPathFromHandle(const Resources::ResourceHandle& material); @@ -54,6 +55,7 @@ private: std::vector m_materialPaths; std::vector m_materialRefs; std::vector> m_pendingMaterialLoads; + std::vector m_asyncMaterialLoadRequested; bool m_castShadows = true; bool m_receiveShadows = true; uint32_t m_renderLayer = 0; diff --git a/engine/include/XCEngine/Core/Asset/AssetDatabase.h b/engine/include/XCEngine/Core/Asset/AssetDatabase.h index 1bb6db62..9b756443 100644 --- a/engine/include/XCEngine/Core/Asset/AssetDatabase.h +++ b/engine/include/XCEngine/Core/Asset/AssetDatabase.h @@ -6,12 +6,23 @@ #include #include +#include namespace XCEngine { namespace Resources { +class Mesh; +class Material; + class AssetDatabase { public: + struct ArtifactDependencyRecord { + Containers::String path; + Containers::String hash; + Core::uint64 fileSize = 0; + Core::uint64 writeTime = 0; + }; + struct SourceAssetRecord { AssetGUID guid; Containers::String relativePath; @@ -39,6 +50,7 @@ public: Core::uint64 sourceFileSize = 0; Core::uint64 sourceWriteTime = 0; LocalID mainLocalID = kMainAssetLocalID; + std::vector dependencies; }; struct ResolvedAsset { @@ -66,13 +78,15 @@ public: ResourceType requestedType, ResolvedAsset& outAsset); bool TryGetPrimaryAssetPath(const AssetGUID& guid, Containers::String& outRelativePath) const; + void BuildLookupSnapshot(std::unordered_map& outPathToGuid, + std::unordered_map& outGuidToPath) const; const Containers::String& GetProjectRoot() const { return m_projectRoot; } const Containers::String& GetAssetsRoot() const { return m_assetsRoot; } const Containers::String& GetLibraryRoot() const { return m_libraryRoot; } private: - static constexpr Core::uint32 kCurrentImporterVersion = 2; + static constexpr Core::uint32 kCurrentImporterVersion = 3; void EnsureProjectLayout(); void LoadSourceAssetDB(); @@ -110,12 +124,24 @@ private: bool ImportModelAsset(const SourceAssetRecord& sourceRecord, ArtifactRecord& outRecord); - Containers::String BuildArtifactKey(const SourceAssetRecord& sourceRecord) const; + Containers::String BuildArtifactKey( + const SourceAssetRecord& sourceRecord, + const std::vector& dependencies = {}) const; Containers::String BuildArtifactDirectory(const Containers::String& artifactKey) const; static Containers::String ReadWholeFileText(const std::filesystem::path& path); static Containers::String ComputeFileHash(const std::filesystem::path& path); static Core::uint64 GetFileSizeValue(const std::filesystem::path& path); static Core::uint64 GetFileWriteTimeValue(const std::filesystem::path& path); + Containers::String NormalizeDependencyPath(const std::filesystem::path& path) const; + std::filesystem::path ResolveDependencyPath(const Containers::String& path) const; + bool CaptureDependencyRecord(const std::filesystem::path& path, + ArtifactDependencyRecord& outRecord) const; + bool AreDependenciesCurrent(const std::vector& dependencies) const; + bool CollectModelDependencies(const SourceAssetRecord& sourceRecord, + const Mesh& mesh, + std::vector& outDependencies) const; + bool CollectMaterialDependencies(const Material& material, + std::vector& outDependencies) const; Containers::String m_projectRoot; Containers::String m_assetsRoot; diff --git a/engine/include/XCEngine/Core/Asset/AssetImportService.h b/engine/include/XCEngine/Core/Asset/AssetImportService.h new file mode 100644 index 00000000..c428babe --- /dev/null +++ b/engine/include/XCEngine/Core/Asset/AssetImportService.h @@ -0,0 +1,38 @@ +#pragma once + +#include "AssetDatabase.h" + +#include +#include + +namespace XCEngine { +namespace Resources { + +class AssetImportService { +public: + void Initialize(); + void Shutdown(); + + void SetProjectRoot(const Containers::String& projectRoot); + Containers::String GetProjectRoot() const; + + void Refresh(); + + bool EnsureArtifact(const Containers::String& requestPath, + ResourceType requestedType, + AssetDatabase::ResolvedAsset& outAsset); + bool TryGetAssetRef(const Containers::String& requestPath, + ResourceType resourceType, + AssetRef& outRef) const; + bool TryGetPrimaryAssetPath(const AssetGUID& guid, Containers::String& outRelativePath) const; + void BuildLookupSnapshot(std::unordered_map& outPathToGuid, + std::unordered_map& outGuidToPath) const; + +private: + mutable std::recursive_mutex m_mutex; + Containers::String m_projectRoot; + AssetDatabase m_assetDatabase; +}; + +} // namespace Resources +} // namespace XCEngine diff --git a/engine/include/XCEngine/Core/Asset/ProjectAssetIndex.h b/engine/include/XCEngine/Core/Asset/ProjectAssetIndex.h new file mode 100644 index 00000000..de72bcb3 --- /dev/null +++ b/engine/include/XCEngine/Core/Asset/ProjectAssetIndex.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace XCEngine { +namespace Resources { + +class AssetImportService; + +class ProjectAssetIndex { +public: + void ResetProjectRoot(const Containers::String& projectRoot = Containers::String()); + void RefreshFrom(const AssetImportService& importService); + + bool TryGetAssetRef(AssetImportService& importService, + const Containers::String& path, + ResourceType resourceType, + AssetRef& outRef) const; + bool TryResolveAssetPath(const AssetImportService& importService, + const AssetRef& assetRef, + Containers::String& outPath) const; + void RememberResolvedPath(const AssetGUID& assetGuid, const Containers::String& relativePath); + +private: + mutable std::shared_mutex m_mutex; + Containers::String m_projectRoot; + std::unordered_map m_assetGuidByPathKey; + std::unordered_map m_assetPathByGuid; +}; + +} // namespace Resources +} // namespace XCEngine diff --git a/engine/include/XCEngine/Core/Asset/ResourceManager.h b/engine/include/XCEngine/Core/Asset/ResourceManager.h index 5159a611..fcc80f7f 100644 --- a/engine/include/XCEngine/Core/Asset/ResourceManager.h +++ b/engine/include/XCEngine/Core/Asset/ResourceManager.h @@ -1,7 +1,8 @@ #pragma once #include -#include "AssetDatabase.h" +#include "AssetImportService.h" +#include "ProjectAssetIndex.h" #include "ResourceCache.h" #include "AsyncLoader.h" #include "ResourceHandle.h" @@ -165,12 +166,12 @@ private: size_t m_memoryUsage = 0; size_t m_memoryBudget = 512 * 1024 * 1024; - AssetDatabase m_assetDatabase; + mutable AssetImportService m_assetImportService; + mutable ProjectAssetIndex m_projectAssetIndex; ResourceCache m_cache; Core::UniqueRef m_asyncLoader; Threading::Mutex m_mutex; std::mutex m_initializeMutex; - mutable std::recursive_mutex m_ioMutex; std::mutex m_inFlightLoadsMutex; std::unordered_map, InFlightLoadKeyHasher> m_inFlightLoads; std::atomic m_deferredSceneLoadDepth{0}; diff --git a/engine/include/XCEngine/Input/InputManager.h b/engine/include/XCEngine/Input/InputManager.h index 2e5aa025..624600dc 100644 --- a/engine/include/XCEngine/Input/InputManager.h +++ b/engine/include/XCEngine/Input/InputManager.h @@ -21,6 +21,7 @@ public: bool IsKeyDown(KeyCode key) const; bool IsKeyUp(KeyCode key) const; bool IsKeyPressed(KeyCode key) const; + bool IsKeyReleased(KeyCode key) const; Math::Vector2 GetMousePosition() const; Math::Vector2 GetMouseDelta() const; @@ -28,6 +29,7 @@ public: bool IsMouseButtonDown(MouseButton button) const; bool IsMouseButtonUp(MouseButton button) const; bool IsMouseButtonClicked(MouseButton button) const; + bool IsMouseButtonReleased(MouseButton button) const; int GetTouchCount() const; TouchState GetTouch(int index) const; @@ -38,6 +40,8 @@ public: bool GetButton(const Containers::String& buttonName) const; bool GetButtonDown(const Containers::String& buttonName) const; bool GetButtonUp(const Containers::String& buttonName) const; + bool IsAnyKeyDown() const; + bool IsAnyKeyPressed() const; void RegisterAxis(const InputAxis& axis); void RegisterButton(const Containers::String& name, KeyCode key); @@ -68,6 +72,7 @@ private: std::vector m_keyDownThisFrame; std::vector m_keyDownLastFrame; + std::vector m_keyUpThisFrame; std::vector m_keyDown; Math::Vector2 m_mousePosition; @@ -75,6 +80,7 @@ private: float m_mouseScrollDelta = 0.0f; std::vector m_mouseButtonDownThisFrame; std::vector m_mouseButtonDownLastFrame; + std::vector m_mouseButtonUpThisFrame; std::vector m_mouseButtonDown; std::vector m_touches; diff --git a/engine/include/XCEngine/Rendering/CameraRenderRequest.h b/engine/include/XCEngine/Rendering/CameraRenderRequest.h index 6c80e971..28a06668 100644 --- a/engine/include/XCEngine/Rendering/CameraRenderRequest.h +++ b/engine/include/XCEngine/Rendering/CameraRenderRequest.h @@ -57,6 +57,7 @@ struct CameraRenderRequest { Math::Color clearColorOverride = Math::Color::Black(); RenderPassSequence* preScenePasses = nullptr; RenderPassSequence* postScenePasses = nullptr; + RenderPassSequence* overlayPasses = nullptr; bool IsValid() const { return scene != nullptr && diff --git a/engine/include/XCEngine/Scripting/IScriptRuntime.h b/engine/include/XCEngine/Scripting/IScriptRuntime.h index 7c103c45..30deb16d 100644 --- a/engine/include/XCEngine/Scripting/IScriptRuntime.h +++ b/engine/include/XCEngine/Scripting/IScriptRuntime.h @@ -28,6 +28,26 @@ enum class ScriptLifecycleMethod { OnDestroy }; +struct ScriptClassDescriptor { + std::string assemblyName; + std::string namespaceName; + std::string className; + + std::string GetFullName() const { + return namespaceName.empty() ? className : namespaceName + "." + className; + } + + bool operator==(const ScriptClassDescriptor& other) const { + return assemblyName == other.assemblyName + && namespaceName == other.namespaceName + && className == other.className; + } + + bool operator!=(const ScriptClassDescriptor& other) const { + return !(*this == other); + } +}; + struct ScriptRuntimeContext { Components::Scene* scene = nullptr; Components::GameObject* gameObject = nullptr; @@ -43,6 +63,9 @@ public: virtual void OnRuntimeStart(Components::Scene* scene) = 0; virtual void OnRuntimeStop(Components::Scene* scene) = 0; + virtual bool TryGetAvailableScriptClasses( + std::vector& outClasses) const = 0; + virtual bool TryGetClassFieldMetadata( const std::string& assemblyName, const std::string& namespaceName, diff --git a/engine/include/XCEngine/Scripting/Mono/MonoScriptRuntime.h b/engine/include/XCEngine/Scripting/Mono/MonoScriptRuntime.h index 3e25614c..bce44086 100644 --- a/engine/include/XCEngine/Scripting/Mono/MonoScriptRuntime.h +++ b/engine/include/XCEngine/Scripting/Mono/MonoScriptRuntime.h @@ -50,6 +50,8 @@ public: const std::string& namespaceName, const std::string& className) const; std::vector GetScriptClassNames(const std::string& assemblyName = std::string()) const; + bool TryGetAvailableScriptClasses( + std::vector& outClasses) const override; bool TryGetClassFieldMetadata( const std::string& assemblyName, const std::string& namespaceName, diff --git a/engine/include/XCEngine/Scripting/NullScriptRuntime.h b/engine/include/XCEngine/Scripting/NullScriptRuntime.h index 5c5f411a..75fc8fb0 100644 --- a/engine/include/XCEngine/Scripting/NullScriptRuntime.h +++ b/engine/include/XCEngine/Scripting/NullScriptRuntime.h @@ -9,6 +9,8 @@ class NullScriptRuntime : public IScriptRuntime { public: void OnRuntimeStart(Components::Scene* scene) override; void OnRuntimeStop(Components::Scene* scene) override; + bool TryGetAvailableScriptClasses( + std::vector& outClasses) const override; bool TryGetClassFieldMetadata( const std::string& assemblyName, const std::string& namespaceName, diff --git a/engine/include/XCEngine/Scripting/ScriptComponent.h b/engine/include/XCEngine/Scripting/ScriptComponent.h index d1ec2f0e..e91e3125 100644 --- a/engine/include/XCEngine/Scripting/ScriptComponent.h +++ b/engine/include/XCEngine/Scripting/ScriptComponent.h @@ -28,6 +28,7 @@ public: void SetScriptClass(const std::string& namespaceName, const std::string& className); void SetScriptClass(const std::string& assemblyName, const std::string& namespaceName, const std::string& className); + void ClearScriptClass(); bool HasScriptClass() const { return !m_className.empty(); } std::string GetFullClassName() const; diff --git a/engine/include/XCEngine/Scripting/ScriptEngine.h b/engine/include/XCEngine/Scripting/ScriptEngine.h index a63fb7d8..4ed8b2be 100644 --- a/engine/include/XCEngine/Scripting/ScriptEngine.h +++ b/engine/include/XCEngine/Scripting/ScriptEngine.h @@ -19,9 +19,12 @@ class ScriptComponent; class ScriptEngine { public: static ScriptEngine& Get(); + static constexpr float DefaultFixedDeltaTime = 1.0f / 50.0f; void SetRuntime(IScriptRuntime* runtime); IScriptRuntime* GetRuntime() const { return m_runtime; } + void SetRuntimeFixedDeltaTime(float fixedDeltaTime); + float GetRuntimeFixedDeltaTime() const { return m_runtimeFixedDeltaTime; } void OnRuntimeStart(Components::Scene* scene); void OnRuntimeStop(); @@ -33,6 +36,7 @@ public: void OnScriptComponentEnabled(ScriptComponent* component); void OnScriptComponentDisabled(ScriptComponent* component); void OnScriptComponentDestroyed(ScriptComponent* component); + void OnScriptComponentClassChanged(ScriptComponent* component); bool IsRuntimeRunning() const { return m_runtimeRunning; } Components::Scene* GetRuntimeScene() const { return m_runtimeScene; } @@ -40,6 +44,9 @@ public: bool HasTrackedScriptComponent(const ScriptComponent* component) const; bool HasRuntimeInstance(const ScriptComponent* component) const; size_t GetTrackedScriptCount() const { return m_scriptOrder.size(); } + bool TryGetAvailableScriptClasses( + std::vector& outClasses, + const std::string& assemblyName = std::string()) const; bool TrySetScriptFieldValue( ScriptComponent* component, const std::string& fieldName, @@ -138,6 +145,7 @@ private: IScriptRuntime* m_runtime = &m_nullRuntime; Components::Scene* m_runtimeScene = nullptr; bool m_runtimeRunning = false; + float m_runtimeFixedDeltaTime = DefaultFixedDeltaTime; uint64_t m_runtimeSceneCreatedSubscription = 0; std::unordered_map m_scriptStates; diff --git a/engine/src/Components/MeshFilterComponent.cpp b/engine/src/Components/MeshFilterComponent.cpp index 74e0b500..9f67a341 100644 --- a/engine/src/Components/MeshFilterComponent.cpp +++ b/engine/src/Components/MeshFilterComponent.cpp @@ -20,6 +20,10 @@ bool ShouldTraceMeshPath(const std::string& path) { path.find("backpack") != std::string::npos; } +bool HasVirtualPathScheme(const std::string& path) { + return path.find("://") != std::string::npos; +} + std::string EncodeAssetRef(const Resources::AssetRef& assetRef) { if (!assetRef.IsValid()) { return std::string(); @@ -67,17 +71,20 @@ struct MeshFilterComponent::PendingMeshLoadState { }; Resources::Mesh* MeshFilterComponent::GetMesh() const { + const_cast(this)->EnsureDeferredAsyncMeshLoadStarted(); const_cast(this)->ResolvePendingMesh(); return m_mesh.Get(); } const Resources::ResourceHandle& MeshFilterComponent::GetMeshHandle() const { + const_cast(this)->EnsureDeferredAsyncMeshLoadStarted(); const_cast(this)->ResolvePendingMesh(); return m_mesh; } void MeshFilterComponent::SetMeshPath(const std::string& meshPath) { m_pendingMeshLoad.reset(); + m_asyncMeshLoadRequested = false; m_meshPath = meshPath; if (m_meshPath.empty()) { m_mesh.Reset(); @@ -101,6 +108,7 @@ void MeshFilterComponent::SetMeshPath(const std::string& meshPath) { void MeshFilterComponent::SetMesh(const Resources::ResourceHandle& mesh) { m_pendingMeshLoad.reset(); + m_asyncMeshLoadRequested = false; m_mesh = mesh; m_meshPath = mesh.Get() != nullptr ? ToStdString(mesh->GetPath()) : std::string(); if (m_meshPath.empty()) { @@ -116,18 +124,29 @@ void MeshFilterComponent::SetMesh(Resources::Mesh* mesh) { void MeshFilterComponent::ClearMesh() { m_pendingMeshLoad.reset(); + m_asyncMeshLoadRequested = false; m_mesh.Reset(); m_meshPath.clear(); m_meshRef.Reset(); } void MeshFilterComponent::Serialize(std::ostream& os) const { - os << "mesh=" << m_meshPath << ";"; - os << "meshRef=" << EncodeAssetRef(m_meshRef) << ";"; + Resources::AssetRef meshRef = m_meshRef; + if (!meshRef.IsValid() && + !m_meshPath.empty() && + !HasVirtualPathScheme(m_meshPath) && + Resources::ResourceManager::Get().TryGetAssetRef(m_meshPath.c_str(), Resources::ResourceType::Mesh, meshRef)) { + } + + os << "meshRef=" << EncodeAssetRef(meshRef) << ";"; + if (!meshRef.IsValid() && !m_meshPath.empty()) { + os << "meshPath=" << m_meshPath << ";"; + } } void MeshFilterComponent::Deserialize(std::istream& is) { m_pendingMeshLoad.reset(); + m_asyncMeshLoadRequested = false; m_mesh.Reset(); m_meshPath.clear(); m_meshRef.Reset(); @@ -148,7 +167,7 @@ void MeshFilterComponent::Deserialize(std::istream& is) { const std::string key = token.substr(0, eqPos); const std::string value = token.substr(eqPos + 1); - if (key == "mesh") { + if (key == "mesh" || key == "meshPath") { pendingMeshPath = value; } else if (key == "meshRef") { TryDecodeAssetRef(value, pendingMeshRef); @@ -172,7 +191,6 @@ void MeshFilterComponent::Deserialize(std::istream& is) { if (ShouldTraceMeshPath(m_meshPath)) { TraceMeshFilter(*this, std::string("Resolved meshRef to path=") + m_meshPath); } - BeginAsyncMeshLoad(m_meshPath); return; } @@ -191,7 +209,6 @@ void MeshFilterComponent::Deserialize(std::istream& is) { if (!Resources::ResourceManager::Get().TryGetAssetRef(m_meshPath.c_str(), Resources::ResourceType::Mesh, m_meshRef)) { m_meshRef.Reset(); } - BeginAsyncMeshLoad(m_meshPath); return; } @@ -202,10 +219,12 @@ void MeshFilterComponent::Deserialize(std::istream& is) { void MeshFilterComponent::BeginAsyncMeshLoad(const std::string& meshPath) { if (meshPath.empty()) { m_pendingMeshLoad.reset(); + m_asyncMeshLoadRequested = false; m_mesh.Reset(); return; } + m_asyncMeshLoadRequested = true; m_mesh.Reset(); m_pendingMeshLoad = std::make_shared(); if (ShouldTraceMeshPath(meshPath)) { @@ -219,7 +238,15 @@ void MeshFilterComponent::BeginAsyncMeshLoad(const std::string& meshPath) { state->result = std::move(result); state->completed = true; } - }); + }); +} + +void MeshFilterComponent::EnsureDeferredAsyncMeshLoadStarted() { + if (m_asyncMeshLoadRequested || m_mesh.Get() != nullptr || m_meshPath.empty()) { + return; + } + + BeginAsyncMeshLoad(m_meshPath); } void MeshFilterComponent::ResolvePendingMesh() { diff --git a/engine/src/Components/MeshRendererComponent.cpp b/engine/src/Components/MeshRendererComponent.cpp index bfd2018a..dc7bf817 100644 --- a/engine/src/Components/MeshRendererComponent.cpp +++ b/engine/src/Components/MeshRendererComponent.cpp @@ -4,6 +4,7 @@ #include "Core/Asset/ResourceManager.h" #include "Debug/Logger.h" +#include #include namespace XCEngine { @@ -21,6 +22,10 @@ bool ShouldTraceMaterialPath(const std::string& path) { path.find("New Material.mat") != std::string::npos; } +bool HasVirtualPathScheme(const std::string& path) { + return path.find("://") != std::string::npos; +} + std::string EncodeAssetRef(const Resources::AssetRef& assetRef) { if (!assetRef.IsValid()) { return std::string(); @@ -145,11 +150,13 @@ struct MeshRendererComponent::PendingMaterialLoadState { }; Resources::Material* MeshRendererComponent::GetMaterial(size_t index) const { + const_cast(this)->EnsureDeferredAsyncMaterialLoadStarted(index); const_cast(this)->ResolvePendingMaterials(); return index < m_materials.size() ? m_materials[index].Get() : nullptr; } const Resources::ResourceHandle& MeshRendererComponent::GetMaterialHandle(size_t index) const { + const_cast(this)->EnsureDeferredAsyncMaterialLoadStarted(index); const_cast(this)->ResolvePendingMaterials(); static const Resources::ResourceHandle kNullHandle; return index < m_materials.size() ? m_materials[index] : kNullHandle; @@ -163,6 +170,7 @@ const std::string& MeshRendererComponent::GetMaterialPath(size_t index) const { void MeshRendererComponent::SetMaterialPath(size_t index, const std::string& materialPath) { EnsureMaterialSlot(index); m_pendingMaterialLoads[index].reset(); + m_asyncMaterialLoadRequested[index] = false; m_materialPaths[index] = materialPath; if (materialPath.empty()) { m_materials[index].Reset(); @@ -188,6 +196,7 @@ void MeshRendererComponent::SetMaterialPath(size_t index, const std::string& mat void MeshRendererComponent::SetMaterial(size_t index, const Resources::ResourceHandle& material) { EnsureMaterialSlot(index); m_pendingMaterialLoads[index].reset(); + m_asyncMaterialLoadRequested[index] = false; m_materials[index] = material; m_materialPaths[index] = MaterialPathFromHandle(material); if (m_materialPaths[index].empty() || @@ -206,6 +215,8 @@ void MeshRendererComponent::SetMaterials(const std::vector(std::tolower(ch)); + }); + return key; +} + +} // namespace + +void ProjectAssetIndex::ResetProjectRoot(const Containers::String& projectRoot) { + std::unique_lock lock(m_mutex); + m_projectRoot = projectRoot; + m_assetGuidByPathKey.clear(); + m_assetPathByGuid.clear(); +} + +void ProjectAssetIndex::RefreshFrom(const AssetImportService& importService) { + std::unordered_map pathToGuid; + std::unordered_map guidToPath; + const Containers::String projectRoot = importService.GetProjectRoot(); + if (!projectRoot.Empty()) { + importService.BuildLookupSnapshot(pathToGuid, guidToPath); + } + + std::unique_lock lock(m_mutex); + m_projectRoot = projectRoot; + m_assetGuidByPathKey = std::move(pathToGuid); + m_assetPathByGuid = std::move(guidToPath); +} + +bool ProjectAssetIndex::TryGetAssetRef(AssetImportService& importService, + const Containers::String& path, + ResourceType resourceType, + AssetRef& outRef) const { + bool resolved = false; + { + std::shared_lock lock(m_mutex); + const Containers::String relativePath = MakeAssetLookupRelativePath(m_projectRoot, path); + if (!relativePath.Empty()) { + const auto lookupIt = m_assetGuidByPathKey.find(MakeAssetLookupPathKey(relativePath)); + if (lookupIt != m_assetGuidByPathKey.end()) { + outRef.assetGuid = lookupIt->second; + outRef.localID = kMainAssetLocalID; + outRef.resourceType = resourceType; + resolved = outRef.IsValid(); + } + } + } + + if (!resolved) { + resolved = importService.TryGetAssetRef(path, resourceType, outRef); + if (!resolved) { + const Containers::String projectRoot = importService.GetProjectRoot(); + const Containers::String relativePath = MakeAssetLookupRelativePath(projectRoot, path); + if (!relativePath.Empty() && !projectRoot.Empty()) { + auto* index = const_cast(this); + importService.Refresh(); + index->RefreshFrom(importService); + resolved = importService.TryGetAssetRef(path, resourceType, outRef); + } + } + + if (resolved) { + Containers::String relativePath; + if (importService.TryGetPrimaryAssetPath(outRef.assetGuid, relativePath)) { + const_cast(this)->RememberResolvedPath(outRef.assetGuid, relativePath); + } + } + } + + return resolved; +} + +bool ProjectAssetIndex::TryResolveAssetPath(const AssetImportService& importService, + const AssetRef& assetRef, + Containers::String& outPath) const { + if (!assetRef.IsValid()) { + return false; + } + + bool resolved = false; + { + std::shared_lock lock(m_mutex); + const auto lookupIt = m_assetPathByGuid.find(assetRef.assetGuid); + if (lookupIt != m_assetPathByGuid.end()) { + outPath = lookupIt->second; + resolved = true; + } + } + + if (!resolved) { + resolved = importService.TryGetPrimaryAssetPath(assetRef.assetGuid, outPath); + if (resolved) { + const_cast(this)->RememberResolvedPath(assetRef.assetGuid, outPath); + } + } + + return resolved; +} + +void ProjectAssetIndex::RememberResolvedPath(const AssetGUID& assetGuid, const Containers::String& relativePath) { + if (!assetGuid.IsValid() || relativePath.Empty()) { + return; + } + + std::unique_lock lock(m_mutex); + m_assetGuidByPathKey[MakeAssetLookupPathKey(relativePath)] = assetGuid; + m_assetPathByGuid[assetGuid] = relativePath; +} + +} // namespace Resources +} // namespace XCEngine diff --git a/engine/src/Core/Asset/ResourceManager.cpp b/engine/src/Core/Asset/ResourceManager.cpp index 8cc97e6c..1c4f2380 100644 --- a/engine/src/Core/Asset/ResourceManager.cpp +++ b/engine/src/Core/Asset/ResourceManager.cpp @@ -85,6 +85,7 @@ void ResourceManager::EnsureInitialized() { RegisterBuiltinLoader(*this, g_meshLoader); RegisterBuiltinLoader(*this, g_shaderLoader); RegisterBuiltinLoader(*this, g_textureLoader); + m_assetImportService.Initialize(); m_asyncLoader = std::move(asyncLoader); } @@ -96,23 +97,24 @@ void ResourceManager::Shutdown() { m_asyncLoader.reset(); } - std::lock_guard lock(m_ioMutex); - m_assetDatabase.Shutdown(); + m_assetImportService.Shutdown(); ResourceFileSystem::Get().Shutdown(); + m_projectAssetIndex.ResetProjectRoot(); std::lock_guard inFlightLock(m_inFlightLoadsMutex); m_inFlightLoads.clear(); } void ResourceManager::SetResourceRoot(const Containers::String& rootPath) { - std::lock_guard lock(m_ioMutex); m_resourceRoot = rootPath; if (!m_resourceRoot.Empty()) { ResourceFileSystem::Get().Initialize(rootPath); - m_assetDatabase.Initialize(rootPath); + m_assetImportService.SetProjectRoot(rootPath); + m_projectAssetIndex.RefreshFrom(m_assetImportService); } else { + m_assetImportService.SetProjectRoot(Containers::String()); ResourceFileSystem::Get().Shutdown(); - m_assetDatabase.Shutdown(); + m_projectAssetIndex.ResetProjectRoot(); } } @@ -360,14 +362,14 @@ void ResourceManager::UnloadGroup(const Containers::Array& guids) void ResourceManager::RefreshAssetDatabase() { if (!m_resourceRoot.Empty()) { - std::lock_guard lock(m_ioMutex); - m_assetDatabase.Refresh(); + m_assetImportService.Refresh(); + m_projectAssetIndex.RefreshFrom(m_assetImportService); } } bool ResourceManager::TryGetAssetRef(const Containers::String& path, ResourceType resourceType, AssetRef& outRef) const { - std::lock_guard lock(m_ioMutex); - const bool resolved = m_assetDatabase.TryGetAssetRef(path, resourceType, outRef); + const bool resolved = m_projectAssetIndex.TryGetAssetRef(m_assetImportService, path, resourceType, outRef); + if (ShouldTraceResourcePath(path)) { Debug::Logger::Get().Info( Debug::LogCategory::FileSystem, @@ -384,12 +386,8 @@ bool ResourceManager::TryGetAssetRef(const Containers::String& path, ResourceTyp } bool ResourceManager::TryResolveAssetPath(const AssetRef& assetRef, Containers::String& outPath) const { - if (!assetRef.IsValid()) { - return false; - } + const bool resolved = m_projectAssetIndex.TryResolveAssetPath(m_assetImportService, assetRef, outPath); - std::lock_guard lock(m_ioMutex); - const bool resolved = m_assetDatabase.TryGetPrimaryAssetPath(assetRef.assetGuid, outPath); if (resolved && ShouldTraceResourcePath(outPath)) { Debug::Logger::Get().Info( Debug::LogCategory::FileSystem, @@ -512,30 +510,27 @@ LoadResult ResourceManager::LoadResource(const Containers::String& path, } Containers::String loadPath = path; - { - std::lock_guard ioLock(m_ioMutex); - - AssetDatabase::ResolvedAsset resolvedAsset; - if (!m_resourceRoot.Empty() && - m_assetDatabase.EnsureArtifact(path, type, resolvedAsset) && - resolvedAsset.artifactReady) { - loadPath = resolvedAsset.artifactMainPath; - if (ShouldTraceResourcePath(path)) { - Debug::Logger::Get().Info( - Debug::LogCategory::FileSystem, - Containers::String("[ResourceManager] LoadResource artifact path=") + - path + - " artifact=" + - loadPath); - } - } else if (ShouldTraceResourcePath(path)) { + AssetDatabase::ResolvedAsset resolvedAsset; + if (!m_resourceRoot.Empty() && + m_assetImportService.EnsureArtifact(path, type, resolvedAsset) && + resolvedAsset.artifactReady) { + m_projectAssetIndex.RememberResolvedPath(resolvedAsset.assetGuid, resolvedAsset.relativePath); + loadPath = resolvedAsset.artifactMainPath; + if (ShouldTraceResourcePath(path)) { Debug::Logger::Get().Info( Debug::LogCategory::FileSystem, - Containers::String("[ResourceManager] LoadResource direct path=") + + Containers::String("[ResourceManager] LoadResource artifact path=") + path + - " loadPath=" + + " artifact=" + loadPath); } + } else if (ShouldTraceResourcePath(path)) { + Debug::Logger::Get().Info( + Debug::LogCategory::FileSystem, + Containers::String("[ResourceManager] LoadResource direct path=") + + path + + " loadPath=" + + loadPath); } LoadResult result; diff --git a/engine/src/Input/InputManager.cpp b/engine/src/Input/InputManager.cpp index 1f0d4934..920b0244 100644 --- a/engine/src/Input/InputManager.cpp +++ b/engine/src/Input/InputManager.cpp @@ -16,10 +16,12 @@ void InputManager::Initialize(void* platformWindowHandle) { m_keyDownThisFrame.resize(256, false); m_keyDownLastFrame.resize(256, false); + m_keyUpThisFrame.resize(256, false); m_keyDown.resize(256, false); m_mouseButtonDownThisFrame.resize(5, false); m_mouseButtonDownLastFrame.resize(5, false); + m_mouseButtonUpThisFrame.resize(5, false); m_mouseButtonDown.resize(5, false); m_buttonDownThisFrame.resize(32, false); @@ -39,14 +41,21 @@ void InputManager::Initialize(void* platformWindowHandle) { } void InputManager::Shutdown() { + m_mousePosition = Math::Vector2::Zero(); + m_mouseDelta = Math::Vector2::Zero(); + m_mouseScrollDelta = 0.0f; + m_touches.clear(); + if (!m_initialized) return; m_keyDownThisFrame.clear(); m_keyDownLastFrame.clear(); + m_keyUpThisFrame.clear(); m_keyDown.clear(); m_mouseButtonDownThisFrame.clear(); m_mouseButtonDownLastFrame.clear(); + m_mouseButtonUpThisFrame.clear(); m_mouseButtonDown.clear(); m_axes.clear(); @@ -64,10 +73,14 @@ void InputManager::Update(float deltaTime) { m_keyDownLastFrame = m_keyDownThisFrame; m_keyDownThisFrame.clear(); m_keyDownThisFrame.resize(256, false); + m_keyUpThisFrame.clear(); + m_keyUpThisFrame.resize(256, false); m_mouseButtonDownLastFrame = m_mouseButtonDownThisFrame; m_mouseButtonDownThisFrame.clear(); m_mouseButtonDownThisFrame.resize(5, false); + m_mouseButtonUpThisFrame.clear(); + m_mouseButtonUpThisFrame.resize(5, false); m_buttonDownLastFrame = m_buttonDownThisFrame; m_buttonDownThisFrame.clear(); @@ -104,6 +117,13 @@ bool InputManager::IsKeyPressed(KeyCode key) const { return m_keyDownThisFrame[index] && !m_keyDownLastFrame[index]; } +bool InputManager::IsKeyReleased(KeyCode key) const { + if (!m_initialized) return false; + size_t index = GetKeyIndex(key); + if (index >= m_keyUpThisFrame.size()) return false; + return m_keyUpThisFrame[index]; +} + Math::Vector2 InputManager::GetMousePosition() const { return m_mousePosition; } @@ -135,6 +155,13 @@ bool InputManager::IsMouseButtonClicked(MouseButton button) const { return m_mouseButtonDownThisFrame[index] && !m_mouseButtonDownLastFrame[index]; } +bool InputManager::IsMouseButtonReleased(MouseButton button) const { + if (!m_initialized) return false; + size_t index = GetMouseButtonIndex(button); + if (index >= m_mouseButtonUpThisFrame.size()) return false; + return m_mouseButtonUpThisFrame[index]; +} + int InputManager::GetTouchCount() const { return static_cast(m_touches.size()); } @@ -170,10 +197,10 @@ float InputManager::GetAxisRaw(const Containers::String& axisName) const { const auto& axis = it->second; float value = 0.0f; - if (axis.GetPositiveKey() != KeyCode::None && IsKeyPressed(axis.GetPositiveKey())) { + if (axis.GetPositiveKey() != KeyCode::None && IsKeyDown(axis.GetPositiveKey())) { value += 1.0f; } - if (axis.GetNegativeKey() != KeyCode::None && IsKeyPressed(axis.GetNegativeKey())) { + if (axis.GetNegativeKey() != KeyCode::None && IsKeyDown(axis.GetNegativeKey())) { value -= 1.0f; } @@ -194,8 +221,34 @@ bool InputManager::GetButtonDown(const Containers::String& buttonName) const { bool InputManager::GetButtonUp(const Containers::String& buttonName) const { auto it = m_buttons.find(buttonName); - if (it == m_buttons.end()) return true; - return IsKeyUp(it->second); + if (it == m_buttons.end()) return false; + return IsKeyReleased(it->second); +} + +bool InputManager::IsAnyKeyDown() const { + if (!m_initialized) return false; + + return std::any_of( + m_keyDown.begin(), + m_keyDown.end(), + [](bool isDown) { return isDown; }) + || std::any_of( + m_mouseButtonDown.begin(), + m_mouseButtonDown.end(), + [](bool isDown) { return isDown; }); +} + +bool InputManager::IsAnyKeyPressed() const { + if (!m_initialized) return false; + + return std::any_of( + m_keyDownThisFrame.begin(), + m_keyDownThisFrame.end(), + [](bool isPressed) { return isPressed; }) + || std::any_of( + m_mouseButtonDownThisFrame.begin(), + m_mouseButtonDownThisFrame.end(), + [](bool isPressed) { return isPressed; }); } void InputManager::RegisterAxis(const InputAxis& axis) { @@ -238,6 +291,7 @@ void InputManager::ProcessKeyUp(KeyCode key, bool alt, bool ctrl, bool shift, bo if (index >= m_keyDown.size()) return; m_keyDown[index] = false; + m_keyUpThisFrame[index] = true; KeyEvent event; event.keyCode = key; @@ -274,6 +328,8 @@ void InputManager::ProcessMouseButton(MouseButton button, bool pressed, int x, i m_mouseButtonDown[index] = pressed; if (pressed) { m_mouseButtonDownThisFrame[index] = true; + } else { + m_mouseButtonUpThisFrame[index] = true; } MouseButtonEvent event; diff --git a/engine/src/Rendering/CameraRenderer.cpp b/engine/src/Rendering/CameraRenderer.cpp index cfdf7f6a..33d1d22f 100644 --- a/engine/src/Rendering/CameraRenderer.cpp +++ b/engine/src/Rendering/CameraRenderer.cpp @@ -231,6 +231,25 @@ bool CameraRenderer::Render( } ShutdownPassSequence(&builtinPostProcessPasses, builtinPostProcessPassesInitialized); + + bool overlayPassesInitialized = false; + if (!InitializePassSequence( + request.overlayPasses, + request.context, + overlayPassesInitialized)) { + ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized); + ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized); + return false; + } + if (request.overlayPasses != nullptr && + !request.overlayPasses->Execute(passContext)) { + ShutdownPassSequence(request.overlayPasses, overlayPassesInitialized); + ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized); + ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized); + return false; + } + + ShutdownPassSequence(request.overlayPasses, overlayPassesInitialized); ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized); ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized); diff --git a/engine/src/Resources/Material/MaterialLoader.cpp b/engine/src/Resources/Material/MaterialLoader.cpp index a6f88964..bfaef352 100644 --- a/engine/src/Resources/Material/MaterialLoader.cpp +++ b/engine/src/Resources/Material/MaterialLoader.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -64,6 +65,56 @@ Containers::String NormalizePathString(const std::filesystem::path& path) { return Containers::String(path.lexically_normal().generic_string().c_str()); } +bool IsProjectRelativePath(const std::filesystem::path& path) { + const std::string generic = path.generic_string(); + return !generic.empty() && + generic != "." && + generic != ".." && + generic.rfind("../", 0) != 0; +} + +Containers::String ToProjectRelativeIfPossible(const std::filesystem::path& path) { + const Containers::String& resourceRoot = ResourceManager::Get().GetResourceRoot(); + const std::filesystem::path normalizedPath = path.lexically_normal(); + if (!resourceRoot.Empty() && normalizedPath.is_absolute()) { + std::error_code ec; + const std::filesystem::path relativePath = + std::filesystem::relative(normalizedPath, std::filesystem::path(resourceRoot.CStr()), ec); + if (!ec && IsProjectRelativePath(relativePath)) { + return NormalizePathString(relativePath); + } + } + + return NormalizePathString(normalizedPath); +} + +Containers::String ResolveSourceDependencyPath(const Containers::String& dependencyPath, + const Containers::String& sourcePath) { + if (dependencyPath.Empty()) { + return dependencyPath; + } + + std::filesystem::path dependencyFsPath(dependencyPath.CStr()); + if (dependencyFsPath.is_absolute()) { + return NormalizePathString(dependencyFsPath); + } + + const std::filesystem::path sourceFsPath(sourcePath.CStr()); + if (sourceFsPath.is_absolute()) { + return ToProjectRelativeIfPossible(sourceFsPath.parent_path() / dependencyFsPath); + } + + const Containers::String& resourceRoot = ResourceManager::Get().GetResourceRoot(); + if (!resourceRoot.Empty()) { + return ToProjectRelativeIfPossible( + std::filesystem::path(resourceRoot.CStr()) / + sourceFsPath.parent_path() / + dependencyFsPath); + } + + return NormalizePathString(sourceFsPath.parent_path() / dependencyFsPath); +} + Containers::String ResolveArtifactDependencyPath(const Containers::String& dependencyPath, const Containers::String& ownerArtifactPath) { if (dependencyPath.Empty()) { @@ -358,6 +409,125 @@ bool TryParseTagMap(const std::string& objectText, Material* material) { return false; } +bool TryParseStringMapObject( + const std::string& objectText, + const std::function& onEntry) { + if (!onEntry || objectText.empty() || objectText.front() != '{' || objectText.back() != '}') { + return false; + } + + size_t pos = 1; + while (pos < objectText.size()) { + pos = SkipWhitespace(objectText, pos); + if (pos >= objectText.size()) { + return false; + } + + if (objectText[pos] == '}') { + return true; + } + + Containers::String key; + if (!ParseQuotedString(objectText, pos, key, &pos)) { + return false; + } + + pos = SkipWhitespace(objectText, pos); + if (pos >= objectText.size() || objectText[pos] != ':') { + return false; + } + + pos = SkipWhitespace(objectText, pos + 1); + Containers::String value; + if (!ParseQuotedString(objectText, pos, value, &pos)) { + return false; + } + + onEntry(key, value); + + pos = SkipWhitespace(objectText, pos); + if (pos >= objectText.size()) { + return false; + } + + if (objectText[pos] == ',') { + ++pos; + continue; + } + + if (objectText[pos] == '}') { + return true; + } + + return false; + } + + return false; +} + +bool TryApplyTexturePath(Material* material, + const Containers::String& textureName, + const Containers::String& texturePath) { + if (material == nullptr || textureName.Empty() || texturePath.Empty()) { + return false; + } + + material->SetTexturePath( + textureName, + ResolveSourceDependencyPath(texturePath, material->GetPath())); + return true; +} + +bool TryParseMaterialTextureBindings(const std::string& jsonText, Material* material) { + if (material == nullptr) { + return false; + } + + static const char* const kKnownTextureKeys[] = { + "baseColorTexture", + "_BaseColorTexture", + "_MainTex", + "normalTexture", + "_BumpMap", + "specularTexture", + "emissiveTexture", + "metallicTexture", + "roughnessTexture", + "occlusionTexture", + "opacityTexture" + }; + + for (const char* key : kKnownTextureKeys) { + if (!HasKey(jsonText, key)) { + continue; + } + + Containers::String texturePath; + if (!TryParseStringValue(jsonText, key, texturePath)) { + return false; + } + + TryApplyTexturePath(material, Containers::String(key), texturePath); + } + + if (HasKey(jsonText, "textures")) { + std::string texturesObject; + if (!TryExtractObject(jsonText, "textures", texturesObject)) { + return false; + } + + if (!TryParseStringMapObject( + texturesObject, + [material](const Containers::String& name, const Containers::String& value) { + TryApplyTexturePath(material, name, value); + })) { + return false; + } + } + + return true; +} + bool TryParseCullMode(const Containers::String& value, MaterialCullMode& outMode) { const Containers::String normalized = value.Trim().ToLower(); if (normalized == "none" || normalized == "off") { @@ -953,6 +1123,10 @@ bool MaterialLoader::ParseMaterialData(const Containers::Array& dat } } + if (!TryParseMaterialTextureBindings(jsonText, material)) { + return false; + } + return true; } diff --git a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp index 3814fc11..69ede79a 100644 --- a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp +++ b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp @@ -7,6 +7,7 @@ #include "Components/MeshRendererComponent.h" #include "Components/TransformComponent.h" #include "Debug/Logger.h" +#include "Input/InputManager.h" #include "Scene/Scene.h" #include "Scripting/ScriptComponent.h" #include "Scripting/ScriptEngine.h" @@ -356,6 +357,92 @@ float InternalCall_Time_GetDeltaTime() { return GetInternalCallDeltaTime(); } +float InternalCall_Time_GetFixedDeltaTime() { + return ScriptEngine::Get().GetRuntimeFixedDeltaTime(); +} + +mono_bool InternalCall_Input_GetKey(int32_t keyCode) { + return XCEngine::Input::InputManager::Get().IsKeyDown( + static_cast(keyCode)) ? 1 : 0; +} + +mono_bool InternalCall_Input_GetKeyDown(int32_t keyCode) { + return XCEngine::Input::InputManager::Get().IsKeyPressed( + static_cast(keyCode)) ? 1 : 0; +} + +mono_bool InternalCall_Input_GetKeyUp(int32_t keyCode) { + return XCEngine::Input::InputManager::Get().IsKeyReleased( + static_cast(keyCode)) ? 1 : 0; +} + +mono_bool InternalCall_Input_GetMouseButton(int32_t button) { + return XCEngine::Input::InputManager::Get().IsMouseButtonDown( + static_cast(button)) ? 1 : 0; +} + +mono_bool InternalCall_Input_GetMouseButtonDown(int32_t button) { + return XCEngine::Input::InputManager::Get().IsMouseButtonClicked( + static_cast(button)) ? 1 : 0; +} + +mono_bool InternalCall_Input_GetMouseButtonUp(int32_t button) { + return XCEngine::Input::InputManager::Get().IsMouseButtonReleased( + static_cast(button)) ? 1 : 0; +} + +mono_bool InternalCall_Input_GetButton(MonoString* buttonName) { + return XCEngine::Input::InputManager::Get().GetButton( + XCEngine::Containers::String(MonoStringToUtf8(buttonName).c_str())) ? 1 : 0; +} + +mono_bool InternalCall_Input_GetButtonDown(MonoString* buttonName) { + return XCEngine::Input::InputManager::Get().GetButtonDown( + XCEngine::Containers::String(MonoStringToUtf8(buttonName).c_str())) ? 1 : 0; +} + +mono_bool InternalCall_Input_GetButtonUp(MonoString* buttonName) { + return XCEngine::Input::InputManager::Get().GetButtonUp( + XCEngine::Containers::String(MonoStringToUtf8(buttonName).c_str())) ? 1 : 0; +} + +float InternalCall_Input_GetAxis(MonoString* axisName) { + return XCEngine::Input::InputManager::Get().GetAxis( + XCEngine::Containers::String(MonoStringToUtf8(axisName).c_str())); +} + +float InternalCall_Input_GetAxisRaw(MonoString* axisName) { + return XCEngine::Input::InputManager::Get().GetAxisRaw( + XCEngine::Containers::String(MonoStringToUtf8(axisName).c_str())); +} + +mono_bool InternalCall_Input_GetAnyKey() { + return XCEngine::Input::InputManager::Get().IsAnyKeyDown() ? 1 : 0; +} + +mono_bool InternalCall_Input_GetAnyKeyDown() { + return XCEngine::Input::InputManager::Get().IsAnyKeyPressed() ? 1 : 0; +} + +void InternalCall_Input_GetMousePosition(XCEngine::Math::Vector3* outPosition) { + if (!outPosition) { + return; + } + + const XCEngine::Math::Vector2 position = XCEngine::Input::InputManager::Get().GetMousePosition(); + *outPosition = XCEngine::Math::Vector3(position.x, position.y, 0.0f); +} + +void InternalCall_Input_GetMouseScrollDelta(XCEngine::Math::Vector2* outDelta) { + if (!outDelta) { + return; + } + + *outDelta = XCEngine::Math::Vector2( + 0.0f, + XCEngine::Input::InputManager::Get().GetMouseScrollDelta()); +} + MonoString* InternalCall_GameObject_GetName(uint64_t gameObjectUUID) { Components::GameObject* gameObject = FindGameObjectByUUID(gameObjectUUID); return mono_string_new( @@ -1131,6 +1218,22 @@ void RegisterInternalCalls() { mono_add_internal_call("XCEngine.InternalCalls::Debug_LogWarning", reinterpret_cast(&InternalCall_Debug_LogWarning)); mono_add_internal_call("XCEngine.InternalCalls::Debug_LogError", reinterpret_cast(&InternalCall_Debug_LogError)); mono_add_internal_call("XCEngine.InternalCalls::Time_GetDeltaTime", reinterpret_cast(&InternalCall_Time_GetDeltaTime)); + mono_add_internal_call("XCEngine.InternalCalls::Time_GetFixedDeltaTime", reinterpret_cast(&InternalCall_Time_GetFixedDeltaTime)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetKey", reinterpret_cast(&InternalCall_Input_GetKey)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetKeyDown", reinterpret_cast(&InternalCall_Input_GetKeyDown)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetKeyUp", reinterpret_cast(&InternalCall_Input_GetKeyUp)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetMouseButton", reinterpret_cast(&InternalCall_Input_GetMouseButton)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetMouseButtonDown", reinterpret_cast(&InternalCall_Input_GetMouseButtonDown)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetMouseButtonUp", reinterpret_cast(&InternalCall_Input_GetMouseButtonUp)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetButton", reinterpret_cast(&InternalCall_Input_GetButton)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetButtonDown", reinterpret_cast(&InternalCall_Input_GetButtonDown)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetButtonUp", reinterpret_cast(&InternalCall_Input_GetButtonUp)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetAxis", reinterpret_cast(&InternalCall_Input_GetAxis)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetAxisRaw", reinterpret_cast(&InternalCall_Input_GetAxisRaw)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetAnyKey", reinterpret_cast(&InternalCall_Input_GetAnyKey)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetAnyKeyDown", reinterpret_cast(&InternalCall_Input_GetAnyKeyDown)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetMousePosition", reinterpret_cast(&InternalCall_Input_GetMousePosition)); + mono_add_internal_call("XCEngine.InternalCalls::Input_GetMouseScrollDelta", reinterpret_cast(&InternalCall_Input_GetMouseScrollDelta)); mono_add_internal_call("XCEngine.InternalCalls::GameObject_GetName", reinterpret_cast(&InternalCall_GameObject_GetName)); mono_add_internal_call("XCEngine.InternalCalls::GameObject_SetName", reinterpret_cast(&InternalCall_GameObject_SetName)); mono_add_internal_call("XCEngine.InternalCalls::GameObject_GetActiveSelf", reinterpret_cast(&InternalCall_GameObject_GetActiveSelf)); @@ -1281,20 +1384,57 @@ bool MonoScriptRuntime::IsClassAvailable( return FindClassMetadata(assemblyName, namespaceName, className) != nullptr; } -std::vector MonoScriptRuntime::GetScriptClassNames(const std::string& assemblyName) const { - std::vector classNames; - classNames.reserve(m_classes.size()); +bool MonoScriptRuntime::TryGetAvailableScriptClasses( + std::vector& outClasses) const { + outClasses.clear(); + if (!m_initialized) { + return false; + } + outClasses.reserve(m_classes.size()); for (const auto& [key, metadata] : m_classes) { (void)key; - if (!assemblyName.empty() && metadata.assemblyName != assemblyName) { + outClasses.push_back( + ScriptClassDescriptor{ + metadata.assemblyName, + metadata.namespaceName, + metadata.className + }); + } + + std::sort( + outClasses.begin(), + outClasses.end(), + [](const ScriptClassDescriptor& lhs, const ScriptClassDescriptor& rhs) { + if (lhs.assemblyName != rhs.assemblyName) { + return lhs.assemblyName < rhs.assemblyName; + } + if (lhs.namespaceName != rhs.namespaceName) { + return lhs.namespaceName < rhs.namespaceName; + } + return lhs.className < rhs.className; + }); + + return true; +} + +std::vector MonoScriptRuntime::GetScriptClassNames(const std::string& assemblyName) const { + std::vector classes; + if (!TryGetAvailableScriptClasses(classes)) { + return {}; + } + + std::vector classNames; + classNames.reserve(classes.size()); + + for (const ScriptClassDescriptor& descriptor : classes) { + if (!assemblyName.empty() && descriptor.assemblyName != assemblyName) { continue; } - classNames.push_back(metadata.fullName); + classNames.push_back(descriptor.GetFullName()); } - std::sort(classNames.begin(), classNames.end()); return classNames; } diff --git a/engine/src/Scripting/NullScriptRuntime.cpp b/engine/src/Scripting/NullScriptRuntime.cpp index e8266b9f..d12c98d8 100644 --- a/engine/src/Scripting/NullScriptRuntime.cpp +++ b/engine/src/Scripting/NullScriptRuntime.cpp @@ -11,6 +11,12 @@ void NullScriptRuntime::OnRuntimeStop(Components::Scene* scene) { (void)scene; } +bool NullScriptRuntime::TryGetAvailableScriptClasses( + std::vector& outClasses) const { + outClasses.clear(); + return false; +} + bool NullScriptRuntime::TryGetClassFieldMetadata( const std::string& assemblyName, const std::string& namespaceName, diff --git a/engine/src/Scripting/ScriptComponent.cpp b/engine/src/Scripting/ScriptComponent.cpp index 4a728ca2..167bf134 100644 --- a/engine/src/Scripting/ScriptComponent.cpp +++ b/engine/src/Scripting/ScriptComponent.cpp @@ -25,23 +25,36 @@ ScriptComponent::ScriptComponent() void ScriptComponent::SetScriptClass(const std::string& namespaceName, const std::string& className) { const bool hadScriptClass = HasScriptClass(); + const bool changed = m_namespaceName != namespaceName || m_className != className; m_namespaceName = namespaceName; m_className = className; if (!hadScriptClass && HasScriptClass()) { ScriptEngine::Get().OnScriptComponentEnabled(this); + } else if (hadScriptClass && changed) { + ScriptEngine::Get().OnScriptComponentClassChanged(this); } } void ScriptComponent::SetScriptClass(const std::string& assemblyName, const std::string& namespaceName, const std::string& className) { const bool hadScriptClass = HasScriptClass(); + const bool changed = + m_assemblyName != assemblyName || + m_namespaceName != namespaceName || + m_className != className; m_assemblyName = assemblyName; m_namespaceName = namespaceName; m_className = className; if (!hadScriptClass && HasScriptClass()) { ScriptEngine::Get().OnScriptComponentEnabled(this); + } else if (hadScriptClass && changed) { + ScriptEngine::Get().OnScriptComponentClassChanged(this); } } +void ScriptComponent::ClearScriptClass() { + SetScriptClass(m_assemblyName, std::string(), std::string()); +} + std::string ScriptComponent::GetFullClassName() const { if (m_className.empty()) { return std::string(); diff --git a/engine/src/Scripting/ScriptEngine.cpp b/engine/src/Scripting/ScriptEngine.cpp index 3df0c8d4..3cd18571 100644 --- a/engine/src/Scripting/ScriptEngine.cpp +++ b/engine/src/Scripting/ScriptEngine.cpp @@ -63,8 +63,19 @@ void ScriptEngine::SetRuntime(IScriptRuntime* runtime) { m_runtime = runtime ? runtime : &m_nullRuntime; } +void ScriptEngine::SetRuntimeFixedDeltaTime(float fixedDeltaTime) { + if (fixedDeltaTime > 0.0f) { + m_runtimeFixedDeltaTime = fixedDeltaTime; + return; + } + + m_runtimeFixedDeltaTime = DefaultFixedDeltaTime; +} + void ScriptEngine::OnRuntimeStart(Components::Scene* scene) { + const float configuredFixedDeltaTime = m_runtimeFixedDeltaTime; OnRuntimeStop(); + m_runtimeFixedDeltaTime = configuredFixedDeltaTime; if (!scene) { return; @@ -109,6 +120,7 @@ void ScriptEngine::OnRuntimeStop() { m_runtimeScene = nullptr; m_scriptStates.clear(); m_scriptOrder.clear(); + m_runtimeFixedDeltaTime = DefaultFixedDeltaTime; return; } @@ -125,6 +137,7 @@ void ScriptEngine::OnRuntimeStop() { m_scriptOrder.clear(); m_runtimeRunning = false; m_runtimeScene = nullptr; + m_runtimeFixedDeltaTime = DefaultFixedDeltaTime; m_runtime->OnRuntimeStop(stoppedScene); } @@ -239,6 +252,33 @@ void ScriptEngine::OnScriptComponentDestroyed(ScriptComponent* component) { StopTrackingScript(*state, false); } +void ScriptEngine::OnScriptComponentClassChanged(ScriptComponent* component) { + if (!component) { + return; + } + + if (!m_runtimeRunning) { + return; + } + + if (ScriptInstanceState* state = FindState(component)) { + StopTrackingScript(*state, false); + } + + if (!component->HasScriptClass()) { + return; + } + + ScriptInstanceState* state = TrackScriptComponent(component); + if (!state) { + return; + } + + if (ShouldScriptRun(*state)) { + EnsureScriptReady(*state, true); + } +} + bool ScriptEngine::HasTrackedScriptComponent(const ScriptComponent* component) const { return FindState(component) != nullptr; } @@ -248,6 +288,45 @@ bool ScriptEngine::HasRuntimeInstance(const ScriptComponent* component) const { return state && state->instanceCreated; } +bool ScriptEngine::TryGetAvailableScriptClasses( + std::vector& outClasses, + const std::string& assemblyName) const { + outClasses.clear(); + + std::vector runtimeClasses; + if (!m_runtime->TryGetAvailableScriptClasses(runtimeClasses)) { + return false; + } + + outClasses.reserve(runtimeClasses.size()); + for (const ScriptClassDescriptor& descriptor : runtimeClasses) { + if (!assemblyName.empty() && descriptor.assemblyName != assemblyName) { + continue; + } + + if (descriptor.className.empty()) { + continue; + } + + outClasses.push_back(descriptor); + } + + std::sort( + outClasses.begin(), + outClasses.end(), + [](const ScriptClassDescriptor& lhs, const ScriptClassDescriptor& rhs) { + if (lhs.assemblyName != rhs.assemblyName) { + return lhs.assemblyName < rhs.assemblyName; + } + if (lhs.namespaceName != rhs.namespaceName) { + return lhs.namespaceName < rhs.namespaceName; + } + return lhs.className < rhs.className; + }); + + return true; +} + bool ScriptEngine::TrySetScriptFieldValue( ScriptComponent* component, const std::string& fieldName, diff --git a/managed/CMakeLists.txt b/managed/CMakeLists.txt index d9b4ed88..16a2c99c 100644 --- a/managed/CMakeLists.txt +++ b/managed/CMakeLists.txt @@ -37,6 +37,31 @@ set(XCENGINE_MONO_MSCORLIB_PATH "${XCENGINE_MONO_CORLIB_DIR}/mscorlib.dll") set(XCENGINE_SCRIPT_CORE_DLL "${XCENGINE_MANAGED_OUTPUT_DIR}/XCEngine.ScriptCore.dll" CACHE FILEPATH "Generated XCEngine.ScriptCore assembly") set(XCENGINE_GAME_SCRIPTS_DLL "${XCENGINE_MANAGED_OUTPUT_DIR}/GameScripts.dll" CACHE FILEPATH "Generated GameScripts assembly") +set( + XCENGINE_PROJECT_ASSETS_DIR + "${CMAKE_SOURCE_DIR}/project/Assets" + CACHE PATH + "Project asset root scanned for user C# scripts") +set( + XCENGINE_PROJECT_MANAGED_OUTPUT_DIR + "${CMAKE_SOURCE_DIR}/project/Library/ScriptAssemblies" + CACHE PATH + "Output directory for project managed assemblies") +set( + XCENGINE_PROJECT_SCRIPT_CORE_DLL + "${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}/XCEngine.ScriptCore.dll" + CACHE FILEPATH + "Generated script core assembly copied into the project script assembly directory") +set( + XCENGINE_PROJECT_GAME_SCRIPTS_DLL + "${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}/GameScripts.dll" + CACHE FILEPATH + "Generated project game scripts assembly") +set( + XCENGINE_PROJECT_MONO_MSCORLIB_PATH + "${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}/mscorlib.dll" + CACHE FILEPATH + "Mono corlib copied into the project script assembly directory") foreach(XCENGINE_REQUIRED_PATH "${XCENGINE_CSC_DLL}" @@ -55,7 +80,9 @@ set(XCENGINE_SCRIPT_CORE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Component.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Debug.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/GameObject.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Input.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/InternalCalls.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/KeyCode.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Light.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/MeshFilter.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/MeshRenderer.cs @@ -76,15 +103,33 @@ set(XCENGINE_GAME_SCRIPT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/ScriptComponentApiProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/RuntimeGameObjectProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/HierarchyProbe.cs + ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/InputProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/LifecycleProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/MeshComponentProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/MeshRendererEdgeCaseProbe.cs + ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TickLogProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformConversionProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformMotionProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformOrientationProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformSpaceProbe.cs ) +file( + GLOB_RECURSE + XCENGINE_PROJECT_GAME_SCRIPT_SOURCES + CONFIGURE_DEPENDS + LIST_DIRECTORIES FALSE + "${XCENGINE_PROJECT_ASSETS_DIR}/*.cs") +list(SORT XCENGINE_PROJECT_GAME_SCRIPT_SOURCES) + +if(NOT XCENGINE_PROJECT_GAME_SCRIPT_SOURCES) + set(XCENGINE_PROJECT_SCRIPT_PLACEHOLDER "${CMAKE_CURRENT_BINARY_DIR}/Generated/EmptyProjectGameScripts.cs") + file(GENERATE + OUTPUT "${XCENGINE_PROJECT_SCRIPT_PLACEHOLDER}" + CONTENT "namespace XCEngine.Generated { public static class EmptyProjectGameScriptsMarker {} }\n") + set(XCENGINE_PROJECT_GAME_SCRIPT_SOURCES "${XCENGINE_PROJECT_SCRIPT_PLACEHOLDER}") +endif() + set(XCENGINE_MANAGED_FRAMEWORK_REFERENCES /reference:${XCENGINE_NET472_REFERENCE_DIR}/mscorlib.dll /reference:${XCENGINE_NET472_REFERENCE_DIR}/System.dll @@ -140,3 +185,47 @@ add_custom_target( ${XCENGINE_MANAGED_OUTPUT_DIR}/mscorlib.dll ) +add_custom_command( + OUTPUT ${XCENGINE_PROJECT_SCRIPT_CORE_DLL} + COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR} + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${XCENGINE_SCRIPT_CORE_DLL} + ${XCENGINE_PROJECT_SCRIPT_CORE_DLL} + DEPENDS ${XCENGINE_SCRIPT_CORE_DLL} + VERBATIM + COMMENT "Copying XCEngine.ScriptCore.dll into the project script assembly directory") + +add_custom_command( + OUTPUT ${XCENGINE_PROJECT_GAME_SCRIPTS_DLL} + COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR} + COMMAND ${XCENGINE_DOTNET_EXECUTABLE} ${XCENGINE_CSC_DLL} + /nologo + /target:library + /langversion:latest + /nostdlib+ + /out:${XCENGINE_PROJECT_GAME_SCRIPTS_DLL} + ${XCENGINE_MANAGED_FRAMEWORK_REFERENCES} + /reference:${XCENGINE_PROJECT_SCRIPT_CORE_DLL} + ${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES} + DEPENDS ${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES} ${XCENGINE_PROJECT_SCRIPT_CORE_DLL} + VERBATIM + COMMENT "Building project GameScripts.dll from project asset scripts") + +add_custom_command( + OUTPUT ${XCENGINE_PROJECT_MONO_MSCORLIB_PATH} + COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR} + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${XCENGINE_MONO_MSCORLIB_PATH} + ${XCENGINE_PROJECT_MONO_MSCORLIB_PATH} + DEPENDS ${XCENGINE_MONO_MSCORLIB_PATH} + VERBATIM + COMMENT "Copying mscorlib.dll into the project script assembly directory") + +add_custom_target( + xcengine_project_managed_assemblies ALL + DEPENDS + ${XCENGINE_PROJECT_SCRIPT_CORE_DLL} + ${XCENGINE_PROJECT_GAME_SCRIPTS_DLL} + ${XCENGINE_PROJECT_MONO_MSCORLIB_PATH} +) + diff --git a/managed/GameScripts/InputProbe.cs b/managed/GameScripts/InputProbe.cs new file mode 100644 index 00000000..50503f33 --- /dev/null +++ b/managed/GameScripts/InputProbe.cs @@ -0,0 +1,52 @@ +using XCEngine; + +namespace Gameplay +{ + public sealed class InputProbe : MonoBehaviour + { + public int UpdateCount; + public bool ObservedKeyA; + public bool ObservedKeyADown; + public bool ObservedKeyAUp; + public bool ObservedKeySpace; + public bool ObservedJump; + public bool ObservedJumpDown; + public bool ObservedJumpUp; + public bool ObservedFire1; + public bool ObservedFire1Down; + public bool ObservedFire1Up; + public bool ObservedAnyKey; + public bool ObservedAnyKeyDown; + public bool ObservedLeftMouse; + public bool ObservedLeftMouseDown; + public bool ObservedLeftMouseUp; + public float ObservedHorizontal; + public float ObservedHorizontalRaw; + public Vector3 ObservedMousePosition; + public Vector2 ObservedMouseScrollDelta; + + public void Update() + { + UpdateCount += 1; + ObservedKeyA = Input.GetKey(KeyCode.A); + ObservedKeyADown = Input.GetKeyDown(KeyCode.A); + ObservedKeyAUp = Input.GetKeyUp(KeyCode.A); + ObservedKeySpace = Input.GetKey(KeyCode.Space); + ObservedJump = Input.GetButton("Jump"); + ObservedJumpDown = Input.GetButtonDown("Jump"); + ObservedJumpUp = Input.GetButtonUp("Jump"); + ObservedFire1 = Input.GetButton("Fire1"); + ObservedFire1Down = Input.GetButtonDown("Fire1"); + ObservedFire1Up = Input.GetButtonUp("Fire1"); + ObservedAnyKey = Input.anyKey; + ObservedAnyKeyDown = Input.anyKeyDown; + ObservedLeftMouse = Input.GetMouseButton(0); + ObservedLeftMouseDown = Input.GetMouseButtonDown(0); + ObservedLeftMouseUp = Input.GetMouseButtonUp(0); + ObservedHorizontal = Input.GetAxis("Horizontal"); + ObservedHorizontalRaw = Input.GetAxisRaw("Horizontal"); + ObservedMousePosition = Input.mousePosition; + ObservedMouseScrollDelta = Input.mouseScrollDelta; + } + } +} diff --git a/managed/GameScripts/LifecycleProbe.cs b/managed/GameScripts/LifecycleProbe.cs index 0f0a59f1..c158ff3d 100644 --- a/managed/GameScripts/LifecycleProbe.cs +++ b/managed/GameScripts/LifecycleProbe.cs @@ -27,6 +27,8 @@ namespace Gameplay public float Speed; public float ObservedFixedDeltaTime; + public float ObservedConfiguredFixedDeltaTime; + public float ObservedConfiguredFixedDeltaTimeInUpdate; public float ObservedUpdateDeltaTime; public float ObservedLateDeltaTime; public string Label = string.Empty; @@ -103,6 +105,7 @@ namespace Gameplay { FixedUpdateCount += 1; ObservedFixedDeltaTime = Time.deltaTime; + ObservedConfiguredFixedDeltaTime = Time.fixedDeltaTime; } public void Update() @@ -110,6 +113,7 @@ namespace Gameplay UpdateCount += 1; Speed += 1.0f; ObservedUpdateDeltaTime = Time.deltaTime; + ObservedConfiguredFixedDeltaTimeInUpdate = Time.fixedDeltaTime; ObservedLocalPosition = transform.localPosition; Quaternion rotation = transform.localRotation; ObservedLocalRotation = new Vector4(rotation.x, rotation.y, rotation.z, rotation.w); diff --git a/managed/GameScripts/TickLogProbe.cs b/managed/GameScripts/TickLogProbe.cs new file mode 100644 index 00000000..acbf4138 --- /dev/null +++ b/managed/GameScripts/TickLogProbe.cs @@ -0,0 +1,48 @@ +using XCEngine; + +namespace Gameplay +{ + public sealed class TickLogProbe : MonoBehaviour + { + public int FixedUpdateCount; + public int UpdateCount; + public int LateUpdateCount; + + public void Awake() + { + Debug.Log("[TickLogProbe] Awake"); + } + + public void Start() + { + Debug.Log("[TickLogProbe] Start"); + } + + public void FixedUpdate() + { + FixedUpdateCount += 1; + if (FixedUpdateCount <= 3) + { + Debug.Log("[TickLogProbe] FixedUpdate " + FixedUpdateCount); + } + } + + public void Update() + { + UpdateCount += 1; + if (UpdateCount <= 3) + { + Debug.Log("[TickLogProbe] Update " + UpdateCount); + } + } + + public void LateUpdate() + { + LateUpdateCount += 1; + if (LateUpdateCount <= 3) + { + Debug.Log("[TickLogProbe] LateUpdate " + LateUpdateCount); + } + } + } +} diff --git a/managed/XCEngine.ScriptCore/Input.cs b/managed/XCEngine.ScriptCore/Input.cs new file mode 100644 index 00000000..737bf145 --- /dev/null +++ b/managed/XCEngine.ScriptCore/Input.cs @@ -0,0 +1,94 @@ +namespace XCEngine +{ + public static class Input + { + public static bool GetKey(KeyCode key) + { + return InternalCalls.Input_GetKey((int)key); + } + + public static bool GetKeyDown(KeyCode key) + { + return InternalCalls.Input_GetKeyDown((int)key); + } + + public static bool GetKeyUp(KeyCode key) + { + return InternalCalls.Input_GetKeyUp((int)key); + } + + public static bool GetMouseButton(int button) + { + return InternalCalls.Input_GetMouseButton(button); + } + + public static bool GetMouseButtonDown(int button) + { + return InternalCalls.Input_GetMouseButtonDown(button); + } + + public static bool GetMouseButtonUp(int button) + { + return InternalCalls.Input_GetMouseButtonUp(button); + } + + public static bool GetButton(string buttonName) + { + return InternalCalls.Input_GetButton(buttonName); + } + + public static bool GetButtonDown(string buttonName) + { + return InternalCalls.Input_GetButtonDown(buttonName); + } + + public static bool GetButtonUp(string buttonName) + { + return InternalCalls.Input_GetButtonUp(buttonName); + } + + public static float GetAxis(string axisName) + { + return InternalCalls.Input_GetAxis(axisName); + } + + public static float GetAxisRaw(string axisName) + { + return InternalCalls.Input_GetAxisRaw(axisName); + } + + public static bool anyKey + { + get + { + return InternalCalls.Input_GetAnyKey(); + } + } + + public static bool anyKeyDown + { + get + { + return InternalCalls.Input_GetAnyKeyDown(); + } + } + + public static Vector3 mousePosition + { + get + { + InternalCalls.Input_GetMousePosition(out Vector3 position); + return position; + } + } + + public static Vector2 mouseScrollDelta + { + get + { + InternalCalls.Input_GetMouseScrollDelta(out Vector2 delta); + return delta; + } + } + } +} diff --git a/managed/XCEngine.ScriptCore/InternalCalls.cs b/managed/XCEngine.ScriptCore/InternalCalls.cs index 9f44eab1..112e602a 100644 --- a/managed/XCEngine.ScriptCore/InternalCalls.cs +++ b/managed/XCEngine.ScriptCore/InternalCalls.cs @@ -17,6 +17,54 @@ namespace XCEngine [MethodImpl(MethodImplOptions.InternalCall)] internal static extern float Time_GetDeltaTime(); + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern float Time_GetFixedDeltaTime(); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetKey(int keyCode); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetKeyDown(int keyCode); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetKeyUp(int keyCode); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetMouseButton(int button); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetMouseButtonDown(int button); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetMouseButtonUp(int button); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetButton(string buttonName); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetButtonDown(string buttonName); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetButtonUp(string buttonName); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern float Input_GetAxis(string axisName); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern float Input_GetAxisRaw(string axisName); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetAnyKey(); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Input_GetAnyKeyDown(); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Input_GetMousePosition(out Vector3 position); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Input_GetMouseScrollDelta(out Vector2 delta); + [MethodImpl(MethodImplOptions.InternalCall)] internal static extern string GameObject_GetName(ulong gameObjectUUID); diff --git a/managed/XCEngine.ScriptCore/KeyCode.cs b/managed/XCEngine.ScriptCore/KeyCode.cs new file mode 100644 index 00000000..c4ffea73 --- /dev/null +++ b/managed/XCEngine.ScriptCore/KeyCode.cs @@ -0,0 +1,93 @@ +namespace XCEngine +{ + public enum KeyCode + { + None = 0, + + A = 4, + B = 5, + C = 6, + D = 7, + E = 8, + F = 9, + G = 10, + H = 11, + I = 12, + J = 13, + K = 14, + L = 15, + M = 16, + N = 17, + O = 18, + P = 19, + Q = 20, + R = 21, + S = 22, + T = 23, + U = 24, + V = 25, + W = 26, + X = 27, + Y = 28, + Z = 29, + + F1 = 58, + F2 = 59, + F3 = 60, + F4 = 61, + F5 = 62, + F6 = 63, + F7 = 64, + F8 = 65, + F9 = 66, + F10 = 67, + F11 = 68, + F12 = 69, + + Space = 49, + Tab = 48, + Return = 36, + Escape = 53, + LeftShift = 56, + RightShift = 60, + LeftControl = 59, + RightControl = 62, + LeftAlt = 58, + RightAlt = 61, + + UpArrow = 126, + DownArrow = 125, + LeftArrow = 123, + RightArrow = 124, + + Home = 115, + End = 119, + PageUp = 116, + PageDown = 121, + Delete = 51, + Backspace = 51, + + Alpha0 = 39, + Alpha1 = 30, + Alpha2 = 31, + Alpha3 = 32, + Alpha4 = 33, + Alpha5 = 34, + Alpha6 = 35, + Alpha7 = 37, + Alpha8 = 38, + Alpha9 = 40, + + Minus = 43, + Equals = 46, + LeftBracket = 47, + RightBracket = 54, + Semicolon = 42, + Quote = 40, + Comma = 54, + Period = 55, + Slash = 44, + Backslash = 45, + BackQuote = 41 + } +} diff --git a/managed/XCEngine.ScriptCore/Time.cs b/managed/XCEngine.ScriptCore/Time.cs index bca31a47..ea95fd20 100644 --- a/managed/XCEngine.ScriptCore/Time.cs +++ b/managed/XCEngine.ScriptCore/Time.cs @@ -3,5 +3,6 @@ namespace XCEngine public static class Time { public static float deltaTime => InternalCalls.Time_GetDeltaTime(); + public static float fixedDeltaTime => InternalCalls.Time_GetFixedDeltaTime(); } } diff --git a/tests/Components/test_mesh_render_components.cpp b/tests/Components/test_mesh_render_components.cpp index de4e4663..37d39f11 100644 --- a/tests/Components/test_mesh_render_components.cpp +++ b/tests/Components/test_mesh_render_components.cpp @@ -111,17 +111,34 @@ TEST(MeshFilterComponent_Test, SerializeAndDeserializePreservesPath) { std::stringstream stream; source.Serialize(stream); + const std::string serialized = stream.str(); + EXPECT_NE(serialized.find("meshRef="), std::string::npos); + EXPECT_NE(serialized.find("meshPath=Meshes/serialized.mesh;"), std::string::npos); + EXPECT_EQ(serialized.find("mesh=Meshes/serialized.mesh;"), std::string::npos); MeshFilterComponent target; - target.Deserialize(stream); + std::stringstream deserializeStream(serialized); + target.Deserialize(deserializeStream); EXPECT_EQ(target.GetMeshPath(), "Meshes/serialized.mesh"); EXPECT_EQ(target.GetMesh(), nullptr); + EXPECT_FALSE(target.GetMeshAssetRef().IsValid()); source.ClearMesh(); delete mesh; } +TEST(MeshFilterComponent_Test, DeserializeSupportsLegacyMeshKey) { + MeshFilterComponent target; + + std::stringstream stream("mesh=Meshes/legacy.mesh;meshRef=;"); + target.Deserialize(stream); + + EXPECT_EQ(target.GetMeshPath(), "Meshes/legacy.mesh"); + EXPECT_EQ(target.GetMesh(), nullptr); + EXPECT_FALSE(target.GetMeshAssetRef().IsValid()); +} + TEST(MeshFilterComponent_Test, SetMeshPathPreservesPathWithoutLoadedResource) { MeshFilterComponent component; @@ -144,15 +161,17 @@ TEST(MeshFilterComponent_Test, DeferredSceneDeserializeLoadsMeshAsyncByPath) { manager.RegisterLoader(&fakeLoader); MeshFilterComponent target; + const auto pendingBeforeDeserialize = manager.GetAsyncPendingCount(); { ResourceManager::ScopedDeferredSceneLoad deferredLoadScope; EXPECT_TRUE(manager.IsDeferredSceneLoadEnabled()); std::stringstream stream("mesh=Meshes/async.mesh;meshRef=;"); target.Deserialize(stream); - EXPECT_GT(manager.GetAsyncPendingCount(), 0u); } EXPECT_EQ(target.GetMeshPath(), "Meshes/async.mesh"); + EXPECT_EQ(target.GetMesh(), nullptr); + EXPECT_GT(manager.GetAsyncPendingCount(), pendingBeforeDeserialize); ASSERT_TRUE(PumpAsyncLoadsUntilIdle(manager)); ASSERT_NE(target.GetMesh(), nullptr); EXPECT_EQ(target.GetMeshPath(), "Meshes/async.mesh"); @@ -200,9 +219,16 @@ TEST(MeshRendererComponent_Test, SerializeAndDeserializePreservesMaterialPathsAn std::stringstream stream; source.Serialize(stream); + const std::string serialized = stream.str(); + EXPECT_NE( + serialized.find("materialPaths=Materials/serialized0.mat|Materials/serialized1.mat;"), + std::string::npos); + EXPECT_NE(serialized.find("materialRefs=|;"), std::string::npos); + EXPECT_EQ(serialized.find("materials="), std::string::npos); MeshRendererComponent target; - target.Deserialize(stream); + std::stringstream deserializeStream(serialized); + target.Deserialize(deserializeStream); ASSERT_EQ(target.GetMaterialCount(), 2u); EXPECT_EQ(target.GetMaterial(0), nullptr); @@ -229,9 +255,14 @@ TEST(MeshRendererComponent_Test, SerializeAndDeserializePreservesTrailingEmptyMa std::stringstream stream; source.Serialize(stream); + const std::string serialized = stream.str(); + EXPECT_NE(serialized.find("materialPaths=Materials/serialized0.mat|;"), std::string::npos); + EXPECT_NE(serialized.find("materialRefs=|;"), std::string::npos); + EXPECT_EQ(serialized.find("materials="), std::string::npos); MeshRendererComponent target; - target.Deserialize(stream); + std::stringstream deserializeStream(serialized); + target.Deserialize(deserializeStream); ASSERT_EQ(target.GetMaterialCount(), 2u); EXPECT_EQ(target.GetMaterial(0), nullptr); @@ -262,6 +293,23 @@ TEST(MeshRendererComponent_Test, SetMaterialPathPreservesPathWithoutLoadedResour EXPECT_EQ(component.GetMaterial(1), nullptr); } +TEST(MeshRendererComponent_Test, DeserializeSupportsLegacyMaterialsKey) { + MeshRendererComponent target; + + std::stringstream stream( + "materials=Materials/legacy0.mat|;materialRefs=|;castShadows=0;receiveShadows=1;renderLayer=5;"); + target.Deserialize(stream); + + ASSERT_EQ(target.GetMaterialCount(), 2u); + EXPECT_EQ(target.GetMaterialPath(0), "Materials/legacy0.mat"); + EXPECT_EQ(target.GetMaterialPath(1), ""); + EXPECT_EQ(target.GetMaterial(0), nullptr); + EXPECT_EQ(target.GetMaterial(1), nullptr); + EXPECT_FALSE(target.GetCastShadows()); + EXPECT_TRUE(target.GetReceiveShadows()); + EXPECT_EQ(target.GetRenderLayer(), 5u); +} + TEST(MeshRendererComponent_Test, SerializeAndDeserializeLoadsProjectMaterialByAssetRef) { namespace fs = std::filesystem; @@ -300,8 +348,10 @@ TEST(MeshRendererComponent_Test, SerializeAndDeserializeLoadsProjectMaterialByAs std::stringstream stream; source.Serialize(stream); const std::string serialized = stream.str(); + EXPECT_NE(serialized.find("materialPaths=;"), std::string::npos); EXPECT_NE(serialized.find("materialRefs="), std::string::npos); EXPECT_EQ(serialized.find("materialRefs=;"), std::string::npos); + EXPECT_EQ(serialized.find("materials="), std::string::npos); std::stringstream deserializeStream(serialized); MeshRendererComponent target; @@ -350,16 +400,19 @@ TEST(MeshRendererComponent_Test, DeferredSceneDeserializeLoadsProjectMaterialAsy source.Serialize(serializedStream); MeshRendererComponent target; + const auto pendingBeforeDeserialize = manager.GetAsyncPendingCount(); { ResourceManager::ScopedDeferredSceneLoad deferredLoadScope; EXPECT_TRUE(manager.IsDeferredSceneLoadEnabled()); std::stringstream deserializeStream(serializedStream.str()); target.Deserialize(deserializeStream); - EXPECT_GT(manager.GetAsyncPendingCount(), 0u); + EXPECT_EQ(manager.GetAsyncPendingCount(), pendingBeforeDeserialize); } ASSERT_EQ(target.GetMaterialCount(), 1u); EXPECT_EQ(target.GetMaterialPath(0), "Assets/runtime.material"); + EXPECT_EQ(target.GetMaterial(0), nullptr); + EXPECT_GT(manager.GetAsyncPendingCount(), pendingBeforeDeserialize); ASSERT_TRUE(PumpAsyncLoadsUntilIdle(manager)); ASSERT_NE(target.GetMaterial(0), nullptr); diff --git a/tests/Input/test_input_manager.cpp b/tests/Input/test_input_manager.cpp index 15ff9c19..d307706b 100644 --- a/tests/Input/test_input_manager.cpp +++ b/tests/Input/test_input_manager.cpp @@ -285,6 +285,47 @@ TEST(InputManager, GetButtonUp) { mgr.Shutdown(); } +TEST(InputManager, AnyKeyIncludesKeyboardAndMouseButtons) { + InputManager& mgr = InputManager::Get(); + mgr.Initialize(nullptr); + + EXPECT_FALSE(mgr.IsAnyKeyDown()); + + mgr.ProcessKeyDown(KeyCode::A, false, false, false, false, false); + EXPECT_TRUE(mgr.IsAnyKeyDown()); + + mgr.ProcessKeyUp(KeyCode::A, false, false, false, false); + EXPECT_FALSE(mgr.IsAnyKeyDown()); + + mgr.ProcessMouseButton(MouseButton::Left, true, 100, 200); + EXPECT_TRUE(mgr.IsAnyKeyDown()); + + mgr.ProcessMouseButton(MouseButton::Left, false, 100, 200); + EXPECT_FALSE(mgr.IsAnyKeyDown()); + + mgr.Shutdown(); +} + +TEST(InputManager, AnyKeyPressedIsFrameScoped) { + InputManager& mgr = InputManager::Get(); + mgr.Initialize(nullptr); + + EXPECT_FALSE(mgr.IsAnyKeyPressed()); + + mgr.ProcessMouseButton(MouseButton::Left, true, 100, 200); + EXPECT_TRUE(mgr.IsAnyKeyPressed()); + + mgr.Update(0.016f); + EXPECT_FALSE(mgr.IsAnyKeyPressed()); + EXPECT_TRUE(mgr.IsAnyKeyDown()); + + mgr.ProcessMouseButton(MouseButton::Left, false, 100, 200); + EXPECT_FALSE(mgr.IsAnyKeyPressed()); + EXPECT_FALSE(mgr.IsAnyKeyDown()); + + mgr.Shutdown(); +} + TEST(InputManager, RegisterAxis) { InputManager& mgr = InputManager::Get(); mgr.Initialize(nullptr); @@ -320,7 +361,7 @@ TEST(InputManager, GetAxisRaw) { EXPECT_EQ(mgr.GetAxisRaw("RawTest"), 1.0f); mgr.Update(0.016f); - EXPECT_EQ(mgr.GetAxisRaw("RawTest"), 0.0f); + EXPECT_EQ(mgr.GetAxisRaw("RawTest"), 1.0f); mgr.Shutdown(); } diff --git a/tests/Scene/test_scene.cpp b/tests/Scene/test_scene.cpp index 332811bd..304133ef 100644 --- a/tests/Scene/test_scene.cpp +++ b/tests/Scene/test_scene.cpp @@ -1030,12 +1030,18 @@ TEST(Scene_ProjectSample, DeferredLoadBackpackSceneEventuallyProducesVisibleRend loadedScene.Load(backpackScenePath.string()); } - ASSERT_TRUE(PumpAsyncLoadsUntilIdle(resourceManager, std::chrono::milliseconds(10000))); - const std::vector backpackObjects = FindGameObjectsByMeshPath(loadedScene, "Assets/Models/backpack/backpack.obj"); ASSERT_EQ(backpackObjects.size(), 2u); + XCEngine::Rendering::RenderSceneExtractor extractor; + const XCEngine::Rendering::RenderSceneData initialRenderScene = + extractor.Extract(loadedScene, nullptr, 1280u, 720u); + + ASSERT_TRUE(initialRenderScene.HasCamera()); + EXPECT_GT(resourceManager.GetAsyncPendingCount(), 0u); + ASSERT_TRUE(PumpAsyncLoadsUntilIdle(resourceManager, std::chrono::milliseconds(10000))); + std::vector backpackMeshFilters; for (GameObject* backpackObject : backpackObjects) { ASSERT_NE(backpackObject, nullptr); @@ -1045,7 +1051,6 @@ TEST(Scene_ProjectSample, DeferredLoadBackpackSceneEventuallyProducesVisibleRend backpackMeshFilters.push_back(meshFilter); } - XCEngine::Rendering::RenderSceneExtractor extractor; const XCEngine::Rendering::RenderSceneData renderScene = extractor.Extract(loadedScene, nullptr, 1280u, 720u); diff --git a/tests/Scene/test_scene_runtime.cpp b/tests/Scene/test_scene_runtime.cpp index 15a1790e..1198df9b 100644 --- a/tests/Scene/test_scene_runtime.cpp +++ b/tests/Scene/test_scene_runtime.cpp @@ -85,6 +85,12 @@ public: } } + bool TryGetAvailableScriptClasses( + std::vector& outClasses) const override { + outClasses.clear(); + return false; + } + bool TryGetClassFieldMetadata( const std::string& assemblyName, const std::string& namespaceName, diff --git a/tests/TEST_SPEC.md b/tests/TEST_SPEC.md index e7173001..237a379c 100644 --- a/tests/TEST_SPEC.md +++ b/tests/TEST_SPEC.md @@ -1,43 +1,61 @@ # XCEngine 测试规范 -最后更新:2026-03-27 +最后更新:`2026-04-02` ## 1. 目标 -本文档只描述当前仓库里已经存在、已经生效、并且应当长期维护的测试规范。 +本文档描述当前仓库里已经落地、已经生效、并且应当长期维护的测试基线。 重点覆盖: -- `tests/` 的整体组织方式 -- CMake / CTest 的推荐使用方式 -- RHI 模块测试的分层边界 -- RHI 抽象层集成测试的当前约束 +- `tests/` 的真实目录结构 +- 当前 CMake / CTest 入口 +- RHI 测试分层边界 +- Rendering / Editor / Scripting 相关聚合 target -如果目录结构、target 名称、后端覆盖范围或 GT 图规则发生变化,必须同步更新本文档。 +如果目录结构、target 名称、场景覆盖范围或回归入口变化,必须同步更新本文档。 ## 2. 顶层结构 -`tests/CMakeLists.txt` 当前纳入的主要测试模块如下: +`tests/CMakeLists.txt` 当前纳入的主模块如下: ```text tests/ -├─ math/ -├─ core/ -├─ containers/ -├─ memory/ -├─ threading/ -├─ debug/ -├─ components/ -├─ scene/ +├─ Components/ +├─ Core/ +│ ├─ Asset/ +│ ├─ Containers/ +│ ├─ IO/ +│ └─ Math/ +├─ Debug/ +├─ Editor/ +├─ Fixtures/ +├─ Input/ +├─ Memory/ +├─ Rendering/ +│ ├─ integration/ +│ └─ unit/ +├─ Resources/ +│ ├─ AudioClip/ +│ ├─ Material/ +│ ├─ Mesh/ +│ ├─ Shader/ +│ └─ Texture/ ├─ RHI/ -├─ resources/ -└─ input/ +│ ├─ D3D12/ +│ ├─ integration/ +│ ├─ OpenGL/ +│ ├─ unit/ +│ └─ Vulkan/ +├─ Scene/ +├─ Scripting/ +└─ Threading/ ``` 说明: -- 新增测试模块时,必须同时补充对应目录下的 `CMakeLists.txt`,并在 `tests/CMakeLists.txt` 中注册。 -- 测试目录命名、target 命名、文档命名必须和实际仓库状态一致,不保留“计划中但未落地”的旧说明。 +- 新增测试模块时,必须同时补对应目录下的 `CMakeLists.txt`,并在 `tests/CMakeLists.txt` 注册。 +- 目录名、target 名、文档说明必须与当前 checkout 一致,不保留“计划中但未落地”的旧描述。 ## 3. 基本构建方式 @@ -46,113 +64,111 @@ tests/ ### 3.1 配置 ```bash -cmake -S . -B build +cmake -S . -B build -A x64 ``` -以下场景需要重新配置: +如果当前任务不需要 Mono: + +```bash +cmake -S . -B build -A x64 -DXCENGINE_ENABLE_MONO_SCRIPTING=OFF +``` + +以下情况需要重新配置: - 新增或删除源文件 - 修改任意 `CMakeLists.txt` -- 修改 target、依赖、编译定义或测试发现方式 +- 修改 target、依赖、编译定义、测试发现方式 -### 3.2 增量构建 +### 3.2 通用入口 ```bash cmake --build build --config Debug -``` - -常用 RHI 聚合 target: - -```bash -cmake --build build --config Debug --target rhi_abstraction_tests -cmake --build build --config Debug --target rhi_backend_tests -cmake --build build --config Debug --target rhi_all_tests -``` - -常用单项 target: - -```bash -cmake --build build --config Debug --target rhi_unit_tests -cmake --build build --config Debug --target rhi_integration_minimal -cmake --build build --config Debug --target rhi_integration_triangle -cmake --build build --config Debug --target rhi_integration_quad -cmake --build build --config Debug --target rhi_integration_sphere -cmake --build build --config Debug --target rhi_integration_backpack -``` - -### 3.3 运行 - -列出测试: - -```bash ctest --test-dir build -N -C Debug -``` - -运行全部测试: - -```bash ctest --test-dir build -C Debug --output-on-failure ``` -直接运行 gtest 可执行文件也是合法入口。例如: +## 4. 当前主要 target -```bash -build\tests\RHI\unit\Debug\rhi_unit_tests.exe --gtest_brief=1 -build\tests\RHI\integration\triangle\Debug\rhi_integration_triangle.exe --gtest_filter=Vulkan/TriangleTest.RenderTriangle/0 -build\tests\RHI\integration\backpack\Debug\rhi_integration_backpack.exe --gtest_filter=D3D12/BackpackTest.RenderBackpack/0 -``` +### 4.1 Engine 基础模块 -## 4. RHI 测试分层 +| 模块 | target | +| --- | --- | +| Core | `core_tests` | +| Core/Asset | `asset_tests` | +| Core/Containers | `containers_tests` | +| Core/IO | `io_tests` | +| Core/Math | `math_tests` | +| Memory | `memory_tests` | +| Threading | `threading_tests` | +| Debug | `debug_tests` | +| Components | `components_tests` | +| Scene | `scene_tests` | +| Input | `input_tests` | -RHI 当前分为四层测试: +### 4.2 Resources -| 层级 | 目录 / target | 目标 | -| --- | --- | --- | -| 抽象层单元测试 | `tests/RHI/unit/` / `rhi_unit_tests` | 验证公共 RHI 接口在 `D3D12 / OpenGL / Vulkan` 上的统一语义 | -| 抽象层集成测试 | `tests/RHI/integration/` / `rhi_integration_*` | 用同一套 RHI 抽象代码驱动三后端完成真实渲染并做 GT 图比对 | -| D3D12 后端测试 | `tests/RHI/D3D12/` | 验证 D3D12 封装本身 | -| OpenGL 后端测试 | `tests/RHI/OpenGL/` | 验证 OpenGL 封装本身 | -| Vulkan 后端测试 | `tests/RHI/Vulkan/` | 验证 Vulkan 封装本身 | +| 模块 | target | +| --- | --- | +| AudioClip | `audioclip_tests` | +| Material | `material_tests` | +| Mesh | `mesh_tests` | +| Shader | `shader_tests` | +| Texture | `texture_tests` | + +这些测试当前不只是验证简单 loader,还会覆盖: + +- `AssetDatabase` +- `.meta` +- `Library/SourceAssetDB` +- `Library/ArtifactDB` +- artifact 重导入逻辑 + +### 4.3 Editor / Scripting + +| 模块 | target | +| --- | --- | +| Editor | `editor_tests` | +| Scripting | `scripting_tests` | 补充说明: -- Vulkan 现在已经拥有独立的 `tests/RHI/Vulkan/` 子树。 -- `tests/RHI/unit/` 继续只保留三后端参数化的抽象层统一语义测试。 -- Vulkan 专属断言、原生句柄检查与直接依赖 Vulkan API 的测试,统一收敛到 `tests/RHI/Vulkan/unit/`。 -- Vulkan 现在已经建立独立的后端 integration 子树,当前已覆盖 `tests/RHI/Vulkan/integration/minimal/`、`triangle/`、`quad/`、`sphere/`。 -- Vulkan 后端后续仍可继续补更复杂的 backend integration,但不应再回流到 abstraction suite。 +- `editor_tests` 当前覆盖 action routing、play session、viewport camera controller、picker、move/rotate/scale gizmo、overlay renderer、script component editor utils 等。 +- `scripting_tests` 在启用 Mono 时会补入 `test_mono_script_runtime.cpp`。 +- 如果存在 `xcengine_project_managed_assemblies` target,`scripting_tests` 还会补入项目脚本程序集相关测试。 -设计边界: - -- `tests/RHI/unit/` 与 `tests/RHI/integration/` 只能依赖公共 RHI 抽象接口。 -- 后端私有头文件、原生句柄、后端专用 helper,只允许出现在对应后端目录。 -- 如果抽象层测试为了通过而被迫引入后端 API,优先修 RHI 本身,而不是给测试开后门。 - -## 5. 当前 RHI Target - -### 5.1 抽象层 +### 4.4 Rendering | 类别 | target | | --- | --- | -| 抽象层单元测试 | `rhi_unit_tests` | -| 抽象层集成测试 | `rhi_integration_minimal` | -| 抽象层集成测试 | `rhi_integration_triangle` | -| 抽象层集成测试 | `rhi_integration_quad` | -| 抽象层集成测试 | `rhi_integration_sphere` | -| 抽象层集成测试 | `rhi_integration_backpack` | +| 单元测试 | `rendering_unit_tests` | +| 单测聚合 | `rendering_unit_test_targets` | +| 集成聚合 | `rendering_integration_tests` | +| 全量聚合 | `rendering_all_tests` | +| 阶段回归 | `rendering_phase_regression` | -### 5.2 后端专用 +当前 rendering integration targets: -| 类别 | target | -| --- | --- | -| D3D12 后端单元测试 | `rhi_d3d12_tests` | -| OpenGL 后端单元测试 | `rhi_opengl_tests` | -| Vulkan 后端单元测试 | `rhi_vulkan_tests` | -| D3D12 后端集成测试 | `d3d12_minimal_test` `d3d12_triangle_test` `d3d12_quad_test` `d3d12_sphere_test` | -| OpenGL 后端集成测试 | `opengl_minimal_test` `opengl_triangle_test` `opengl_quad_test` `opengl_sphere_test` | -| Vulkan 后端集成测试 | `vulkan_minimal_test` `vulkan_triangle_test` `vulkan_quad_test` `vulkan_sphere_test` | +- `rendering_integration_textured_quad_scene` +- `rendering_integration_backpack_scene` +- `rendering_integration_backpack_lit_scene` +- `rendering_integration_camera_stack_scene` +- `rendering_integration_transparent_material_scene` +- `rendering_integration_cull_material_scene` +- `rendering_integration_depth_sort_scene` +- `rendering_integration_material_state_scene` +- `rendering_integration_offscreen_scene` -### 5.3 聚合 target +`rendering_phase_regression` 当前是 Windows 下的 PowerShell 回归入口,依赖: + +- `rendering_all_tests` +- `editor_tests` +- `XCEditor` + +并执行: + +- `scripts/Run-RendererPhaseRegression.ps1` + +### 4.5 RHI | 类别 | target | | --- | --- | @@ -165,6 +181,53 @@ RHI 当前分为四层测试: | 后端总聚合 | `rhi_backend_tests` | | RHI 全量聚合 | `rhi_all_tests` | +抽象层单项 target: + +- `rhi_unit_tests` +- `rhi_integration_minimal` +- `rhi_integration_triangle` +- `rhi_integration_quad` +- `rhi_integration_sphere` +- `rhi_integration_backpack` + +后端单元测试 target: + +- `rhi_d3d12_tests` +- `rhi_opengl_tests` +- `rhi_vulkan_tests` + +后端集成测试 target: + +- `d3d12_minimal_test` +- `d3d12_triangle_test` +- `d3d12_quad_test` +- `d3d12_sphere_test` +- `opengl_minimal_test` +- `opengl_triangle_test` +- `opengl_quad_test` +- `opengl_sphere_test` +- `vulkan_minimal_test` +- `vulkan_triangle_test` +- `vulkan_quad_test` +- `vulkan_sphere_test` + +## 5. RHI 测试分层 + +RHI 当前分为五块: + +- `tests/RHI/unit/` +- `tests/RHI/integration/` +- `tests/RHI/D3D12/` +- `tests/RHI/OpenGL/` +- `tests/RHI/Vulkan/` + +边界规则: + +- `tests/RHI/unit/` 与 `tests/RHI/integration/` 只能依赖公共 RHI 抽象接口。 +- 后端私有头文件、原生句柄、后端专用 helper,只允许出现在对应后端目录。 +- 如果抽象层测试为了通过而被迫引入后端 API,优先修 RHI,而不是给测试开后门。 +- Vulkan 专属断言、原生句柄检查与直接依赖 Vulkan API 的测试,应继续收敛在 `tests/RHI/Vulkan/` 子树。 + ## 6. RHI 抽象层集成测试规范 ### 6.1 当前目录 @@ -208,24 +271,10 @@ tests/RHI/integration/ - `minimal_vulkan.ppm` 5. 所有后端都必须与同一张 `GT.ppm` 做比对。 6. 新场景如果暴露抽象层缺口,应先补 RHI,再补测试。 -7. `sphere` 必须继续保留对 `firstSet != 0` 绑定路径的覆盖,避免“忽略 set 语义也误通过”的假阳性。 -8. `backpack` 是当前抽象层最接近真实资源渲染的场景,后续新增复杂渲染场景时不应削弱它的回归价值。 +7. `sphere` 必须继续保留对 `firstSet != 0` 绑定路径的覆盖。 +8. `backpack` 作为最接近真实资源路径的抽象层场景,不应随意削弱。 -### 6.4 CMake 约束 - -每个抽象层集成测试目录都应: - -- 使用独立 target -- 复用 `fixtures/RHIIntegrationFixture.cpp` -- 链接 `XCEngine`、`GTest::gtest` -- 在需要时按后端条件加入对应系统库 -- 在 `POST_BUILD` 中复制: - - `compare_ppm.py` - - 当前场景的 `GT.ppm` - - 运行所需的资源文件 -- 使用 `gtest_discover_tests(...)` - -### 6.5 推荐验证方式 +### 6.4 推荐验证方式 ```bash cmake --build build --config Debug --target rhi_abstraction_integration_tests @@ -242,23 +291,21 @@ build\tests\RHI\integration\backpack\Debug\rhi_integration_backpack.exe --gtest_ - 截图成功 - 与当前场景 `GT.ppm` 比对通过 -## 7. 当前体系的完成度与后续方向 +## 7. 推荐的验证策略 -当前状态可以认为是“高完成度、可作为正式基线”,但不是“完全封顶”。 +按改动类型选择最小有效验证: -已经完成: +- 改 `engine/RHI`:先跑 `rhi_abstraction_tests` 或 `rhi_backend_tests` +- 改 `engine/Rendering`:先跑 `rendering_unit_tests` 和最相关的 `rendering_integration_*` +- 改 `editor/Viewport`:先跑 `editor_tests`,必要时再跑 `rendering_phase_regression` +- 改脚本运行时 / managed / 项目脚本程序集:先构建 `xcengine_project_managed_assemblies`,再跑 `scripting_tests` +- 改资源导入 / `.meta` / artifact:优先跑对应 `Resources/*` tests -- 抽象层单测正式纳入 `D3D12 / OpenGL / Vulkan` -- 抽象层集成测试已经具备 5 个真实渲染场景 -- GT 图回归链路已经稳定工作 -- D3D12 与 OpenGL 仍保留独立后端测试树 +在这些最小验证通过后,再决定是否扩展到: -仍需继续完善: - -- 继续补更工程化的 Vulkan 后端 integration 场景覆盖 -- 把仍然合理存在的后端专属断言与 skip 场景继续收敛 -- 补充 `resize / swapchain 重建 / 长时间 soak / 多线程录制 / validation layer 负例` 等更工程化的测试 -- 保持文档、CMake target 与实际测试状态同步 +```bash +ctest --test-dir build -C Debug --output-on-failure +``` ## 8. 文档维护要求 @@ -266,9 +313,9 @@ build\tests\RHI\integration\backpack\Debug\rhi_integration_backpack.exe --gtest_ - 测试目录结构变化 - 新增或删除测试 target -- 抽象层集成测试场景变化 -- GT 图管理规则变化 -- CMake 聚合入口变化 -- 后端覆盖范围变化 +- rendering integration 场景变化 +- RHI 抽象层 GT 图规则变化 +- PowerShell 回归入口变化 +- 项目脚本程序集参与测试的方式变化 禁止继续保留和当前仓库状态不一致的旧说明。 diff --git a/tests/core/Asset/test_resource_manager.cpp b/tests/core/Asset/test_resource_manager.cpp index b5e30e4d..4157950d 100644 --- a/tests/core/Asset/test_resource_manager.cpp +++ b/tests/core/Asset/test_resource_manager.cpp @@ -1,5 +1,7 @@ #include +#include +#include #include #include #include @@ -7,6 +9,8 @@ #include #include #include +#include +#include #include #include #include @@ -155,4 +159,77 @@ TEST(ResourceManager_Test, ConcurrentAsyncLoadsCoalesceSameMeshPath) { manager.Shutdown(); } +TEST(ResourceManager_Test, AssetLookupFallbackRefreshesSnapshotForNewProjectAsset) { + namespace fs = std::filesystem; + + ResourceManager& manager = ResourceManager::Get(); + manager.Initialize(); + + const fs::path projectRoot = fs::temp_directory_path() / "xc_resource_manager_asset_lookup_test"; + const fs::path assetsDir = projectRoot / "Assets"; + const fs::path materialPath = assetsDir / "runtime.material"; + + fs::remove_all(projectRoot); + fs::create_directories(assetsDir); + manager.SetResourceRoot(projectRoot.string().c_str()); + + { + std::ofstream materialFile(materialPath); + ASSERT_TRUE(materialFile.is_open()); + materialFile << "{\n"; + materialFile << " \"renderQueue\": \"geometry\"\n"; + materialFile << "}\n"; + } + + AssetRef assetRef; + EXPECT_TRUE(manager.TryGetAssetRef("Assets/runtime.material", ResourceType::Material, assetRef)); + EXPECT_TRUE(assetRef.IsValid()); + + XCEngine::Containers::String resolvedPath; + EXPECT_TRUE(manager.TryResolveAssetPath(assetRef, resolvedPath)); + EXPECT_EQ(std::string(resolvedPath.CStr()), "Assets/runtime.material"); + + manager.SetResourceRoot(""); + manager.Shutdown(); + fs::remove_all(projectRoot); +} + +TEST(ProjectAssetIndex_Test, RefreshesSnapshotThroughImportServiceOnCacheMiss) { + namespace fs = std::filesystem; + + AssetImportService importService; + importService.Initialize(); + + const fs::path projectRoot = fs::temp_directory_path() / "xc_project_asset_index_refresh_test"; + const fs::path assetsDir = projectRoot / "Assets"; + const fs::path materialPath = assetsDir / "runtime.material"; + + fs::remove_all(projectRoot); + fs::create_directories(assetsDir); + + importService.SetProjectRoot(projectRoot.string().c_str()); + + ProjectAssetIndex assetIndex; + assetIndex.RefreshFrom(importService); + + { + std::ofstream materialFile(materialPath); + ASSERT_TRUE(materialFile.is_open()); + materialFile << "{\n"; + materialFile << " \"renderQueue\": \"geometry\"\n"; + materialFile << "}\n"; + } + + AssetRef assetRef; + EXPECT_TRUE(assetIndex.TryGetAssetRef(importService, "Assets/runtime.material", ResourceType::Material, assetRef)); + EXPECT_TRUE(assetRef.IsValid()); + + XCEngine::Containers::String resolvedPath; + EXPECT_TRUE(assetIndex.TryResolveAssetPath(importService, assetRef, resolvedPath)); + EXPECT_EQ(std::string(resolvedPath.CStr()), "Assets/runtime.material"); + + importService.Shutdown(); + fs::remove_all(projectRoot); +} + } // namespace diff --git a/tests/editor/CMakeLists.txt b/tests/editor/CMakeLists.txt index dc9ef0f3..e9dbfe5c 100644 --- a/tests/editor/CMakeLists.txt +++ b/tests/editor/CMakeLists.txt @@ -11,11 +11,15 @@ set(EDITOR_TEST_SOURCES test_scene_viewport_scale_gizmo.cpp test_scene_viewport_picker.cpp test_scene_viewport_overlay_renderer.cpp + test_script_component_editor_utils.cpp test_viewport_host_surface_utils.cpp test_viewport_object_id_picker.cpp test_viewport_render_targets.cpp test_viewport_render_flow_utils.cpp test_builtin_icon_layout_utils.cpp + test_editor_script_assembly_builder.cpp + test_editor_script_assembly_builder_utils.cpp + ${CMAKE_SOURCE_DIR}/editor/src/Scripting/EditorScriptAssemblyBuilder.cpp ${CMAKE_SOURCE_DIR}/editor/src/Core/UndoManager.cpp ${CMAKE_SOURCE_DIR}/editor/src/Core/PlaySessionController.cpp ${CMAKE_SOURCE_DIR}/editor/src/Managers/SceneManager.cpp @@ -26,13 +30,19 @@ set(EDITOR_TEST_SOURCES ${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportScaleGizmo.cpp ) +if(XCENGINE_ENABLE_MONO_SCRIPTING AND TARGET xcengine_managed_assemblies) + list(APPEND EDITOR_TEST_SOURCES + test_play_session_controller_scripting.cpp + ) +endif() + add_executable(editor_tests ${EDITOR_TEST_SOURCES}) if(MSVC) set_target_properties(editor_tests PROPERTIES LINK_FLAGS "/NODEFAULTLIB:libcpmt.lib /NODEFAULTLIB:libcmt.lib" ) - target_compile_options(editor_tests PRIVATE /FS) + target_compile_options(editor_tests PRIVATE /FS /utf-8) endif() target_link_libraries(editor_tests PRIVATE @@ -50,5 +60,28 @@ target_include_directories(editor_tests PRIVATE ${CMAKE_BINARY_DIR}/_deps/imgui-src/backends ) +file(TO_CMAKE_PATH "${CMAKE_SOURCE_DIR}" XCENGINE_EDITOR_TEST_REPO_ROOT_CMAKE) +file(TO_CMAKE_PATH "${XCENGINE_MONO_ROOT_DIR}" XCENGINE_EDITOR_TEST_MONO_ROOT_CMAKE) + +target_compile_definitions(editor_tests PRIVATE + XCENGINE_EDITOR_REPO_ROOT="${XCENGINE_EDITOR_TEST_REPO_ROOT_CMAKE}" + XCENGINE_EDITOR_MONO_ROOT_DIR="${XCENGINE_EDITOR_TEST_MONO_ROOT_CMAKE}" +) + +if(XCENGINE_ENABLE_MONO_SCRIPTING AND TARGET xcengine_managed_assemblies) + add_dependencies(editor_tests xcengine_managed_assemblies) + + file(TO_CMAKE_PATH "${XCENGINE_MANAGED_OUTPUT_DIR}" XCENGINE_MANAGED_OUTPUT_DIR_CMAKE) + file(TO_CMAKE_PATH "${XCENGINE_SCRIPT_CORE_DLL}" XCENGINE_SCRIPT_CORE_DLL_CMAKE) + file(TO_CMAKE_PATH "${XCENGINE_GAME_SCRIPTS_DLL}" XCENGINE_GAME_SCRIPTS_DLL_CMAKE) + + target_compile_definitions(editor_tests PRIVATE + XCENGINE_ENABLE_MONO_SCRIPTING + XCENGINE_TEST_MANAGED_OUTPUT_DIR="${XCENGINE_MANAGED_OUTPUT_DIR_CMAKE}" + XCENGINE_TEST_SCRIPT_CORE_DLL="${XCENGINE_SCRIPT_CORE_DLL_CMAKE}" + XCENGINE_TEST_GAME_SCRIPTS_DLL="${XCENGINE_GAME_SCRIPTS_DLL_CMAKE}" + ) +endif() + include(GoogleTest) gtest_discover_tests(editor_tests) diff --git a/tests/editor/test_action_routing.cpp b/tests/editor/test_action_routing.cpp index 4d5f20cc..aa0f667e 100644 --- a/tests/editor/test_action_routing.cpp +++ b/tests/editor/test_action_routing.cpp @@ -9,12 +9,14 @@ #include "Core/EditorContext.h" #include "Core/PlaySessionController.h" +#include #include #include #include #include #include +#include #include namespace fs = std::filesystem; @@ -343,6 +345,17 @@ TEST_F(EditorActionRoutingTest, MainMenuRouterRequestsPlayPauseResumeAndStepEven m_context.GetEventBus().Unsubscribe(playStepSubscription); } +TEST_F(EditorActionRoutingTest, ProjectCommandsReportWhenScriptAssembliesCanBeRebuilt) { + EXPECT_TRUE(Commands::CanRebuildScriptAssemblies(m_context)); + + m_context.SetRuntimeMode(EditorRuntimeMode::Play); + EXPECT_FALSE(Commands::CanRebuildScriptAssemblies(m_context)); + + m_context.SetRuntimeMode(EditorRuntimeMode::Edit); + m_context.SetProjectPath(std::string()); + EXPECT_FALSE(Commands::CanRebuildScriptAssemblies(m_context)); +} + TEST_F(EditorActionRoutingTest, PlayModeAllowsRuntimeSceneUndoRedoButKeepsSceneDocumentCommandsBlocked) { const fs::path savedScenePath = m_projectRoot / "Assets" / "Scenes" / "PlayModeRuntimeEditing.xc"; ASSERT_TRUE(m_context.GetSceneManager().SaveSceneAs(savedScenePath.string())); @@ -470,6 +483,68 @@ TEST_F(EditorActionRoutingTest, ProjectCommandsRenameAssetUpdatesSelectionAndPre EXPECT_EQ(m_context.GetProjectManager().GetSelectedItemPath(), renamedItem->fullPath); } +TEST_F(EditorActionRoutingTest, ProjectCommandsMigrateSceneAssetReferencesRewritesLegacyScenePayloads) { + using ::XCEngine::Resources::ResourceManager; + + const fs::path assetsDir = m_projectRoot / "Assets"; + const fs::path scenesDir = assetsDir / "Scenes"; + const fs::path materialPath = assetsDir / "runtime.material"; + const fs::path scenePath = scenesDir / "LegacyScene.xc"; + + { + std::ofstream materialFile(materialPath.string(), std::ios::out | std::ios::trunc); + ASSERT_TRUE(materialFile.is_open()); + materialFile << "{\n"; + materialFile << " \"renderQueue\": \"geometry\",\n"; + materialFile << " \"renderState\": {\n"; + materialFile << " \"cull\": \"back\"\n"; + materialFile << " }\n"; + materialFile << "}\n"; + } + + { + std::ofstream sceneFile(scenePath.string(), std::ios::out | std::ios::trunc); + ASSERT_TRUE(sceneFile.is_open()); + sceneFile << "# XCEngine Scene File\n"; + sceneFile << "scene=Legacy Scene\n"; + sceneFile << "active=1\n\n"; + sceneFile << "gameobject_begin\n"; + sceneFile << "id=1\n"; + sceneFile << "uuid=1\n"; + sceneFile << "name=Legacy Object\n"; + sceneFile << "active=1\n"; + sceneFile << "parent=0\n"; + sceneFile << "transform=position=0,0,0;rotation=0,0,0,1;scale=1,1,1;\n"; + sceneFile << "component=MeshFilter;mesh=builtin://meshes/cube;meshRef=;\n"; + sceneFile << "component=MeshRenderer;materials=Assets/runtime.material;materialRefs=;castShadows=1;receiveShadows=1;renderLayer=0;\n"; + sceneFile << "gameobject_end\n"; + } + + ASSERT_TRUE(Commands::CanMigrateSceneAssetReferences(m_context)); + const IProjectManager::SceneAssetReferenceMigrationReport report = + Commands::MigrateSceneAssetReferences(m_context); + + EXPECT_EQ(report.scannedSceneCount, 1u); + EXPECT_EQ(report.migratedSceneCount, 1u); + EXPECT_EQ(report.unchangedSceneCount, 0u); + EXPECT_EQ(report.failedSceneCount, 0u); + + std::ifstream migratedScene(scenePath.string(), std::ios::in | std::ios::binary); + ASSERT_TRUE(migratedScene.is_open()); + std::string migratedText((std::istreambuf_iterator(migratedScene)), + std::istreambuf_iterator()); + + EXPECT_NE(migratedText.find("meshPath=builtin://meshes/cube;"), std::string::npos); + EXPECT_EQ(migratedText.find("component=MeshFilter;mesh=builtin://meshes/cube;"), std::string::npos); + EXPECT_NE(migratedText.find("materialPaths=;"), std::string::npos); + EXPECT_NE(migratedText.find("materialRefs="), std::string::npos); + EXPECT_EQ(migratedText.find("materialRefs=;"), std::string::npos); + EXPECT_EQ(migratedText.find("component=MeshRenderer;materials="), std::string::npos); + + ResourceManager::Get().SetResourceRoot(""); + ResourceManager::Get().Shutdown(); +} + TEST_F(EditorActionRoutingTest, ProjectItemContextRequestSelectsAssetAndStoresPopupTarget) { const fs::path assetsDir = m_projectRoot / "Assets"; const fs::path filePath = assetsDir / "ContextAsset.txt"; diff --git a/tests/editor/test_editor_script_assembly_builder.cpp b/tests/editor/test_editor_script_assembly_builder.cpp new file mode 100644 index 00000000..bdf3c243 --- /dev/null +++ b/tests/editor/test_editor_script_assembly_builder.cpp @@ -0,0 +1,113 @@ +#include + +#include "Scripting/EditorScriptAssemblyBuilder.h" + +#ifdef XCENGINE_ENABLE_MONO_SCRIPTING +#include +#endif + +#include +#include +#include +#include +#include + +namespace XCEngine::Editor::Scripting { +namespace { + +class EditorScriptAssemblyBuilderTest : public ::testing::Test { +protected: + static void WriteTextFile(const std::filesystem::path& path, const std::string& content) { + std::ofstream output(path, std::ios::out | std::ios::trunc); + ASSERT_TRUE(output.is_open()); + output << content; + output.close(); + ASSERT_TRUE(output.good()); + } + + void SetUp() override { + const auto stamp = std::chrono::steady_clock::now().time_since_epoch().count(); + m_projectRoot = std::filesystem::temp_directory_path() / ("xc_script_builder_" + std::to_string(stamp)); + std::filesystem::create_directories(m_projectRoot / "Assets" / "Scripts"); + } + + void TearDown() override { + std::error_code ec; + std::filesystem::remove_all(m_projectRoot, ec); + } + + std::filesystem::path m_projectRoot; +}; + +TEST_F(EditorScriptAssemblyBuilderTest, RebuildsProjectScriptAssembliesIntoLibraryDirectory) { + const std::filesystem::path scriptPath = m_projectRoot / "Assets" / "Scripts" / "BuilderProbe.cs"; + WriteTextFile( + scriptPath, + "using XCEngine;\n" + "namespace BuilderTests {\n" + " public sealed class BuilderProbe : MonoBehaviour {\n" + " public float Speed = 4.0f;\n" + " }\n" + "}\n"); + + const EditorScriptAssemblyBuildResult result = + EditorScriptAssemblyBuilder::RebuildProjectAssemblies(m_projectRoot.string()); + ASSERT_TRUE(result.succeeded) << result.message; + + EXPECT_TRUE(std::filesystem::exists(m_projectRoot / "Library" / "ScriptAssemblies" / "XCEngine.ScriptCore.dll")); + EXPECT_TRUE(std::filesystem::exists(m_projectRoot / "Library" / "ScriptAssemblies" / "GameScripts.dll")); + EXPECT_TRUE(std::filesystem::exists(m_projectRoot / "Library" / "ScriptAssemblies" / "mscorlib.dll")); +} + +#ifdef XCENGINE_ENABLE_MONO_SCRIPTING +TEST_F(EditorScriptAssemblyBuilderTest, RebuildFailsWhileLoadedAssemblyIsStillHeldByMonoRuntime) { + const std::filesystem::path initialScriptPath = m_projectRoot / "Assets" / "Scripts" / "BuilderProbe.cs"; + WriteTextFile( + initialScriptPath, + "using XCEngine;\n" + "namespace BuilderTests {\n" + " public sealed class BuilderProbe : MonoBehaviour {\n" + " public float Speed = 4.0f;\n" + " }\n" + "}\n"); + + EditorScriptAssemblyBuildResult result = + EditorScriptAssemblyBuilder::RebuildProjectAssemblies(m_projectRoot.string()); + ASSERT_TRUE(result.succeeded) << result.message; + + XCEngine::Scripting::MonoScriptRuntime::Settings settings; + settings.assemblyDirectory = m_projectRoot / "Library" / "ScriptAssemblies"; + settings.corlibDirectory = settings.assemblyDirectory; + settings.coreAssemblyPath = settings.assemblyDirectory / "XCEngine.ScriptCore.dll"; + settings.appAssemblyPath = settings.assemblyDirectory / "GameScripts.dll"; + + auto runtime = std::make_unique(settings); + ASSERT_TRUE(runtime->Initialize()) << runtime->GetLastError(); + + const std::filesystem::path addedScriptPath = m_projectRoot / "Assets" / "Scripts" / "TickLogProbe.cs"; + WriteTextFile( + addedScriptPath, + "using XCEngine;\n" + "namespace BuilderTests {\n" + " public sealed class TickLogProbe : MonoBehaviour {\n" + " public int TickCount;\n" + " }\n" + "}\n"); + + result = EditorScriptAssemblyBuilder::RebuildProjectAssemblies(m_projectRoot.string()); + EXPECT_FALSE(result.succeeded); + + runtime.reset(); + + result = EditorScriptAssemblyBuilder::RebuildProjectAssemblies(m_projectRoot.string()); + ASSERT_TRUE(result.succeeded) << result.message; + + runtime = std::make_unique(settings); + ASSERT_TRUE(runtime->Initialize()) << runtime->GetLastError(); + EXPECT_TRUE(runtime->IsClassAvailable("GameScripts", "BuilderTests", "BuilderProbe")); + EXPECT_TRUE(runtime->IsClassAvailable("GameScripts", "BuilderTests", "TickLogProbe")); +} +#endif + +} // namespace +} // namespace XCEngine::Editor::Scripting diff --git a/tests/editor/test_editor_script_assembly_builder_utils.cpp b/tests/editor/test_editor_script_assembly_builder_utils.cpp new file mode 100644 index 00000000..80404c2e --- /dev/null +++ b/tests/editor/test_editor_script_assembly_builder_utils.cpp @@ -0,0 +1,74 @@ +#include + +#include "Scripting/EditorScriptAssemblyBuilderUtils.h" + +#include +#include +#include + +namespace XCEngine::Editor::Scripting { +namespace { + +class EditorScriptAssemblyBuilderUtilsTest : public ::testing::Test { +protected: + void SetUp() override { + const auto stamp = std::chrono::steady_clock::now().time_since_epoch().count(); + m_root = std::filesystem::temp_directory_path() / ("xc_script_builder_utils_" + std::to_string(stamp)); + std::filesystem::create_directories(m_root); + } + + void TearDown() override { + std::error_code ec; + std::filesystem::remove_all(m_root, ec); + } + + std::filesystem::path m_root; +}; + +TEST_F(EditorScriptAssemblyBuilderUtilsTest, CollectsAndSortsCSharpSourceFilesRecursively) { + std::filesystem::create_directories(m_root / "B"); + std::filesystem::create_directories(m_root / "A" / "Nested"); + + std::ofstream(m_root / "B" / "Second.cs").put('\n'); + std::ofstream(m_root / "A" / "Nested" / "Third.cs").put('\n'); + std::ofstream(m_root / "A" / "First.cs").put('\n'); + std::ofstream(m_root / "Ignore.txt").put('\n'); + + const std::vector files = CollectCSharpSourceFiles(m_root); + ASSERT_EQ(files.size(), 3u); + EXPECT_EQ(files[0], (m_root / "A" / "First.cs").lexically_normal()); + EXPECT_EQ(files[1], (m_root / "A" / "Nested" / "Third.cs").lexically_normal()); + EXPECT_EQ(files[2], (m_root / "B" / "Second.cs").lexically_normal()); +} + +TEST(EditorScriptAssemblyBuilderUtils_StandaloneTest, ParsesLatestDotnetSdkVersionFromSdkListOutput) { + const std::string sdkListOutput = + "7.0.410 [C:\\Program Files\\dotnet\\sdk]\n" + "8.0.412 [C:\\Program Files\\dotnet\\sdk]\n" + "9.0.100 [C:\\Program Files\\dotnet\\sdk]\n"; + + EXPECT_EQ(ParseLatestDotnetSdkVersion(sdkListOutput), "9.0.100"); + EXPECT_TRUE(ParseLatestDotnetSdkVersion(std::string()).empty()); +} + +TEST_F(EditorScriptAssemblyBuilderUtilsTest, CreatesPlaceholderProjectScriptSourceWhenNoScriptsExist) { + std::vector projectSources; + std::string error; + const std::filesystem::path placeholderPath = m_root / "Generated" / "EmptyProjectGameScripts.cs"; + + ASSERT_TRUE(EnsurePlaceholderProjectScriptSource(projectSources, placeholderPath, error)) << error; + ASSERT_EQ(projectSources.size(), 1u); + EXPECT_EQ(projectSources.front(), placeholderPath.lexically_normal()); + EXPECT_TRUE(std::filesystem::exists(placeholderPath)); + + std::ifstream input(placeholderPath); + std::string content((std::istreambuf_iterator(input)), std::istreambuf_iterator()); + EXPECT_NE(content.find("EmptyProjectGameScriptsMarker"), std::string::npos); + + error.clear(); + ASSERT_TRUE(EnsurePlaceholderProjectScriptSource(projectSources, placeholderPath, error)) << error; + EXPECT_EQ(projectSources.size(), 1u); +} + +} // namespace +} // namespace XCEngine::Editor::Scripting diff --git a/tests/editor/test_play_session_controller.cpp b/tests/editor/test_play_session_controller.cpp index 5497ff13..99d2f214 100644 --- a/tests/editor/test_play_session_controller.cpp +++ b/tests/editor/test_play_session_controller.cpp @@ -5,16 +5,55 @@ #include "Core/PlaySessionController.h" #include +#include namespace XCEngine::Editor { namespace { +GameViewInputFrameEvent CreateGameViewInputFrame( + bool focused, + bool hovered, + std::initializer_list keys = {}, + std::initializer_list mouseButtons = {}, + XCEngine::Math::Vector2 mousePosition = XCEngine::Math::Vector2::Zero(), + XCEngine::Math::Vector2 mouseDelta = XCEngine::Math::Vector2::Zero(), + float mouseWheel = 0.0f) { + GameViewInputFrameEvent event = {}; + event.focused = focused; + event.hovered = hovered; + event.mousePosition = mousePosition; + event.mouseDelta = mouseDelta; + event.mouseWheel = mouseWheel; + + for (const XCEngine::Input::KeyCode key : keys) { + const size_t index = static_cast(key); + if (index < event.keyDown.size()) { + event.keyDown[index] = true; + } + } + + for (const XCEngine::Input::MouseButton button : mouseButtons) { + const size_t index = static_cast(button); + if (index < event.mouseButtonDown.size()) { + event.mouseButtonDown[index] = true; + } + } + + return event; +} + class PlaySessionControllerTest : public ::testing::Test { protected: void SetUp() override { + XCEngine::Input::InputManager::Get().Shutdown(); m_context.GetSceneManager().NewScene("Play Session Scene"); } + void TearDown() override { + m_controller.Detach(m_context); + XCEngine::Input::InputManager::Get().Shutdown(); + } + EditorContext m_context; PlaySessionController m_controller; }; @@ -120,5 +159,82 @@ TEST_F(PlaySessionControllerTest, PauseResumeAndStepRequestsDrivePlayStateMachin m_context.GetEventBus().Unsubscribe(resumedSubscription); } +TEST_F(PlaySessionControllerTest, GameViewInputFramesDoNotAffectInputManagerOutsidePlayMode) { + m_controller.Attach(m_context); + + m_context.GetEventBus().Publish(CreateGameViewInputFrame( + true, + true, + {XCEngine::Input::KeyCode::A}, + {XCEngine::Input::MouseButton::Left}, + XCEngine::Math::Vector2(120.0f, 48.0f), + XCEngine::Math::Vector2(3.0f, -2.0f), + 1.0f)); + + m_controller.Update(m_context, 0.016f); + + auto& inputManager = XCEngine::Input::InputManager::Get(); + EXPECT_FALSE(inputManager.IsKeyDown(XCEngine::Input::KeyCode::A)); + EXPECT_FALSE(inputManager.IsMouseButtonDown(XCEngine::Input::MouseButton::Left)); + EXPECT_EQ(inputManager.GetMousePosition(), XCEngine::Math::Vector2::Zero()); + EXPECT_FLOAT_EQ(inputManager.GetMouseScrollDelta(), 0.0f); + + m_controller.Detach(m_context); +} + +TEST_F(PlaySessionControllerTest, GameViewInputFramesDriveAndReleaseRuntimeInputDuringPlayMode) { + auto* editorEntity = m_context.GetSceneManager().CreateEntity("Persistent"); + ASSERT_NE(editorEntity, nullptr); + + m_controller.Attach(m_context); + ASSERT_TRUE(m_controller.StartPlay(m_context)); + + m_context.GetEventBus().Publish(CreateGameViewInputFrame( + true, + true, + {XCEngine::Input::KeyCode::A, XCEngine::Input::KeyCode::Space}, + {XCEngine::Input::MouseButton::Left}, + XCEngine::Math::Vector2(120.0f, 48.0f), + XCEngine::Math::Vector2(3.0f, -2.0f), + 1.0f)); + + m_controller.Update(m_context, 0.016f); + + auto& inputManager = XCEngine::Input::InputManager::Get(); + EXPECT_TRUE(inputManager.IsKeyDown(XCEngine::Input::KeyCode::A)); + EXPECT_TRUE(inputManager.IsKeyPressed(XCEngine::Input::KeyCode::A)); + EXPECT_TRUE(inputManager.IsKeyDown(XCEngine::Input::KeyCode::Space)); + EXPECT_TRUE(inputManager.IsMouseButtonDown(XCEngine::Input::MouseButton::Left)); + EXPECT_TRUE(inputManager.IsMouseButtonClicked(XCEngine::Input::MouseButton::Left)); + EXPECT_EQ(inputManager.GetMousePosition(), XCEngine::Math::Vector2(120.0f, 48.0f)); + EXPECT_EQ(inputManager.GetMouseDelta(), XCEngine::Math::Vector2(3.0f, -2.0f)); + EXPECT_FLOAT_EQ(inputManager.GetMouseScrollDelta(), 1.0f); + + m_context.GetEventBus().Publish(CreateGameViewInputFrame( + true, + true, + {XCEngine::Input::KeyCode::A, XCEngine::Input::KeyCode::Space}, + {XCEngine::Input::MouseButton::Left}, + XCEngine::Math::Vector2(120.0f, 48.0f))); + + m_controller.Update(m_context, 0.016f); + + EXPECT_TRUE(inputManager.IsKeyDown(XCEngine::Input::KeyCode::A)); + EXPECT_FALSE(inputManager.IsKeyPressed(XCEngine::Input::KeyCode::A)); + EXPECT_TRUE(inputManager.IsMouseButtonDown(XCEngine::Input::MouseButton::Left)); + EXPECT_FALSE(inputManager.IsMouseButtonClicked(XCEngine::Input::MouseButton::Left)); + EXPECT_EQ(inputManager.GetMouseDelta(), XCEngine::Math::Vector2::Zero()); + EXPECT_FLOAT_EQ(inputManager.GetMouseScrollDelta(), 0.0f); + + m_context.GetEventBus().Publish(GameViewInputFrameEvent{}); + m_controller.Update(m_context, 0.016f); + + EXPECT_FALSE(inputManager.IsKeyDown(XCEngine::Input::KeyCode::A)); + EXPECT_FALSE(inputManager.IsKeyDown(XCEngine::Input::KeyCode::Space)); + EXPECT_FALSE(inputManager.IsMouseButtonDown(XCEngine::Input::MouseButton::Left)); + + m_controller.Detach(m_context); +} + } // namespace } // namespace XCEngine::Editor diff --git a/tests/editor/test_play_session_controller_scripting.cpp b/tests/editor/test_play_session_controller_scripting.cpp new file mode 100644 index 00000000..7358aea8 --- /dev/null +++ b/tests/editor/test_play_session_controller_scripting.cpp @@ -0,0 +1,641 @@ +#include + +#include "Core/EditorContext.h" +#include "Core/EditorRuntimeMode.h" +#include "Core/PlaySessionController.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace XCEngine::Components; +using namespace XCEngine::Scripting; + +namespace XCEngine::Editor { +namespace { + +MonoScriptRuntime::Settings CreateMonoSettings() { + MonoScriptRuntime::Settings settings; + settings.assemblyDirectory = XCENGINE_TEST_MANAGED_OUTPUT_DIR; + settings.corlibDirectory = XCENGINE_TEST_MANAGED_OUTPUT_DIR; + settings.coreAssemblyPath = XCENGINE_TEST_SCRIPT_CORE_DLL; + settings.appAssemblyPath = XCENGINE_TEST_GAME_SCRIPTS_DLL; + return settings; +} + +void ExpectVector3Near(const Math::Vector3& actual, const Math::Vector3& expected, float tolerance = 0.001f) { + EXPECT_NEAR(actual.x, expected.x, tolerance); + EXPECT_NEAR(actual.y, expected.y, tolerance); + EXPECT_NEAR(actual.z, expected.z, tolerance); +} + +class CapturingLogSink final : public Debug::ILogSink { +public: + void Log(const Debug::LogEntry& entry) override { + entries.push_back(entry); + } + + void Flush() override { + } + + std::vector CollectMessagesWithPrefix(const char* prefix) const { + std::vector messages; + for (const Debug::LogEntry& entry : entries) { + const std::string message = entry.message.CStr(); + if (message.rfind(prefix, 0) == 0) { + messages.push_back(message); + } + } + + return messages; + } + + std::vector entries; +}; + +ScriptComponent* FindLifecycleProbe(GameObject* gameObject) { + if (!gameObject) { + return nullptr; + } + + for (ScriptComponent* component : gameObject->GetComponents()) { + if (!component) { + continue; + } + + if (component->GetAssemblyName() == "GameScripts" + && component->GetNamespaceName() == "Gameplay" + && component->GetClassName() == "LifecycleProbe") { + return component; + } + } + + return nullptr; +} + +ScriptComponent* FindInputProbe(GameObject* gameObject) { + if (!gameObject) { + return nullptr; + } + + for (ScriptComponent* component : gameObject->GetComponents()) { + if (!component) { + continue; + } + + if (component->GetAssemblyName() == "GameScripts" + && component->GetNamespaceName() == "Gameplay" + && component->GetClassName() == "InputProbe") { + return component; + } + } + + return nullptr; +} + +ScriptComponent* FindTickLogProbe(GameObject* gameObject) { + if (!gameObject) { + return nullptr; + } + + for (ScriptComponent* component : gameObject->GetComponents()) { + if (!component) { + continue; + } + + if (component->GetAssemblyName() == "GameScripts" + && component->GetNamespaceName() == "Gameplay" + && component->GetClassName() == "TickLogProbe") { + return component; + } + } + + return nullptr; +} + +GameViewInputFrameEvent CreateGameViewInputFrame( + bool focused, + bool hovered, + std::initializer_list keys = {}, + std::initializer_list mouseButtons = {}, + XCEngine::Math::Vector2 mousePosition = XCEngine::Math::Vector2::Zero(), + XCEngine::Math::Vector2 mouseDelta = XCEngine::Math::Vector2::Zero(), + float mouseWheel = 0.0f) { + GameViewInputFrameEvent event = {}; + event.focused = focused; + event.hovered = hovered; + event.mousePosition = mousePosition; + event.mouseDelta = mouseDelta; + event.mouseWheel = mouseWheel; + + for (const XCEngine::Input::KeyCode key : keys) { + const size_t index = static_cast(key); + if (index < event.keyDown.size()) { + event.keyDown[index] = true; + } + } + + for (const XCEngine::Input::MouseButton button : mouseButtons) { + const size_t index = static_cast(button); + if (index < event.mouseButtonDown.size()) { + event.mouseButtonDown[index] = true; + } + } + + return event; +} + +class PlaySessionControllerScriptingTest : public ::testing::Test { +protected: + void SetUp() override { + engine = &ScriptEngine::Get(); + engine->OnRuntimeStop(); + + runtime = std::make_unique(CreateMonoSettings()); + ASSERT_TRUE(runtime->Initialize()) << runtime->GetLastError(); + engine->SetRuntime(runtime.get()); + + context.GetSceneManager().NewScene("Play Session Script Scene"); + controller.Attach(context); + } + + void TearDown() override { + controller.Detach(context); + engine->OnRuntimeStop(); + engine->SetRuntime(nullptr); + runtime.reset(); + } + + ScriptComponent* AddLifecycleProbe(GameObject* gameObject) { + ScriptComponent* component = gameObject->AddComponent(); + component->SetScriptClass("GameScripts", "Gameplay", "LifecycleProbe"); + return component; + } + + ScriptComponent* AddInputProbe(GameObject* gameObject) { + ScriptComponent* component = gameObject->AddComponent(); + component->SetScriptClass("GameScripts", "Gameplay", "InputProbe"); + return component; + } + + ScriptComponent* AddTickLogProbe(GameObject* gameObject) { + ScriptComponent* component = gameObject->AddComponent(); + component->SetScriptClass("GameScripts", "Gameplay", "TickLogProbe"); + return component; + } + + ScriptEngine* engine = nullptr; + std::unique_ptr runtime; + EditorContext context; + PlaySessionController controller; +}; + +TEST_F(PlaySessionControllerScriptingTest, StartPlayAndRuntimeTickDriveManagedLifecycleThroughPlayController) { + GameObject* host = context.GetSceneManager().CreateEntity("Host"); + ASSERT_NE(host, nullptr); + ScriptComponent* script = AddLifecycleProbe(host); + ASSERT_NE(script, nullptr); + + script->GetFieldStorage().SetFieldValue("Label", "EditorLabel"); + script->GetFieldStorage().SetFieldValue("Speed", 5.0f); + script->GetFieldStorage().SetFieldValue("SpawnPoint", Math::Vector3(2.0f, 4.0f, 6.0f)); + + const uint64_t hostId = host->GetID(); + + ASSERT_TRUE(controller.StartPlay(context)); + EXPECT_EQ(context.GetRuntimeMode(), EditorRuntimeMode::Play); + + GameObject* runtimeHost = context.GetSceneManager().GetEntity(hostId); + ASSERT_NE(runtimeHost, nullptr); + ScriptComponent* runtimeScript = FindLifecycleProbe(runtimeHost); + ASSERT_NE(runtimeScript, nullptr); + EXPECT_TRUE(engine->HasRuntimeInstance(runtimeScript)); + EXPECT_TRUE(runtime->HasManagedInstance(runtimeScript)); + + int32_t awakeCount = 0; + int32_t enableCount = 0; + int32_t startCount = 0; + int32_t fixedUpdateCount = 0; + int32_t updateCount = 0; + int32_t lateUpdateCount = 0; + std::string label; + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "AwakeCount", awakeCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "EnableCount", enableCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "StartCount", startCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "FixedUpdateCount", fixedUpdateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "LateUpdateCount", lateUpdateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "Label", label)); + + EXPECT_EQ(awakeCount, 1); + EXPECT_EQ(enableCount, 1); + EXPECT_EQ(startCount, 0); + EXPECT_EQ(fixedUpdateCount, 0); + EXPECT_EQ(updateCount, 0); + EXPECT_EQ(lateUpdateCount, 0); + EXPECT_EQ(label, "EditorLabel|Awake"); + + controller.Update(context, 0.036f); + + float observedFixedDeltaTime = 0.0f; + float observedConfiguredFixedDeltaTime = 0.0f; + float observedConfiguredFixedDeltaTimeInUpdate = 0.0f; + float observedUpdateDeltaTime = 0.0f; + float observedLateDeltaTime = 0.0f; + float speed = 0.0f; + Math::Vector3 spawnPoint; + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "StartCount", startCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "FixedUpdateCount", fixedUpdateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "LateUpdateCount", lateUpdateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedFixedDeltaTime", observedFixedDeltaTime)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedConfiguredFixedDeltaTime", observedConfiguredFixedDeltaTime)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedConfiguredFixedDeltaTimeInUpdate", observedConfiguredFixedDeltaTimeInUpdate)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedUpdateDeltaTime", observedUpdateDeltaTime)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedLateDeltaTime", observedLateDeltaTime)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "Speed", speed)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "SpawnPoint", spawnPoint)); + + EXPECT_EQ(startCount, 1); + EXPECT_EQ(fixedUpdateCount, 1); + EXPECT_EQ(updateCount, 1); + EXPECT_EQ(lateUpdateCount, 1); + EXPECT_FLOAT_EQ(observedFixedDeltaTime, 0.02f); + EXPECT_FLOAT_EQ(observedConfiguredFixedDeltaTime, 0.02f); + EXPECT_FLOAT_EQ(observedConfiguredFixedDeltaTimeInUpdate, 0.02f); + EXPECT_FLOAT_EQ(observedUpdateDeltaTime, 0.036f); + EXPECT_FLOAT_EQ(observedLateDeltaTime, 0.036f); + EXPECT_FLOAT_EQ(speed, 6.0f); + EXPECT_EQ(runtimeHost->GetName(), "Host_Managed"); + ExpectVector3Near(runtimeHost->GetTransform()->GetLocalPosition(), Math::Vector3(8.0f, 8.0f, 9.0f)); + ExpectVector3Near(spawnPoint, Math::Vector3(3.0f, 4.0f, 6.0f)); +} + +TEST_F(PlaySessionControllerScriptingTest, PauseAndStepGateManagedUpdatesInPlayMode) { + GameObject* host = context.GetSceneManager().CreateEntity("Host"); + ASSERT_NE(host, nullptr); + ScriptComponent* script = AddLifecycleProbe(host); + ASSERT_NE(script, nullptr); + + script->GetFieldStorage().SetFieldValue("Label", "EditorLabel"); + + const uint64_t hostId = host->GetID(); + + ASSERT_TRUE(controller.StartPlay(context)); + GameObject* runtimeHost = context.GetSceneManager().GetEntity(hostId); + ASSERT_NE(runtimeHost, nullptr); + ScriptComponent* runtimeScript = FindLifecycleProbe(runtimeHost); + ASSERT_NE(runtimeScript, nullptr); + + controller.Update(context, 0.02f); + + int32_t startCount = 0; + int32_t fixedUpdateCount = 0; + int32_t updateCount = 0; + int32_t lateUpdateCount = 0; + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "StartCount", startCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "FixedUpdateCount", fixedUpdateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "LateUpdateCount", lateUpdateCount)); + + EXPECT_EQ(startCount, 1); + EXPECT_EQ(fixedUpdateCount, 1); + EXPECT_EQ(updateCount, 1); + EXPECT_EQ(lateUpdateCount, 1); + + ASSERT_TRUE(controller.PausePlay(context)); + EXPECT_EQ(context.GetRuntimeMode(), EditorRuntimeMode::Paused); + + controller.Update(context, 0.02f); + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "FixedUpdateCount", fixedUpdateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "LateUpdateCount", lateUpdateCount)); + + EXPECT_EQ(fixedUpdateCount, 1); + EXPECT_EQ(updateCount, 1); + EXPECT_EQ(lateUpdateCount, 1); + + ASSERT_TRUE(controller.StepPlay(context)); + controller.Update(context, 0.02f); + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "FixedUpdateCount", fixedUpdateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "LateUpdateCount", lateUpdateCount)); + + EXPECT_EQ(context.GetRuntimeMode(), EditorRuntimeMode::Paused); + EXPECT_EQ(fixedUpdateCount, 2); + EXPECT_EQ(updateCount, 2); + EXPECT_EQ(lateUpdateCount, 2); + + ASSERT_TRUE(controller.ResumePlay(context)); + EXPECT_EQ(context.GetRuntimeMode(), EditorRuntimeMode::Play); + + controller.Update(context, 0.02f); + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "FixedUpdateCount", fixedUpdateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "LateUpdateCount", lateUpdateCount)); + + EXPECT_EQ(fixedUpdateCount, 3); + EXPECT_EQ(updateCount, 3); + EXPECT_EQ(lateUpdateCount, 3); +} + +TEST_F(PlaySessionControllerScriptingTest, StopPlayDestroysManagedInstancesAndRestoresEditorSnapshot) { + GameObject* host = context.GetSceneManager().CreateEntity("Host"); + ASSERT_NE(host, nullptr); + host->GetTransform()->SetLocalPosition(Math::Vector3(1.0f, 2.0f, 3.0f)); + + ScriptComponent* script = AddLifecycleProbe(host); + ASSERT_NE(script, nullptr); + script->GetFieldStorage().SetFieldValue("Label", "EditorLabel"); + script->GetFieldStorage().SetFieldValue("Speed", 5.0f); + script->GetFieldStorage().SetFieldValue("SpawnPoint", Math::Vector3(2.0f, 4.0f, 6.0f)); + + const uint64_t hostId = host->GetID(); + const uint64_t scriptComponentUUID = script->GetScriptComponentUUID(); + + ASSERT_TRUE(controller.StartPlay(context)); + GameObject* runtimeHost = context.GetSceneManager().GetEntity(hostId); + ASSERT_NE(runtimeHost, nullptr); + ScriptComponent* runtimeScript = FindLifecycleProbe(runtimeHost); + ASSERT_NE(runtimeScript, nullptr); + + controller.Update(context, 0.02f); + + EXPECT_EQ(runtime->GetManagedInstanceCount(), 1u); + EXPECT_EQ(runtimeHost->GetName(), "Host_Managed"); + ExpectVector3Near(runtimeHost->GetTransform()->GetLocalPosition(), Math::Vector3(8.0f, 8.0f, 9.0f)); + + ASSERT_TRUE(controller.StopPlay(context)); + EXPECT_EQ(context.GetRuntimeMode(), EditorRuntimeMode::Edit); + EXPECT_FALSE(engine->IsRuntimeRunning()); + EXPECT_EQ(runtime->GetManagedInstanceCount(), 0u); + + GameObject* restoredHost = context.GetSceneManager().GetEntity(hostId); + ASSERT_NE(restoredHost, nullptr); + EXPECT_EQ(restoredHost->GetName(), "Host"); + ExpectVector3Near(restoredHost->GetTransform()->GetLocalPosition(), Math::Vector3(1.0f, 2.0f, 3.0f)); + + ScriptComponent* restoredScript = FindLifecycleProbe(restoredHost); + ASSERT_NE(restoredScript, nullptr); + EXPECT_EQ(restoredScript->GetScriptComponentUUID(), scriptComponentUUID); + + std::string label; + float speed = 0.0f; + Math::Vector3 spawnPoint; + int32_t awakeCount = 0; + + ASSERT_TRUE(engine->TryGetScriptFieldValue(restoredScript, "Label", label)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(restoredScript, "Speed", speed)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(restoredScript, "SpawnPoint", spawnPoint)); + + EXPECT_EQ(label, "EditorLabel"); + EXPECT_FLOAT_EQ(speed, 5.0f); + ExpectVector3Near(spawnPoint, Math::Vector3(2.0f, 4.0f, 6.0f)); + EXPECT_FALSE(engine->TryGetScriptFieldValue(restoredScript, "AwakeCount", awakeCount)); + EXPECT_FALSE(restoredScript->GetFieldStorage().Contains("AwakeCount")); +} + +TEST_F(PlaySessionControllerScriptingTest, GameViewInputBridgeFeedsManagedInputApiDuringPlayMode) { + GameObject* host = context.GetSceneManager().CreateEntity("Host"); + ASSERT_NE(host, nullptr); + ScriptComponent* script = AddInputProbe(host); + ASSERT_NE(script, nullptr); + + const uint64_t hostId = host->GetID(); + + controller.Attach(context); + ASSERT_TRUE(controller.StartPlay(context)); + GameObject* runtimeHost = context.GetSceneManager().GetEntity(hostId); + ASSERT_NE(runtimeHost, nullptr); + ScriptComponent* runtimeScript = FindInputProbe(runtimeHost); + ASSERT_NE(runtimeScript, nullptr); + + context.GetEventBus().Publish(CreateGameViewInputFrame( + true, + true, + {XCEngine::Input::KeyCode::A, XCEngine::Input::KeyCode::Space, XCEngine::Input::KeyCode::LeftCtrl}, + {XCEngine::Input::MouseButton::Left}, + XCEngine::Math::Vector2(120.0f, 48.0f), + XCEngine::Math::Vector2(3.0f, -2.0f), + 1.0f)); + + controller.Update(context, 0.016f); + + int32_t updateCount = 0; + bool observedKeyA = false; + bool observedKeyADown = false; + bool observedKeyAUp = false; + bool observedKeySpace = false; + bool observedJump = false; + bool observedJumpDown = false; + bool observedJumpUp = false; + bool observedFire1 = false; + bool observedFire1Down = false; + bool observedFire1Up = false; + bool observedAnyKey = false; + bool observedAnyKeyDown = false; + bool observedLeftMouse = false; + bool observedLeftMouseDown = false; + bool observedLeftMouseUp = false; + float observedHorizontal = 0.0f; + float observedHorizontalRaw = 0.0f; + XCEngine::Math::Vector2 observedMouseScrollDelta; + XCEngine::Math::Vector3 observedMousePosition; + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeyA", observedKeyA)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeyADown", observedKeyADown)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeyAUp", observedKeyAUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeySpace", observedKeySpace)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJump", observedJump)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJumpDown", observedJumpDown)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJumpUp", observedJumpUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedFire1", observedFire1)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedFire1Down", observedFire1Down)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedFire1Up", observedFire1Up)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedAnyKey", observedAnyKey)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedAnyKeyDown", observedAnyKeyDown)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedLeftMouse", observedLeftMouse)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedLeftMouseDown", observedLeftMouseDown)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedLeftMouseUp", observedLeftMouseUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedHorizontal", observedHorizontal)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedHorizontalRaw", observedHorizontalRaw)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedMousePosition", observedMousePosition)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedMouseScrollDelta", observedMouseScrollDelta)); + + EXPECT_EQ(updateCount, 1); + EXPECT_TRUE(observedKeyA); + EXPECT_TRUE(observedKeyADown); + EXPECT_FALSE(observedKeyAUp); + EXPECT_TRUE(observedKeySpace); + EXPECT_TRUE(observedJump); + EXPECT_TRUE(observedJumpDown); + EXPECT_FALSE(observedJumpUp); + EXPECT_TRUE(observedFire1); + EXPECT_TRUE(observedFire1Down); + EXPECT_FALSE(observedFire1Up); + EXPECT_TRUE(observedAnyKey); + EXPECT_TRUE(observedAnyKeyDown); + EXPECT_TRUE(observedLeftMouse); + EXPECT_TRUE(observedLeftMouseDown); + EXPECT_FALSE(observedLeftMouseUp); + EXPECT_FLOAT_EQ(observedHorizontal, -1.0f); + EXPECT_FLOAT_EQ(observedHorizontalRaw, -1.0f); + EXPECT_EQ(observedMousePosition, XCEngine::Math::Vector3(120.0f, 48.0f, 0.0f)); + EXPECT_EQ(observedMouseScrollDelta, XCEngine::Math::Vector2(0.0f, 1.0f)); + + context.GetEventBus().Publish(CreateGameViewInputFrame( + true, + true, + {XCEngine::Input::KeyCode::A, XCEngine::Input::KeyCode::Space, XCEngine::Input::KeyCode::LeftCtrl}, + {XCEngine::Input::MouseButton::Left}, + XCEngine::Math::Vector2(120.0f, 48.0f))); + + controller.Update(context, 0.016f); + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeyA", observedKeyA)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeyADown", observedKeyADown)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeyAUp", observedKeyAUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJump", observedJump)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJumpDown", observedJumpDown)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJumpUp", observedJumpUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedFire1", observedFire1)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedFire1Down", observedFire1Down)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedFire1Up", observedFire1Up)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedAnyKey", observedAnyKey)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedAnyKeyDown", observedAnyKeyDown)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedLeftMouse", observedLeftMouse)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedLeftMouseDown", observedLeftMouseDown)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedLeftMouseUp", observedLeftMouseUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedHorizontalRaw", observedHorizontalRaw)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedMouseScrollDelta", observedMouseScrollDelta)); + + EXPECT_EQ(updateCount, 2); + EXPECT_TRUE(observedKeyA); + EXPECT_FALSE(observedKeyADown); + EXPECT_FALSE(observedKeyAUp); + EXPECT_TRUE(observedJump); + EXPECT_FALSE(observedJumpDown); + EXPECT_FALSE(observedJumpUp); + EXPECT_TRUE(observedFire1); + EXPECT_FALSE(observedFire1Down); + EXPECT_FALSE(observedFire1Up); + EXPECT_TRUE(observedAnyKey); + EXPECT_FALSE(observedAnyKeyDown); + EXPECT_TRUE(observedLeftMouse); + EXPECT_FALSE(observedLeftMouseDown); + EXPECT_FALSE(observedLeftMouseUp); + EXPECT_FLOAT_EQ(observedHorizontalRaw, -1.0f); + EXPECT_EQ(observedMouseScrollDelta, XCEngine::Math::Vector2(0.0f, 0.0f)); + + context.GetEventBus().Publish(CreateGameViewInputFrame( + true, + true, + {XCEngine::Input::KeyCode::Space}, + {}, + XCEngine::Math::Vector2(120.0f, 48.0f))); + controller.Update(context, 0.016f); + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeyA", observedKeyA)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeyAUp", observedKeyAUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeySpace", observedKeySpace)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJump", observedJump)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJumpUp", observedJumpUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedFire1", observedFire1)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedFire1Up", observedFire1Up)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedAnyKey", observedAnyKey)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedAnyKeyDown", observedAnyKeyDown)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedLeftMouse", observedLeftMouse)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedLeftMouseUp", observedLeftMouseUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedHorizontal", observedHorizontal)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedHorizontalRaw", observedHorizontalRaw)); + + EXPECT_EQ(updateCount, 3); + EXPECT_FALSE(observedKeyA); + EXPECT_TRUE(observedKeyAUp); + EXPECT_TRUE(observedKeySpace); + EXPECT_TRUE(observedJump); + EXPECT_FALSE(observedJumpUp); + EXPECT_FALSE(observedFire1); + EXPECT_TRUE(observedFire1Up); + EXPECT_TRUE(observedAnyKey); + EXPECT_FALSE(observedAnyKeyDown); + EXPECT_FALSE(observedLeftMouse); + EXPECT_TRUE(observedLeftMouseUp); + EXPECT_FLOAT_EQ(observedHorizontal, 0.0f); + EXPECT_FLOAT_EQ(observedHorizontalRaw, 0.0f); + + context.GetEventBus().Publish(CreateGameViewInputFrame( + true, + true, + {}, + {}, + XCEngine::Math::Vector2(120.0f, 48.0f))); + controller.Update(context, 0.016f); + + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "UpdateCount", updateCount)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedKeySpace", observedKeySpace)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJump", observedJump)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedJumpUp", observedJumpUp)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedAnyKey", observedAnyKey)); + ASSERT_TRUE(engine->TryGetScriptFieldValue(runtimeScript, "ObservedAnyKeyDown", observedAnyKeyDown)); + + EXPECT_EQ(updateCount, 4); + EXPECT_FALSE(observedKeySpace); + EXPECT_FALSE(observedJump); + EXPECT_TRUE(observedJumpUp); + EXPECT_FALSE(observedAnyKey); + EXPECT_FALSE(observedAnyKeyDown); +} + +TEST_F(PlaySessionControllerScriptingTest, PlayModeTickWritesManagedDebugLogsToNativeLogger) { + auto sink = std::make_unique(); + CapturingLogSink* sinkPtr = sink.get(); + Debug::Logger::Get().AddSink(std::move(sink)); + + GameObject* host = context.GetSceneManager().CreateEntity("Host"); + ASSERT_NE(host, nullptr); + ScriptComponent* script = AddTickLogProbe(host); + ASSERT_NE(script, nullptr); + + const uint64_t hostId = host->GetID(); + + ASSERT_TRUE(controller.StartPlay(context)); + GameObject* runtimeHost = context.GetSceneManager().GetEntity(hostId); + ASSERT_NE(runtimeHost, nullptr); + ASSERT_NE(FindTickLogProbe(runtimeHost), nullptr); + + controller.Update(context, 0.036f); + + const std::vector messages = sinkPtr->CollectMessagesWithPrefix("[TickLogProbe]"); + const std::vector expected = { + "[TickLogProbe] Awake", + "[TickLogProbe] FixedUpdate 1", + "[TickLogProbe] Start", + "[TickLogProbe] Update 1", + "[TickLogProbe] LateUpdate 1", + }; + + EXPECT_EQ(messages, expected); + + Debug::Logger::Get().RemoveSink(sinkPtr); +} + +} // namespace +} // namespace XCEngine::Editor diff --git a/tests/editor/test_scene_viewport_camera_controller.cpp b/tests/editor/test_scene_viewport_camera_controller.cpp index f22d3abc..a5dfc792 100644 --- a/tests/editor/test_scene_viewport_camera_controller.cpp +++ b/tests/editor/test_scene_viewport_camera_controller.cpp @@ -159,16 +159,16 @@ TEST(SceneViewportCameraController_Test, FlyInputMovesCameraAndFocalPointTogethe TEST(SceneViewportCameraController_Test, ZoomDoesNotChangeFlySpeed) { SceneViewportCameraController zoomedController; zoomedController.Reset(); - const Vector3 zoomedInitialPosition = zoomedController.GetPosition(); SceneViewportCameraController baselineController; baselineController.Reset(); - const Vector3 baselineInitialPosition = baselineController.GetPosition(); SceneViewportCameraInputState zoomInput = {}; zoomInput.viewportHeight = 720.0f; zoomInput.zoomDelta = 8.0f; zoomedController.ApplyInput(zoomInput); + const Vector3 zoomedPositionBeforeMove = zoomedController.GetPosition(); + const Vector3 baselinePositionBeforeMove = baselineController.GetPosition(); SceneViewportCameraInputState moveInput = {}; moveInput.viewportHeight = 720.0f; @@ -178,8 +178,8 @@ TEST(SceneViewportCameraController_Test, ZoomDoesNotChangeFlySpeed) { baselineController.ApplyInput(moveInput); EXPECT_FLOAT_EQ(zoomedController.GetFlySpeed(), baselineController.GetFlySpeed()); - const float zoomedTravel = (zoomedController.GetPosition() - zoomedInitialPosition).Magnitude(); - const float baselineTravel = (baselineController.GetPosition() - baselineInitialPosition).Magnitude(); + const float zoomedTravel = (zoomedController.GetPosition() - zoomedPositionBeforeMove).Magnitude(); + const float baselineTravel = (baselineController.GetPosition() - baselinePositionBeforeMove).Magnitude(); EXPECT_NEAR(zoomedTravel, baselineTravel, 1e-3f); } diff --git a/tests/editor/test_script_component_editor_utils.cpp b/tests/editor/test_script_component_editor_utils.cpp new file mode 100644 index 00000000..b98f4917 --- /dev/null +++ b/tests/editor/test_script_component_editor_utils.cpp @@ -0,0 +1,135 @@ +#include + +#include "ComponentEditors/ScriptComponentEditorUtils.h" + +#include + +namespace XCEngine::Editor { +namespace { + +TEST(ScriptComponentEditorUtils_Test, BuildsReadableScriptClassDisplayNames) { + const ::XCEngine::Scripting::ScriptClassDescriptor gameScript{ + "GameScripts", + "Gameplay", + "PlayerController" + }; + const ::XCEngine::Scripting::ScriptClassDescriptor toolScript{ + "EditorTools", + "Gameplay", + "PlayerController" + }; + + EXPECT_EQ( + ScriptComponentEditorUtils::BuildScriptClassDisplayName(gameScript), + "Gameplay.PlayerController"); + EXPECT_EQ( + ScriptComponentEditorUtils::BuildScriptClassDisplayName(toolScript), + "Gameplay.PlayerController (EditorTools)"); + + ::XCEngine::Scripting::ScriptComponent component; + component.SetScriptClass("GameScripts", "ProjectScripts", "Mover"); + EXPECT_EQ( + ScriptComponentEditorUtils::BuildScriptClassDisplayName(component), + "ProjectScripts.Mover"); +} + +TEST(ScriptComponentEditorUtils_Test, FindsGameObjectIdsByUuidAcrossHierarchy) { + ::XCEngine::Components::GameObject root("Root"); + ::XCEngine::Components::GameObject child("Child"); + ::XCEngine::Components::GameObject grandChild("GrandChild"); + + child.SetParent(&root); + grandChild.SetParent(&child); + + const std::vector<::XCEngine::Components::GameObject*> roots = { &root }; + EXPECT_EQ( + ScriptComponentEditorUtils::FindGameObjectIdByUuid(roots, child.GetUUID()), + child.GetID()); + EXPECT_EQ( + ScriptComponentEditorUtils::FindGameObjectIdByUuid(roots, grandChild.GetUUID()), + grandChild.GetID()); + EXPECT_EQ( + ScriptComponentEditorUtils::FindGameObjectIdByUuid(roots, 0), + ::XCEngine::Components::GameObject::INVALID_ID); +} + +TEST(ScriptComponentEditorUtils_Test, ReportsFieldEditabilityClearabilityAndIssues) { + ::XCEngine::Scripting::ScriptFieldSnapshot declaredField; + declaredField.metadata = { "Health", ::XCEngine::Scripting::ScriptFieldType::Int32 }; + declaredField.declaredInClass = true; + + ::XCEngine::Scripting::ScriptFieldSnapshot storedOnlyField; + storedOnlyField.metadata = { "LegacyValue", ::XCEngine::Scripting::ScriptFieldType::String }; + storedOnlyField.hasValue = true; + storedOnlyField.value = std::string("legacy"); + storedOnlyField.valueSource = ::XCEngine::Scripting::ScriptFieldValueSource::StoredValue; + storedOnlyField.issue = ::XCEngine::Scripting::ScriptFieldIssue::StoredOnly; + storedOnlyField.hasStoredValue = true; + storedOnlyField.storedType = ::XCEngine::Scripting::ScriptFieldType::String; + storedOnlyField.storedValue = std::string("legacy"); + + ::XCEngine::Scripting::ScriptFieldSnapshot mismatchedField; + mismatchedField.metadata = { "Speed", ::XCEngine::Scripting::ScriptFieldType::Float }; + mismatchedField.declaredInClass = true; + mismatchedField.issue = ::XCEngine::Scripting::ScriptFieldIssue::TypeMismatch; + mismatchedField.hasStoredValue = true; + mismatchedField.storedType = ::XCEngine::Scripting::ScriptFieldType::UInt64; + mismatchedField.storedValue = uint64_t(5); + + EXPECT_TRUE(ScriptComponentEditorUtils::CanEditScriptField( + ::XCEngine::Scripting::ScriptFieldClassStatus::Available, + declaredField)); + EXPECT_FALSE(ScriptComponentEditorUtils::CanEditScriptField( + ::XCEngine::Scripting::ScriptFieldClassStatus::Available, + storedOnlyField)); + EXPECT_TRUE(ScriptComponentEditorUtils::CanEditScriptField( + ::XCEngine::Scripting::ScriptFieldClassStatus::Missing, + storedOnlyField)); + + EXPECT_FALSE(ScriptComponentEditorUtils::CanClearScriptFieldOverride(declaredField)); + EXPECT_TRUE(ScriptComponentEditorUtils::CanClearScriptFieldOverride(storedOnlyField)); + EXPECT_TRUE(ScriptComponentEditorUtils::CanClearScriptFieldOverride(mismatchedField)); + + EXPECT_EQ( + ScriptComponentEditorUtils::BuildScriptFieldIssueText(storedOnlyField), + "Stored override is not declared by the selected script."); + EXPECT_EQ( + ScriptComponentEditorUtils::BuildScriptFieldIssueText(mismatchedField), + "Stored override type is UInt64, but the script field expects Float."); +} + +TEST(ScriptComponentEditorUtils_Test, BuildsRuntimeUnavailableHintsAndReloadAvailability) { + EditorScriptRuntimeStatus missingAssembliesStatus; + missingAssembliesStatus.backendEnabled = true; + missingAssembliesStatus.assemblyDirectory = "D:/Project/Library/ScriptAssemblies"; + missingAssembliesStatus.statusMessage = + "Script assemblies were not found in D:/Project/Library/ScriptAssemblies. " + "Script class discovery is disabled until the managed assemblies are built."; + + EXPECT_EQ( + ScriptComponentEditorUtils::BuildScriptRuntimeUnavailableHint(missingAssembliesStatus), + missingAssembliesStatus.statusMessage); + EXPECT_TRUE(ScriptComponentEditorUtils::CanReloadScriptRuntime(missingAssembliesStatus)); + EXPECT_TRUE(ScriptComponentEditorUtils::CanRebuildScriptAssemblies(missingAssembliesStatus)); + + EditorScriptRuntimeStatus fallbackStatus; + fallbackStatus.backendEnabled = true; + fallbackStatus.assemblyDirectory = "D:/Project/Library/ScriptAssemblies"; + + EXPECT_EQ( + ScriptComponentEditorUtils::BuildScriptRuntimeUnavailableHint(fallbackStatus), + "No script assemblies are currently loaded from D:/Project/Library/ScriptAssemblies."); + EXPECT_TRUE(ScriptComponentEditorUtils::CanReloadScriptRuntime(fallbackStatus)); + EXPECT_TRUE(ScriptComponentEditorUtils::CanRebuildScriptAssemblies(fallbackStatus)); + + EditorScriptRuntimeStatus backendDisabledStatus; + + EXPECT_EQ( + ScriptComponentEditorUtils::BuildScriptRuntimeUnavailableHint(backendDisabledStatus), + "This editor build does not include Mono scripting support."); + EXPECT_FALSE(ScriptComponentEditorUtils::CanReloadScriptRuntime(backendDisabledStatus)); + EXPECT_FALSE(ScriptComponentEditorUtils::CanRebuildScriptAssemblies(backendDisabledStatus)); +} + +} // namespace +} // namespace XCEngine::Editor diff --git a/tests/scripting/CMakeLists.txt b/tests/scripting/CMakeLists.txt index 75f8dcde..a519147a 100644 --- a/tests/scripting/CMakeLists.txt +++ b/tests/scripting/CMakeLists.txt @@ -12,6 +12,12 @@ if(XCENGINE_ENABLE_MONO_SCRIPTING) list(APPEND SCRIPTING_TEST_SOURCES test_mono_script_runtime.cpp ) + + if(TARGET xcengine_project_managed_assemblies) + list(APPEND SCRIPTING_TEST_SOURCES + test_project_script_assembly.cpp + ) + endif() endif() add_executable(scripting_tests ${SCRIPTING_TEST_SOURCES}) @@ -46,6 +52,20 @@ if(TARGET xcengine_managed_assemblies) ) endif() +if(TARGET xcengine_project_managed_assemblies) + add_dependencies(scripting_tests xcengine_project_managed_assemblies) + + file(TO_CMAKE_PATH "${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}" XCENGINE_PROJECT_MANAGED_OUTPUT_DIR_CMAKE) + file(TO_CMAKE_PATH "${XCENGINE_PROJECT_SCRIPT_CORE_DLL}" XCENGINE_PROJECT_SCRIPT_CORE_DLL_CMAKE) + file(TO_CMAKE_PATH "${XCENGINE_PROJECT_GAME_SCRIPTS_DLL}" XCENGINE_PROJECT_GAME_SCRIPTS_DLL_CMAKE) + + target_compile_definitions(scripting_tests PRIVATE + XCENGINE_TEST_PROJECT_MANAGED_OUTPUT_DIR=\"${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR_CMAKE}\" + XCENGINE_TEST_PROJECT_SCRIPT_CORE_DLL=\"${XCENGINE_PROJECT_SCRIPT_CORE_DLL_CMAKE}\" + XCENGINE_TEST_PROJECT_GAME_SCRIPTS_DLL=\"${XCENGINE_PROJECT_GAME_SCRIPTS_DLL_CMAKE}\" + ) +endif() + if(WIN32 AND EXISTS "${CMAKE_SOURCE_DIR}/engine/third_party/assimp/bin/assimp-vc143-mt.dll") add_custom_command(TARGET scripting_tests POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different diff --git a/tests/scripting/test_mono_script_runtime.cpp b/tests/scripting/test_mono_script_runtime.cpp index 3fc21797..43db1513 100644 --- a/tests/scripting/test_mono_script_runtime.cpp +++ b/tests/scripting/test_mono_script_runtime.cpp @@ -4,8 +4,13 @@ #include #include #include +#include +#include +#include #include #include +#include +#include #include #include #include @@ -28,6 +33,30 @@ void ExpectVector3Near(const XCEngine::Math::Vector3& actual, const XCEngine::Ma EXPECT_NEAR(actual.z, expected.z, tolerance); } +class CapturingLogSink final : public XCEngine::Debug::ILogSink { +public: + void Log(const XCEngine::Debug::LogEntry& entry) override { + entries.push_back(entry); + } + + void Flush() override { + } + + std::vector CollectMessagesWithPrefix(const char* prefix) const { + std::vector messages; + for (const XCEngine::Debug::LogEntry& entry : entries) { + const std::string message = entry.message.CStr(); + if (message.rfind(prefix, 0) == 0) { + messages.push_back(message); + } + } + + return messages; + } + + std::vector entries; +}; + ScriptComponent* FindScriptComponentByClass(GameObject* gameObject, const std::string& namespaceName, const std::string& className) { if (!gameObject) { return nullptr; @@ -60,6 +89,8 @@ protected: void SetUp() override { engine = &ScriptEngine::Get(); engine->OnRuntimeStop(); + engine->SetRuntimeFixedDeltaTime(ScriptEngine::DefaultFixedDeltaTime); + XCEngine::Input::InputManager::Get().Shutdown(); runtime = std::make_unique(CreateMonoSettings()); ASSERT_TRUE(runtime->Initialize()) << runtime->GetLastError(); @@ -70,6 +101,7 @@ protected: void TearDown() override { engine->OnRuntimeStop(); engine->SetRuntime(nullptr); + XCEngine::Input::InputManager::Get().Shutdown(); runtime.reset(); scene.reset(); } @@ -100,6 +132,44 @@ TEST_F(MonoScriptRuntimeTest, InitializesAndDiscoversConcreteMonoBehaviourClasse EXPECT_EQ(std::find(classNames.begin(), classNames.end(), "Gameplay.UtilityHelper"), classNames.end()); } +TEST_F(MonoScriptRuntimeTest, ScriptClassDescriptorApiReturnsConcreteManagedTypes) { + std::vector classes; + ASSERT_TRUE(runtime->TryGetAvailableScriptClasses(classes)); + ASSERT_FALSE(classes.empty()); + + EXPECT_TRUE(std::is_sorted( + classes.begin(), + classes.end(), + [](const ScriptClassDescriptor& lhs, const ScriptClassDescriptor& rhs) { + if (lhs.assemblyName != rhs.assemblyName) { + return lhs.assemblyName < rhs.assemblyName; + } + if (lhs.namespaceName != rhs.namespaceName) { + return lhs.namespaceName < rhs.namespaceName; + } + return lhs.className < rhs.className; + })); + + EXPECT_NE( + std::find( + classes.begin(), + classes.end(), + ScriptClassDescriptor{"GameScripts", "Gameplay", "LifecycleProbe"}), + classes.end()); + EXPECT_EQ( + std::find( + classes.begin(), + classes.end(), + ScriptClassDescriptor{"GameScripts", "Gameplay", "AbstractLifecycleProbe"}), + classes.end()); + EXPECT_EQ( + std::find( + classes.begin(), + classes.end(), + ScriptClassDescriptor{"GameScripts", "Gameplay", "UtilityHelper"}), + classes.end()); +} + TEST_F(MonoScriptRuntimeTest, ClassFieldMetadataListsSupportedPublicInstanceFields) { std::vector fields; @@ -184,6 +254,8 @@ TEST_F(MonoScriptRuntimeTest, ScriptEngineAppliesStoredFieldsAndInvokesLifecycle bool observedIsActiveAndEnabled = false; float speed = 0.0f; float observedFixedDeltaTime = 0.0f; + float observedConfiguredFixedDeltaTime = 0.0f; + float observedConfiguredFixedDeltaTimeInUpdate = 0.0f; float observedUpdateDeltaTime = 0.0f; float observedLateDeltaTime = 0.0f; std::string label; @@ -219,6 +291,8 @@ TEST_F(MonoScriptRuntimeTest, ScriptEngineAppliesStoredFieldsAndInvokesLifecycle EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedIsActiveAndEnabled", observedIsActiveAndEnabled)); EXPECT_TRUE(runtime->TryGetFieldValue(component, "Speed", speed)); EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedFixedDeltaTime", observedFixedDeltaTime)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedConfiguredFixedDeltaTime", observedConfiguredFixedDeltaTime)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedConfiguredFixedDeltaTimeInUpdate", observedConfiguredFixedDeltaTimeInUpdate)); EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdateDeltaTime", observedUpdateDeltaTime)); EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedLateDeltaTime", observedLateDeltaTime)); EXPECT_TRUE(runtime->TryGetFieldValue(component, "Label", label)); @@ -254,6 +328,8 @@ TEST_F(MonoScriptRuntimeTest, ScriptEngineAppliesStoredFieldsAndInvokesLifecycle EXPECT_TRUE(observedIsActiveAndEnabled); EXPECT_FLOAT_EQ(speed, 6.0f); EXPECT_FLOAT_EQ(observedFixedDeltaTime, 0.02f); + EXPECT_FLOAT_EQ(observedConfiguredFixedDeltaTime, 0.02f); + EXPECT_FLOAT_EQ(observedConfiguredFixedDeltaTimeInUpdate, 0.02f); EXPECT_FLOAT_EQ(observedUpdateDeltaTime, 0.016f); EXPECT_FLOAT_EQ(observedLateDeltaTime, 0.016f); EXPECT_EQ(label, "Configured|Awake"); @@ -276,6 +352,233 @@ TEST_F(MonoScriptRuntimeTest, ScriptEngineAppliesStoredFieldsAndInvokesLifecycle EXPECT_FLOAT_EQ(localRotation.w, 0.8660254f); } +TEST_F(MonoScriptRuntimeTest, TimeFixedDeltaTimeUsesConfiguredRuntimeStepAcrossFixedAndVariableUpdates) { + Scene* runtimeScene = CreateScene("MonoRuntimeScene"); + GameObject* host = runtimeScene->CreateGameObject("Host"); + ScriptComponent* component = AddScript(host, "Gameplay", "LifecycleProbe"); + + engine->SetRuntimeFixedDeltaTime(0.05f); + engine->OnRuntimeStart(runtimeScene); + engine->OnFixedUpdate(0.05f); + engine->OnUpdate(0.016f); + + float observedFixedDeltaTime = 0.0f; + float observedConfiguredFixedDeltaTime = 0.0f; + float observedConfiguredFixedDeltaTimeInUpdate = 0.0f; + float observedUpdateDeltaTime = 0.0f; + + ASSERT_TRUE(runtime->TryGetFieldValue(component, "ObservedFixedDeltaTime", observedFixedDeltaTime)); + ASSERT_TRUE(runtime->TryGetFieldValue(component, "ObservedConfiguredFixedDeltaTime", observedConfiguredFixedDeltaTime)); + ASSERT_TRUE(runtime->TryGetFieldValue(component, "ObservedConfiguredFixedDeltaTimeInUpdate", observedConfiguredFixedDeltaTimeInUpdate)); + ASSERT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdateDeltaTime", observedUpdateDeltaTime)); + + EXPECT_FLOAT_EQ(observedFixedDeltaTime, 0.05f); + EXPECT_FLOAT_EQ(observedConfiguredFixedDeltaTime, 0.05f); + EXPECT_FLOAT_EQ(observedConfiguredFixedDeltaTimeInUpdate, 0.05f); + EXPECT_FLOAT_EQ(observedUpdateDeltaTime, 0.016f); +} + +TEST_F(MonoScriptRuntimeTest, ManagedInputApiReadsCurrentNativeInputManagerState) { + XCEngine::Input::InputManager& inputManager = XCEngine::Input::InputManager::Get(); + inputManager.Initialize(nullptr); + + Scene* runtimeScene = CreateScene("MonoRuntimeScene"); + GameObject* host = runtimeScene->CreateGameObject("Host"); + ScriptComponent* component = AddScript(host, "Gameplay", "InputProbe"); + + engine->OnRuntimeStart(runtimeScene); + + inputManager.ProcessKeyDown(XCEngine::Input::KeyCode::A, false, false, false, false, false); + inputManager.ProcessKeyDown(XCEngine::Input::KeyCode::Space, false, false, false, false, false); + inputManager.ProcessKeyDown(XCEngine::Input::KeyCode::LeftCtrl, false, false, false, false, false); + inputManager.ProcessMouseButton(XCEngine::Input::MouseButton::Left, true, 120, 48); + inputManager.ProcessMouseMove(120, 48, 3, -2); + inputManager.ProcessMouseWheel(1.0f, 120, 48); + engine->OnUpdate(0.016f); + + int32_t updateCount = 0; + bool observedKeyA = false; + bool observedKeyADown = false; + bool observedKeyAUp = false; + bool observedKeySpace = false; + bool observedJump = false; + bool observedJumpDown = false; + bool observedJumpUp = false; + bool observedFire1 = false; + bool observedFire1Down = false; + bool observedFire1Up = false; + bool observedAnyKey = false; + bool observedAnyKeyDown = false; + bool observedLeftMouse = false; + bool observedLeftMouseDown = false; + bool observedLeftMouseUp = false; + float observedHorizontal = 0.0f; + float observedHorizontalRaw = 0.0f; + XCEngine::Math::Vector2 observedMouseScrollDelta; + XCEngine::Math::Vector3 observedMousePosition; + + EXPECT_TRUE(runtime->TryGetFieldValue(component, "UpdateCount", updateCount)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeyA", observedKeyA)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeyADown", observedKeyADown)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeyAUp", observedKeyAUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeySpace", observedKeySpace)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJump", observedJump)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJumpDown", observedJumpDown)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJumpUp", observedJumpUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedFire1", observedFire1)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedFire1Down", observedFire1Down)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedFire1Up", observedFire1Up)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedAnyKey", observedAnyKey)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedAnyKeyDown", observedAnyKeyDown)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedLeftMouse", observedLeftMouse)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedLeftMouseDown", observedLeftMouseDown)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedLeftMouseUp", observedLeftMouseUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedHorizontal", observedHorizontal)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedHorizontalRaw", observedHorizontalRaw)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedMousePosition", observedMousePosition)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedMouseScrollDelta", observedMouseScrollDelta)); + + EXPECT_EQ(updateCount, 1); + EXPECT_TRUE(observedKeyA); + EXPECT_TRUE(observedKeyADown); + EXPECT_FALSE(observedKeyAUp); + EXPECT_TRUE(observedKeySpace); + EXPECT_TRUE(observedJump); + EXPECT_TRUE(observedJumpDown); + EXPECT_FALSE(observedJumpUp); + EXPECT_TRUE(observedFire1); + EXPECT_TRUE(observedFire1Down); + EXPECT_FALSE(observedFire1Up); + EXPECT_TRUE(observedAnyKey); + EXPECT_TRUE(observedAnyKeyDown); + EXPECT_TRUE(observedLeftMouse); + EXPECT_TRUE(observedLeftMouseDown); + EXPECT_FALSE(observedLeftMouseUp); + EXPECT_FLOAT_EQ(observedHorizontal, -1.0f); + EXPECT_FLOAT_EQ(observedHorizontalRaw, -1.0f); + EXPECT_EQ(observedMousePosition, XCEngine::Math::Vector3(120.0f, 48.0f, 0.0f)); + EXPECT_EQ(observedMouseScrollDelta, XCEngine::Math::Vector2(0.0f, 1.0f)); + + inputManager.Update(0.016f); + engine->OnUpdate(0.016f); + + EXPECT_TRUE(runtime->TryGetFieldValue(component, "UpdateCount", updateCount)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeyA", observedKeyA)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeyADown", observedKeyADown)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeyAUp", observedKeyAUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJump", observedJump)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJumpDown", observedJumpDown)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJumpUp", observedJumpUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedFire1", observedFire1)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedFire1Down", observedFire1Down)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedFire1Up", observedFire1Up)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedAnyKey", observedAnyKey)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedAnyKeyDown", observedAnyKeyDown)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedLeftMouse", observedLeftMouse)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedLeftMouseDown", observedLeftMouseDown)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedLeftMouseUp", observedLeftMouseUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedHorizontalRaw", observedHorizontalRaw)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedMouseScrollDelta", observedMouseScrollDelta)); + + EXPECT_EQ(updateCount, 2); + EXPECT_TRUE(observedKeyA); + EXPECT_FALSE(observedKeyADown); + EXPECT_FALSE(observedKeyAUp); + EXPECT_TRUE(observedJump); + EXPECT_FALSE(observedJumpDown); + EXPECT_FALSE(observedJumpUp); + EXPECT_TRUE(observedFire1); + EXPECT_FALSE(observedFire1Down); + EXPECT_FALSE(observedFire1Up); + EXPECT_TRUE(observedAnyKey); + EXPECT_FALSE(observedAnyKeyDown); + EXPECT_TRUE(observedLeftMouse); + EXPECT_FALSE(observedLeftMouseDown); + EXPECT_FALSE(observedLeftMouseUp); + EXPECT_FLOAT_EQ(observedHorizontalRaw, -1.0f); + EXPECT_EQ(observedMouseScrollDelta, XCEngine::Math::Vector2(0.0f, 0.0f)); + + inputManager.ProcessKeyUp(XCEngine::Input::KeyCode::A, false, false, false, false); + inputManager.ProcessKeyUp(XCEngine::Input::KeyCode::LeftCtrl, false, false, false, false); + inputManager.ProcessMouseButton(XCEngine::Input::MouseButton::Left, false, 120, 48); + engine->OnUpdate(0.016f); + + EXPECT_TRUE(runtime->TryGetFieldValue(component, "UpdateCount", updateCount)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeyA", observedKeyA)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeyAUp", observedKeyAUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJump", observedJump)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJumpUp", observedJumpUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedFire1", observedFire1)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedFire1Up", observedFire1Up)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedAnyKey", observedAnyKey)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedAnyKeyDown", observedAnyKeyDown)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedLeftMouse", observedLeftMouse)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedLeftMouseUp", observedLeftMouseUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedHorizontal", observedHorizontal)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedHorizontalRaw", observedHorizontalRaw)); + + EXPECT_EQ(updateCount, 3); + EXPECT_FALSE(observedKeyA); + EXPECT_TRUE(observedKeyAUp); + EXPECT_TRUE(observedJump); + EXPECT_FALSE(observedJumpUp); + EXPECT_FALSE(observedFire1); + EXPECT_TRUE(observedFire1Up); + EXPECT_TRUE(observedAnyKey); + EXPECT_FALSE(observedAnyKeyDown); + EXPECT_FALSE(observedLeftMouse); + EXPECT_TRUE(observedLeftMouseUp); + EXPECT_FLOAT_EQ(observedHorizontal, 0.0f); + EXPECT_FLOAT_EQ(observedHorizontalRaw, 0.0f); + + inputManager.Update(0.016f); + inputManager.ProcessKeyUp(XCEngine::Input::KeyCode::Space, false, false, false, false); + engine->OnUpdate(0.016f); + + EXPECT_TRUE(runtime->TryGetFieldValue(component, "UpdateCount", updateCount)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedKeySpace", observedKeySpace)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJump", observedJump)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedJumpUp", observedJumpUp)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedAnyKey", observedAnyKey)); + EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedAnyKeyDown", observedAnyKeyDown)); + + EXPECT_EQ(updateCount, 4); + EXPECT_FALSE(observedKeySpace); + EXPECT_FALSE(observedJump); + EXPECT_TRUE(observedJumpUp); + EXPECT_FALSE(observedAnyKey); + EXPECT_FALSE(observedAnyKeyDown); +} + +TEST_F(MonoScriptRuntimeTest, ManagedDebugLogBridgeWritesLifecycleTickMessagesToNativeLogger) { + auto sink = std::make_unique(); + CapturingLogSink* sinkPtr = sink.get(); + XCEngine::Debug::Logger::Get().AddSink(std::move(sink)); + + Scene* runtimeScene = CreateScene("MonoRuntimeScene"); + GameObject* host = runtimeScene->CreateGameObject("Host"); + ScriptComponent* component = AddScript(host, "Gameplay", "TickLogProbe"); + ASSERT_NE(component, nullptr); + + engine->OnRuntimeStart(runtimeScene); + engine->OnFixedUpdate(0.02f); + engine->OnUpdate(0.016f); + engine->OnLateUpdate(0.016f); + + const std::vector messages = sinkPtr->CollectMessagesWithPrefix("[TickLogProbe]"); + const std::vector expected = { + "[TickLogProbe] Awake", + "[TickLogProbe] FixedUpdate 1", + "[TickLogProbe] Start", + "[TickLogProbe] Update 1", + "[TickLogProbe] LateUpdate 1", + }; + + EXPECT_EQ(messages, expected); + + XCEngine::Debug::Logger::Get().RemoveSink(sinkPtr); +} + TEST_F(MonoScriptRuntimeTest, DeserializedSceneRebindsManagedScriptsAndRestoresStoredFields) { Scene originalScene("SerializedMonoScene"); GameObject* hostA = originalScene.CreateGameObject("HostA"); diff --git a/tests/scripting/test_project_script_assembly.cpp b/tests/scripting/test_project_script_assembly.cpp new file mode 100644 index 00000000..3a1a6233 --- /dev/null +++ b/tests/scripting/test_project_script_assembly.cpp @@ -0,0 +1,87 @@ +#include + +#include + +#include +#include +#include +#include +#include + +using namespace XCEngine::Scripting; + +namespace { + +MonoScriptRuntime::Settings CreateProjectMonoSettings() { + MonoScriptRuntime::Settings settings; + settings.assemblyDirectory = XCENGINE_TEST_PROJECT_MANAGED_OUTPUT_DIR; + settings.corlibDirectory = XCENGINE_TEST_PROJECT_MANAGED_OUTPUT_DIR; + settings.coreAssemblyPath = XCENGINE_TEST_PROJECT_SCRIPT_CORE_DLL; + settings.appAssemblyPath = XCENGINE_TEST_PROJECT_GAME_SCRIPTS_DLL; + return settings; +} + +class ProjectScriptAssemblyTest : public ::testing::Test { +protected: + void SetUp() override { + ASSERT_TRUE(std::filesystem::exists(XCENGINE_TEST_PROJECT_SCRIPT_CORE_DLL)); + ASSERT_TRUE(std::filesystem::exists(XCENGINE_TEST_PROJECT_GAME_SCRIPTS_DLL)); + + runtime = std::make_unique(CreateProjectMonoSettings()); + ASSERT_TRUE(runtime->Initialize()) << runtime->GetLastError(); + } + + std::unique_ptr runtime; +}; + +TEST_F(ProjectScriptAssemblyTest, InitializesFromProjectScriptAssemblyDirectory) { + EXPECT_TRUE(runtime->IsInitialized()); + EXPECT_EQ(runtime->GetSettings().assemblyDirectory, std::filesystem::path(XCENGINE_TEST_PROJECT_MANAGED_OUTPUT_DIR)); + EXPECT_EQ(runtime->GetSettings().appAssemblyPath, std::filesystem::path(XCENGINE_TEST_PROJECT_GAME_SCRIPTS_DLL)); +} + +TEST_F(ProjectScriptAssemblyTest, DiscoversProjectAssetMonoBehaviourClassesAndFieldMetadata) { + const std::vector classNames = runtime->GetScriptClassNames("GameScripts"); + std::vector classDescriptors; + ASSERT_TRUE(runtime->TryGetAvailableScriptClasses(classDescriptors)); + + EXPECT_TRUE(runtime->IsClassAvailable("GameScripts", "ProjectScripts", "ProjectScriptProbe")); + EXPECT_NE( + std::find(classNames.begin(), classNames.end(), "ProjectScripts.ProjectScriptProbe"), + classNames.end()); + EXPECT_NE( + std::find( + classDescriptors.begin(), + classDescriptors.end(), + ScriptClassDescriptor{"GameScripts", "ProjectScripts", "ProjectScriptProbe"}), + classDescriptors.end()); + + std::vector fields; + ASSERT_TRUE(runtime->TryGetClassFieldMetadata("GameScripts", "ProjectScripts", "ProjectScriptProbe", fields)); + + const std::vector expectedFields = { + {"EnabledOnBoot", ScriptFieldType::Bool}, + {"Label", ScriptFieldType::String}, + {"Speed", ScriptFieldType::Float}, + }; + + EXPECT_EQ(fields, expectedFields); + + std::vector defaultValues; + ASSERT_TRUE(runtime->TryGetClassFieldDefaultValues("GameScripts", "ProjectScripts", "ProjectScriptProbe", defaultValues)); + ASSERT_EQ(defaultValues.size(), 3u); + + EXPECT_EQ(defaultValues[0].fieldName, "EnabledOnBoot"); + EXPECT_EQ(defaultValues[0].type, ScriptFieldType::Bool); + EXPECT_EQ(std::get(defaultValues[0].value), true); + + EXPECT_EQ(defaultValues[1].fieldName, "Label"); + EXPECT_EQ(defaultValues[1].type, ScriptFieldType::String); + EXPECT_EQ(std::get(defaultValues[1].value), "ProjectScriptProbe"); + + EXPECT_EQ(defaultValues[2].fieldName, "Speed"); + EXPECT_EQ(defaultValues[2].type, ScriptFieldType::Float); + EXPECT_FLOAT_EQ(std::get(defaultValues[2].value), 2.5f); +} + +} // namespace diff --git a/tests/scripting/test_script_engine.cpp b/tests/scripting/test_script_engine.cpp index 012ceb27..d0582013 100644 --- a/tests/scripting/test_script_engine.cpp +++ b/tests/scripting/test_script_engine.cpp @@ -42,6 +42,12 @@ public: events.push_back("RuntimeStop:" + (scene ? scene->GetName() : std::string("null"))); } + bool TryGetAvailableScriptClasses( + std::vector& outClasses) const override { + outClasses = scriptClasses; + return true; + } + bool TryGetClassFieldMetadata( const std::string& assemblyName, const std::string& namespaceName, @@ -117,6 +123,7 @@ public: } std::vector events; + std::vector scriptClasses; std::vector fieldMetadata; std::vector fieldDefaultValues; std::unordered_map managedFieldValues; @@ -325,6 +332,83 @@ TEST_F(ScriptEngineTest, RuntimeCreatedScriptComponentIsTrackedImmediatelyAndSta EXPECT_EQ(runtime.events, expectedAfterUpdate); } +TEST_F(ScriptEngineTest, ScriptClassDiscoveryApiReturnsSortedDescriptorsAndSupportsAssemblyFilter) { + runtime.scriptClasses = { + {"Tools", "", "UtilityProbe"}, + {"GameScripts", "Gameplay", "Zombie"}, + {"GameScripts", "", "Bootstrap"}, + {"GameScripts", "Gameplay", "Actor"}, + {"Broken", "", ""} + }; + + std::vector allClasses; + ASSERT_TRUE(engine->TryGetAvailableScriptClasses(allClasses)); + + const std::vector expectedAllClasses = { + {"GameScripts", "", "Bootstrap"}, + {"GameScripts", "Gameplay", "Actor"}, + {"GameScripts", "Gameplay", "Zombie"}, + {"Tools", "", "UtilityProbe"} + }; + EXPECT_EQ(allClasses, expectedAllClasses); + EXPECT_EQ(allClasses[0].GetFullName(), "Bootstrap"); + EXPECT_EQ(allClasses[1].GetFullName(), "Gameplay.Actor"); + + std::vector gameScriptClasses; + ASSERT_TRUE(engine->TryGetAvailableScriptClasses(gameScriptClasses, "GameScripts")); + + const std::vector expectedGameScriptClasses = { + {"GameScripts", "", "Bootstrap"}, + {"GameScripts", "Gameplay", "Actor"}, + {"GameScripts", "Gameplay", "Zombie"} + }; + EXPECT_EQ(gameScriptClasses, expectedGameScriptClasses); +} + +TEST_F(ScriptEngineTest, ChangingScriptClassWhileRuntimeRunningRecreatesTrackedInstance) { + Scene* runtimeScene = CreateScene("RuntimeScene"); + GameObject* host = runtimeScene->CreateGameObject("Host"); + ScriptComponent* component = AddScriptComponent(host, "Gameplay", "OldClass"); + + engine->OnRuntimeStart(runtimeScene); + runtime.Clear(); + + component->SetScriptClass("GameScripts", "Gameplay", "NewClass"); + + const std::vector expected = { + "OnDisable:Host:Gameplay.NewClass", + "OnDestroy:Host:Gameplay.NewClass", + "Destroy:Host:Gameplay.NewClass", + "Create:Host:Gameplay.NewClass", + "Awake:Host:Gameplay.NewClass", + "OnEnable:Host:Gameplay.NewClass" + }; + EXPECT_EQ(runtime.events, expected); + EXPECT_TRUE(engine->HasTrackedScriptComponent(component)); + EXPECT_TRUE(engine->HasRuntimeInstance(component)); +} + +TEST_F(ScriptEngineTest, ClearingScriptClassWhileRuntimeRunningDestroysTrackedInstance) { + Scene* runtimeScene = CreateScene("RuntimeScene"); + GameObject* host = runtimeScene->CreateGameObject("Host"); + ScriptComponent* component = AddScriptComponent(host, "Gameplay", "OldClass"); + + engine->OnRuntimeStart(runtimeScene); + runtime.Clear(); + + component->ClearScriptClass(); + + const std::vector expected = { + "OnDisable:Host:", + "OnDestroy:Host:", + "Destroy:Host:" + }; + EXPECT_EQ(runtime.events, expected); + EXPECT_FALSE(engine->HasTrackedScriptComponent(component)); + EXPECT_FALSE(engine->HasRuntimeInstance(component)); + EXPECT_FALSE(component->HasScriptClass()); +} + TEST_F(ScriptEngineTest, FieldReadApiPrefersLiveManagedValueAndFallsBackToStoredValue) { Scene* runtimeScene = CreateScene("RuntimeScene"); GameObject* host = runtimeScene->CreateGameObject("Host");