2020-02-29 10:33:37 +01:00

114 lines
3.8 KiB
C++

#pragma once
#include <vector>
#include <mutex>
#include "IDrawable.h"
#include <DirectXMath.h>
namespace eg3d {
template<typename vertex_t>
class Geometry : public IDrawable {
private:
ComPtr<ID3D12Device> mDevice; // device
std::vector<vertex_t> mVertices; // vertexek
std::vector<uint32_t> mIndices; // indexek
std::mutex mModifMtx; // ...
// topológia
D3D_PRIMITIVE_TOPOLOGY mTopology;
// bufferek
ComPtr<ID3D12Resource> mVertexBuffer;
ComPtr<ID3D12Resource> mIndexBuffer;
// leírók
D3D12_VERTEX_BUFFER_VIEW mVertexBufferView;
D3D12_INDEX_BUFFER_VIEW mIndexBufferView;
public:
explicit Geometry(ComPtr<ID3D12Device> device) : mDevice(device) {
// topológia beállítása
setTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
}
// másolókonstruktor
Geometry(const Geometry& other) : mDevice(other.mDevice) {
setTopology(other.getTopology());
setVertices(other.getVertices());
setIndices(other.getIndices());
}
// vertexek beállítása
void setVertices(const std::vector<vertex_t> &vertices) {
mVertices = vertices;
size_t bufferSize = mVertices.size() * sizeof(vertex_t); // buffer mérete
mVertexBuffer.Reset(); // buffer törlése
mVertexBuffer = createBuffer_UH(mDevice, bufferSize); // buffer létrehozása
bufferMapCopy(mVertexBuffer, (void *) mVertices.data(), bufferSize); // buffer feltöltése
// vertex buffer view beállítása
mVertexBufferView.BufferLocation = mVertexBuffer->GetGPUVirtualAddress();
mVertexBufferView.StrideInBytes = sizeof(vertex_t);
mVertexBufferView.SizeInBytes = bufferSize;
}
// vertexek lekérése
std::vector<vertex_t> getVertices() const {
return mVertices;
}
// indexek beállítása
void setIndices(const std::vector<uint32_t> &indices) {
mIndices = indices;
size_t bufferSize = mIndices.size() * sizeof(uint32_t); // buffer mérete
mIndexBuffer.Reset(); // buffer törlése
mIndexBuffer = createBuffer_UH(mDevice, bufferSize); // buffer létrehozása
bufferMapCopy(mIndexBuffer, (void *) mIndices.data(), bufferSize); // buffer feltöltése
// index buffer view beállítása
mIndexBufferView.Format = /*(sizeof(IT) == 2) ? DXGI_FORMAT_R16_UINT :*/ DXGI_FORMAT_R32_UINT;
mIndexBufferView.BufferLocation = mIndexBuffer->GetGPUVirtualAddress();
mIndexBufferView.SizeInBytes = bufferSize;
}
// indexek lekérése
std::vector<uint32_t> getIndices() const {
return mIndices;
}
// topológia beállítása
void setTopology(D3D_PRIMITIVE_TOPOLOGY topology) {
mTopology = topology;
}
// topológia beállítása
D3D_PRIMITIVE_TOPOLOGY getTopology() const {
return mTopology;
}
// input assembler beállítása
void setupInputAssembler(ComPtr<ID3D12GraphicsCommandList> commandList) const {
commandList->IASetVertexBuffers(0, 1, &mVertexBufferView);
commandList->IASetIndexBuffer(&mIndexBufferView);
commandList->IASetPrimitiveTopology(mTopology);
}
// kirajzolás
void draw(ComPtr<ID3D12GraphicsCommandList> commandList) const override {
setupInputAssembler(commandList); // input assembler beállítása
commandList->DrawIndexedInstanced(mIndices.size(), 1, 0, 0, 0); // rajzolás
}
};
// geometriatároló típusa
template <typename vertex_t>
using GeometryPool = std::vector<std::shared_ptr<Geometry<vertex_t>>>;
}