Files
XCEngine/docs/api/resources/resources-mesh.md

149 lines
4.2 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.
# Mesh
**命名空间**: `XCEngine::Resources`
**类型**: `class`
**描述**: 网格资源类,管理 3D 模型的顶点数据、索引数据和网格分段信息。
## 概述
`Mesh` 是 XCEngine 中的网格资源类,继承自 `IResource`。它管理网格的顶点数据位置、法线、UV、切线、颜色、骨骼权重等、索引数据和网格分段submesh
## 头文件
```cpp
#include <XCEngine/Resources/Mesh.h>
```
## 枚举类型
### VertexAttribute
顶点属性标志枚举(可组合)。
| 值 | 描述 |
|----|------|
| `Position` | 位置坐标 |
| `Normal` | 法线 |
| `Tangent` | 切线 |
| `Color` | 顶点颜色 |
| `UV0` | 第一组纹理坐标 |
| `UV1` | 第二组纹理坐标 |
| `UV2` | 第三组纹理坐标 |
| `UV3` | 第四组纹理坐标 |
| `BoneWeights` | 骨骼权重 |
| `BoneIndices` | 骨骼索引 |
## MeshSection 结构体
网格分段Submesh描述。
| 成员 | 类型 | 描述 |
|------|------|------|
| `baseVertex` | `Core::uint32` | 基础顶点索引 |
| `vertexCount` | `Core::uint32` | 顶点数量 |
| `startIndex` | `Core::uint32` | 起始索引 |
| `indexCount` | `Core::uint32` | 索引数量 |
| `materialID` | `Core::uint32` | 对应材质 ID |
## 公共方法
### 基础属性
| 方法 | 描述 |
|------|------|
| `ResourceType GetType() const` | 返回 `ResourceType::Mesh` |
| `const Containers::String& GetName() const` | 获取网格名称 |
| `const Containers::String& GetPath() const` | 获取网格路径 |
| `ResourceGUID GetGUID() const` | 获取全局唯一标识符 |
| `bool IsValid() const` | 检查网格是否有效 |
| `size_t GetMemorySize() const` | 获取内存大小 |
| `void Release()` | 释放网格引用 |
### 顶点数据
| 方法 | 描述 |
|------|------|
| `void SetVertexData(const void* data, size_t size, Core::uint32 vertexCount, Core::uint32 vertexStride, VertexAttribute attributes)` | 设置顶点数据 |
| `const void* GetVertexData() const` | 获取顶点数据指针 |
| `size_t GetVertexDataSize() const` | 获取顶点数据大小 |
| `Core::uint32 GetVertexCount() const` | 获取顶点数量 |
| `Core::uint32 GetVertexStride() const` | 获取顶点结构体大小(字节) |
| `VertexAttribute GetVertexAttributes() const` | 获取顶点属性标志 |
### 索引数据
| 方法 | 描述 |
|------|------|
| `void SetIndexData(const void* data, size_t size, Core::uint32 indexCount, bool use32Bit)` | 设置索引数据 |
| `const void* GetIndexData() const` | 获取索引数据指针 |
| `size_t GetIndexDataSize() const` | 获取索引数据大小 |
| `Core::uint32 GetIndexCount() const` | 获取索引数量 |
| `bool IsUse32BitIndex() const` | 是否使用 32 位索引 |
### 网格分段
| 方法 | 描述 |
|------|------|
| `void AddSection(const MeshSection& section)` | 添加网格分段 |
| `const Containers::Array<MeshSection>& GetSections() const` | 获取所有分段 |
## 使用示例
```cpp
// 加载网格
ResourceHandle<Mesh> mesh = ResourceManager::Get().Load<Mesh>("models/player.fbx");
// 手动设置顶点数据
struct Vertex {
float position[3];
float normal[3];
float uv[2];
};
Containers::Array<Vertex> vertices;
vertices.Resize(vertexCount);
// ... 填充顶点数据 ...
mesh->SetVertexData(
vertices.Data(),
vertices.Size() * sizeof(Vertex),
vertexCount,
sizeof(Vertex),
VertexAttribute::Position | VertexAttribute::Normal | VertexAttribute::UV0
);
// 设置索引数据
Containers::Array<uint32_t> indices;
indices.Resize(indexCount);
// ... 填充索引数据 ...
mesh->SetIndexData(
indices.Data(),
indices.Size() * sizeof(uint32_t),
indexCount,
true // 32 位索引
);
// 添加分段(一个网格可能有多个材质)
MeshSection section;
section.baseVertex = 0;
section.vertexCount = vertexCount;
section.startIndex = 0;
section.indexCount = indexCount;
section.materialID = 0;
mesh->AddSection(section);
// 访问数据
uint32_t vCount = mesh->GetVertexCount();
uint32_t iCount = mesh->GetIndexCount();
auto sections = mesh->GetSections();
```
## 相关文档
- [IResource](./resources-iresource.md) - 资源基类
- [Material](./resources-material.md) - 材质资源
- [ResourceManager](./resources-resourcemanager.md) - 资源管理器