Files
XCEngine/README.md

374 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# XCEngine
XCEngine 是一个正在持续开发中的模块化 C++ 游戏引擎。当前仓库已经形成了较完整的底座:
- `RHI` 抽象层已稳定覆盖 `D3D12 / OpenGL / Vulkan`
- `Rendering` 模块已经落地最小可用的场景渲染链路
- `editor/` 已接入基于引擎渲染链路的 Scene/Game viewport
- `managed/` 已具备基于 Mono 的 C# 运行时与托管程序集构建链路
- `tests/` 已形成按模块分层的单元测试与集成测试体系
如果你是第一次进入当前仓库,先看 [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/`,已包含基础场景、背包模型与脚本资产目录。
## 环境要求
建议在 Windows 上构建当前仓库。
- Windows 10/11
- Visual Studio 2022 / MSVC v143
- CMake 3.15+
- .NET SDK
- Vulkan SDK
- Git LFS
如果启用默认脚本构建,还需要:
- `参考/Fermion/Fermion/external/mono` 下可用的 Mono 头文件、静态库与 `mscorlib.dll`
如果本地暂时没有 Mono 依赖,可以在配置时关闭脚本构建:
```bash
cmake -S . -B build -A x64 -DXCENGINE_ENABLE_MONO_SCRIPTING=OFF
```
如果你需要 `mvs/3DGS-Unity/room.ply` 这类大文件样例,请确保已经执行过 Git LFS 拉取。
## 构建
### 1. 配置
```bash
cmake -S . -B build -A x64
```
### 2. 全量编译
```bash
cmake --build build --config Debug
```
### 3. 常用增量 target
```bash
cmake --build build --config Debug --target XCEngine
cmake --build build --config Debug --target XCVolumeRendererUI2
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 target 名称仍然是历史遗留的 `XCVolumeRendererUI2`,但输出文件名是 `XCEngine.exe`
- 顶层 CMake 当前会纳入 `engine/``editor/``managed/``mvs/RenderDoc/``tests/`
## 测试
推荐始终通过 CMake / CTest 驱动测试。
### 列出测试
```bash
ctest --test-dir build -N -C Debug
```
### 运行全部测试
```bash
ctest --test-dir build -C Debug --output-on-failure
```
### 常用测试 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 editor_tests
cmake --build build --config Debug --target scripting_tests
```
更完整的测试规则见 [tests/TEST_SPEC.md](tests/TEST_SPEC.md)。
## 目录结构
下面的目录树用于表达当前仓库的实际入口结构与模块边界。
```text
XCEngine/
├── .gitattributes
├── .gitignore
├── AGENT.md
├── CMakeLists.txt
├── README.md
├── build/ # 本地构建输出
├── docs/
│ ├── api/ # API 文档
│ ├── issues/ # 跟踪中的设计 / 实现问题
│ ├── plan/ # 设计文档、阶段规划、归档方案
│ │ ├── Renderer模块设计与实现.md
│ │ └── end/
│ │ └── RHI模块设计与实现/
│ │ └── RHI模块总览.md
│ ├── used/
│ ├── api-skill.md
│ ├── blueprint-skill.md
│ └── blueprint.md
├── editor/
│ ├── CMakeLists.txt
│ ├── README.md
│ ├── resources/
│ │ └── Icons/
│ ├── src/
│ │ ├── Actions/
│ │ ├── Commands/
│ │ ├── ComponentEditors/
│ │ ├── Core/
│ │ ├── Layers/
│ │ ├── Layout/
│ │ ├── Managers/
│ │ ├── panels/
│ │ ├── Platform/
│ │ ├── UI/
│ │ ├── Utils/
│ │ ├── Viewport/
│ │ ├── Application.cpp
│ │ ├── Application.h
│ │ ├── EditorApp.rc
│ │ ├── Theme.cpp
│ │ ├── Theme.h
│ │ └── main.cpp
│ └── bin/ # 编辑器输出目录,输出名为 XCEngine.exe
├── engine/
│ ├── CMakeLists.txt
│ ├── include/
│ │ └── XCEngine/
│ │ ├── Audio/
│ │ ├── Components/
│ │ ├── Core/
│ │ │ ├── Asset/
│ │ │ ├── Containers/
│ │ │ ├── IO/
│ │ │ └── Math/
│ │ ├── Debug/
│ │ ├── Input/
│ │ ├── Memory/
│ │ ├── Platform/
│ │ │ └── Windows/
│ │ ├── Rendering/
│ │ │ ├── Pipelines/
│ │ │ ├── CameraRenderRequest.h
│ │ │ ├── CameraRenderer.h
│ │ │ ├── RenderCameraData.h
│ │ │ ├── RenderContext.h
│ │ │ ├── RenderMaterialUtility.h
│ │ │ ├── RenderPipeline.h
│ │ │ ├── RenderPipelineAsset.h
│ │ │ ├── RenderResourceCache.h
│ │ │ ├── RenderSceneExtractor.h
│ │ │ ├── RenderSurface.h
│ │ │ ├── SceneRenderer.h
│ │ │ └── VisibleRenderObject.h
│ │ ├── Resources/
│ │ │ ├── AudioClip/
│ │ │ ├── Material/
│ │ │ ├── Mesh/
│ │ │ ├── Shader/
│ │ │ └── Texture/
│ │ ├── 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
│ │ ├── Scene/
│ │ ├── Scripting/
│ │ │ └── Mono/
│ │ └── Threading/
│ ├── src/
│ │ ├── Audio/
│ │ ├── Components/
│ │ ├── Core/
│ │ │ ├── Asset/
│ │ │ ├── Containers/
│ │ │ ├── IO/
│ │ │ └── Math/
│ │ ├── Debug/
│ │ ├── Input/
│ │ ├── Memory/
│ │ ├── Platform/
│ │ │ └── Windows/
│ │ ├── Rendering/
│ │ │ └── Pipelines/
│ │ ├── Resources/
│ │ │ ├── AudioClip/
│ │ │ ├── Material/
│ │ │ ├── Mesh/
│ │ │ ├── Shader/
│ │ │ └── Texture/
│ │ ├── RHI/
│ │ │ ├── D3D12/
│ │ │ ├── OpenGL/
│ │ │ └── Vulkan/
│ │ ├── Scene/
│ │ ├── Scripting/
│ │ │ └── Mono/
│ │ └── Threading/
│ ├── third_party/
│ │ ├── assimp/
│ │ ├── GLAD/
│ │ ├── kissfft/
│ │ ├── renderdoc/
│ │ └── stb/
│ └── tools/
│ └── renderdoc_parser/
├── managed/
│ ├── CMakeLists.txt
│ ├── GameScripts/ # 示例 / 验证脚本程序集源码
│ └── XCEngine.ScriptCore/ # 引擎托管 API
├── mvs/
│ ├── 3DGS-Unity/ # Unity 侧 3DGS 参考与资源
│ ├── D3D12/
│ ├── Music fluctuations/
│ ├── OpenGL/
│ ├── RenderDoc/
│ ├── Res/
│ ├── ui/
│ └── VolumeRenderer/
├── project/
│ ├── .xceditor/
│ │ └── imgui_layout.ini
│ ├── Assets/
│ │ ├── Materials/
│ │ ├── Models/
│ │ │ └── backpack/
│ │ ├── Scenes/
│ │ │ └── Main.xc
│ │ └── Scripts/
│ └── Project.xcproject
├── tests/
│ ├── CMakeLists.txt
│ ├── TEST_SPEC.md
│ ├── Components/
│ ├── Core/
│ │ ├── Asset/
│ │ ├── Containers/
│ │ ├── IO/
│ │ └── Math/
│ ├── Debug/
│ ├── Editor/
│ ├── Fixtures/
│ ├── Input/
│ ├── Memory/
│ ├── Rendering/
│ │ ├── integration/
│ │ │ ├── backpack_scene/
│ │ │ ├── cull_material_scene/
│ │ │ ├── depth_sort_scene/
│ │ │ ├── material_state_scene/
│ │ │ ├── offscreen_scene/
│ │ │ ├── textured_quad_scene/
│ │ │ └── transparent_material_scene/
│ │ └── unit/
│ ├── Resources/
│ │ ├── AudioClip/
│ │ ├── Material/
│ │ ├── Mesh/
│ │ ├── 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/
│ ├── Scene/
│ ├── Scripting/
│ └── Threading/
├── 参考/
│ └── TransformGizmo/
└── .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)
- 测试规范:[tests/TEST_SPEC.md](tests/TEST_SPEC.md)
## 许可证
当前仓库根目录未看到单独的顶层许可证文件;涉及第三方库时请分别遵循对应依赖目录中的许可证说明。