2026-03-18 17:49:22 +08:00
|
|
|
|
# Mesh
|
|
|
|
|
|
|
|
|
|
|
|
**命名空间**: `XCEngine::Resources`
|
|
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
**类型**: `class` (inherits from `IResource`)
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
**头文件**: `XCEngine/Resources/Mesh.h`
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
**描述**: 网格资源类,用于存储和管理 3D 网格数据,包括顶点数据、索引数据和网格分段信息
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
## 概述
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
Mesh 类是 XCEngine 引擎中的核心资源类型之一,负责管理 3D 模型的网格数据。它存储顶点属性(位置、法线、切线、UV 坐标、骨骼权重等)、索引数据以及网格分段(MeshSection)信息。Mesh 资源通常由资源加载器从外部文件(如 .obj、.fbx 等格式)加载,或通过程序化方式生成。
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
|
|
|
|
|
## 公共方法
|
|
|
|
|
|
|
|
|
|
|
|
| 方法 | 描述 |
|
|
|
|
|
|
|------|------|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
| [`Mesh`](constructor.md) | 构造函数 |
|
|
|
|
|
|
| [`~Mesh`](destructor.md) | 析构函数 |
|
|
|
|
|
|
| [`GetType`](get-type.md) | 获取资源类型 |
|
|
|
|
|
|
| [`GetName`](get-name.md) | 获取资源名称 |
|
|
|
|
|
|
| [`GetPath`](get-path.md) | 获取资源路径 |
|
|
|
|
|
|
| [`GetGUID`](get-guid.md) | 获取资源全局唯一标识符 |
|
|
|
|
|
|
| [`IsValid`](is-valid.md) | 检查资源是否有效 |
|
|
|
|
|
|
| [`GetMemorySize`](get-memory-size.md) | 获取资源内存大小 |
|
|
|
|
|
|
| [`Release`](release.md) | 释放资源 |
|
|
|
|
|
|
| [`SetVertexData`](set-vertex-data.md) | 设置顶点数据 |
|
|
|
|
|
|
| [`GetVertexData`](get-vertex-data.md) | 获取顶点数据指针 |
|
|
|
|
|
|
| [`GetVertexDataSize`](get-vertex-data-size.md) | 获取顶点数据大小 |
|
|
|
|
|
|
| [`GetVertexCount`](get-vertex-count.md) | 获取顶点数量 |
|
|
|
|
|
|
| [`GetVertexStride`](get-vertex-stride.md) | 获取顶点步长 |
|
|
|
|
|
|
| [`GetVertexAttributes`](get-vertex-attributes.md) | 获取顶点属性 |
|
|
|
|
|
|
| [`SetIndexData`](set-index-data.md) | 设置索引数据 |
|
|
|
|
|
|
| [`GetIndexData`](get-index-data.md) | 获取索引数据指针 |
|
|
|
|
|
|
| [`GetIndexDataSize`](get-index-data-size.md) | 获取索引数据大小 |
|
|
|
|
|
|
| [`GetIndexCount`](get-index-count.md) | 获取索引数量 |
|
|
|
|
|
|
| [`IsUse32BitIndex`](is-use-32bit-index.md) | 是否使用 32 位索引 |
|
|
|
|
|
|
| [`AddSection`](add-section.md) | 添加网格分段 |
|
|
|
|
|
|
| [`GetSections`](get-sections.md) | 获取所有网格分段 |
|
|
|
|
|
|
|
|
|
|
|
|
## 相关类型
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
### VertexAttribute
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
```cpp
|
|
|
|
|
|
enum class VertexAttribute : Core::uint32 {
|
|
|
|
|
|
Position = 1 << 0,
|
|
|
|
|
|
Normal = 1 << 1,
|
|
|
|
|
|
Tangent = 1 << 2,
|
|
|
|
|
|
Color = 1 << 3,
|
|
|
|
|
|
UV0 = 1 << 4,
|
|
|
|
|
|
UV1 = 1 << 5,
|
|
|
|
|
|
UV2 = 1 << 6,
|
|
|
|
|
|
UV3 = 1 << 7,
|
|
|
|
|
|
BoneWeights = 1 << 8,
|
|
|
|
|
|
BoneIndices = 1 << 9
|
|
|
|
|
|
};
|
|
|
|
|
|
```
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
顶点属性枚举,用于指定网格包含哪些顶点数据通道。多个属性可以通过按位或组合使用。
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
### MeshSection
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
```cpp
|
|
|
|
|
|
struct MeshSection {
|
|
|
|
|
|
Core::uint32 baseVertex;
|
|
|
|
|
|
Core::uint32 vertexCount;
|
|
|
|
|
|
Core::uint32 startIndex;
|
|
|
|
|
|
Core::uint32 indexCount;
|
|
|
|
|
|
Core::uint32 materialID;
|
|
|
|
|
|
};
|
|
|
|
|
|
```
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
2026-03-20 02:35:35 +08:00
|
|
|
|
网格分段结构,描述网格中某个子网格的区域信息,包括顶点范围、索引范围和材质 ID。
|
2026-03-18 17:49:22 +08:00
|
|
|
|
|
|
|
|
|
|
## 使用示例
|
|
|
|
|
|
|
|
|
|
|
|
```cpp
|
2026-03-20 02:35:35 +08:00
|
|
|
|
#include "XCEngine/Resources/Mesh.h"
|
|
|
|
|
|
#include "XCEngine/Containers/Array.h"
|
|
|
|
|
|
|
|
|
|
|
|
using namespace XCEngine;
|
|
|
|
|
|
using namespace Resources;
|
|
|
|
|
|
|
|
|
|
|
|
void CreateQuadMesh(Mesh* outMesh) {
|
|
|
|
|
|
struct Vertex {
|
|
|
|
|
|
float position[3];
|
|
|
|
|
|
float normal[3];
|
|
|
|
|
|
float uv[2];
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Vertex vertices[4] = {
|
|
|
|
|
|
{{-0.5f, -0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 0.0f}},
|
|
|
|
|
|
{{ 0.5f, -0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}},
|
|
|
|
|
|
{{ 0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
|
|
|
|
|
|
{{-0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t indices[6] = {0, 1, 2, 0, 2, 3};
|
|
|
|
|
|
|
|
|
|
|
|
VertexAttribute attributes = VertexAttribute::Position |
|
|
|
|
|
|
VertexAttribute::Normal |
|
|
|
|
|
|
VertexAttribute::UV0;
|
|
|
|
|
|
|
|
|
|
|
|
outMesh->SetVertexData(vertices, sizeof(vertices), 4, sizeof(Vertex), attributes);
|
|
|
|
|
|
outMesh->SetIndexData(indices, sizeof(indices), 6, false);
|
|
|
|
|
|
|
|
|
|
|
|
MeshSection section;
|
|
|
|
|
|
section.baseVertex = 0;
|
|
|
|
|
|
section.vertexCount = 4;
|
|
|
|
|
|
section.startIndex = 0;
|
|
|
|
|
|
section.indexCount = 6;
|
|
|
|
|
|
section.materialID = 0;
|
|
|
|
|
|
outMesh->AddSection(section);
|
|
|
|
|
|
}
|
2026-03-18 17:49:22 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 相关文档
|
|
|
|
|
|
|
docs: 重构 API 文档结构并修正源码准确性
- 重组文档目录结构: 每个模块的概述页移动到模块子目录
- 重命名 index.md 为 main.md
- 修正所有模块文档中的错误:
- math: FromEuler→FromEulerAngles, TransformDirection 包含缩放, Box 是 OBB, Color::ToRGBA 格式
- containers: 新增 operator==/!= 文档, 补充 std::hash DJB 算法细节
- core: 修复 types 链接错误
- debug: LogLevelToString 返回大写, timestamp 是秒, Profiler 空实现标注, Windows API vs ANSI
- memory: 修复头文件路径, malloc vs operator new, 新增方法文档
- resources: 修复 Shader/Texture 链接错误
- threading: TaskSystem::Wait 空实现标注, ReadWriteLock 重入描述, LambdaTask 链接
- 验证: fix_links.py 确认 0 个断裂引用
2026-03-19 00:22:30 +08:00
|
|
|
|
- [IResource](../iresource/iresource.md) - 资源基类
|