Files
XCEngine/engine/src/RHI/D3D12/D3D12StaticMeshComponent.cpp
ssdfasd 3ad317afb2 feat: 修复RHI渲染循环问题
- 修复RootSignature参数数量与HelloEarth一致
- 修复StaticMeshComponent中device为nullptr的问题
- 修复CommandList::Reset类型转换问题
- 修复RTV创建使用nullptr而不是rtvDesc
- 添加SwapChain的GetCurrentRenderTarget方法
- 修复DepthStencil创建问题(暂时跳过)
- 渲染循环基本可运行
2026-03-14 03:13:10 +08:00

89 lines
2.5 KiB
C++

#include <Rendering\StaticMeshComponent.h>
#include <RHI\D3D12\D3D12RHI.h>
#include <RHI\D3D12\D3D12Resources.h>
#include <cstdio>
namespace XCEngine {
namespace RHI {
StaticMeshComponent::StaticMeshComponent() {
}
StaticMeshComponent::~StaticMeshComponent() {
if (m_vertexBuffer) {
delete m_vertexBuffer;
}
for (auto& pair : m_subMeshes) {
delete pair.second;
}
}
bool StaticMeshComponent::Initialize(ICommandList* commandList, const char* filePath) {
D3D12CommandList* d3d12CmdList = static_cast<D3D12CommandList*>(commandList);
D3D12Device* device = d3d12CmdList->GetDevice();
FILE* file = nullptr;
if (fopen_s(&file, filePath, "rb") != 0) {
return false;
}
int vertexCount = 0;
fread(&vertexCount, 4, 1, file);
m_vertexCount = vertexCount;
MeshVertex* vertices = new MeshVertex[vertexCount];
fread(vertices, sizeof(MeshVertex), vertexCount, file);
CreateVertexBuffer(device, commandList, vertices, sizeof(MeshVertex) * vertexCount, sizeof(MeshVertex), &m_vertexBuffer);
delete[] vertices;
while (!feof(file)) {
int nameLength = 0;
fread(&nameLength, 4, 1, file);
if (feof(file)) break;
char name[256] = {0};
fread(name, 1, nameLength, file);
int indexCount = 0;
fread(&indexCount, 4, 1, file);
uint32_t* indices = new uint32_t[indexCount];
fread(indices, sizeof(uint32_t), indexCount, file);
IIndexBuffer* indexBuffer = nullptr;
CreateIndexBuffer(device, commandList, indices, sizeof(uint32_t) * indexCount, &indexBuffer);
delete[] indices;
SubMesh* submesh = new SubMesh();
submesh->indexBuffer = indexBuffer;
submesh->indexCount = indexCount;
m_subMeshes[std::string(name)] = submesh;
}
fclose(file);
return true;
}
void StaticMeshComponent::Render(ICommandList* commandList) {
if (!m_vertexBuffer) return;
commandList->SetVertexBuffer(0, m_vertexBuffer, 0, sizeof(MeshVertex));
if (m_subMeshes.empty()) {
commandList->DrawInstanced(m_vertexCount, 1, 0, 0);
}
else {
for (auto& pair : m_subMeshes) {
SubMesh* submesh = pair.second;
commandList->SetIndexBuffer(submesh->indexBuffer, 0);
commandList->DrawIndexedInstanced(submesh->indexCount, 1, 0, 0, 0);
}
}
}
} // namespace RHI
} // namespace XCEngine