#pragma once #include #include #include "IDrawable.h" #include namespace eg3d { template class Geometry : public IDrawable { private: ComPtr mDevice; // device std::vector mVertices; // vertexek std::vector mIndices; // indexek std::mutex mModifMtx; // ... // topológia D3D_PRIMITIVE_TOPOLOGY mTopology; // bufferek ComPtr mVertexBuffer; ComPtr mIndexBuffer; // leírók D3D12_VERTEX_BUFFER_VIEW mVertexBufferView; D3D12_INDEX_BUFFER_VIEW mIndexBufferView; public: explicit Geometry(ComPtr 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 &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 getVertices() const { return mVertices; } // indexek beállítása void setIndices(const std::vector &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 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 commandList) const { commandList->IASetVertexBuffers(0, 1, &mVertexBufferView); commandList->IASetIndexBuffer(&mIndexBufferView); commandList->IASetPrimitiveTopology(mTopology); } // kirajzolás void draw(ComPtr 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 using GeometryPool = std::vector>>; }