135 lines
4.0 KiB
C++

#pragma once
#include "Window.h"
#include <d3d12.h>
#include <dxgi.h>
#include "Logger.h"
#include <dxgi1_4.h>
#include <DirectXColors.h>
#include "d3dx12.h"
#include "comdef.h"
#include "IDrawable.h"
#include <DirectXMath.h>
#include "Vertex.h"
#include "Cam.h"
#include "const_bufs.h"
namespace eg3d {
class DXWindow : public Window {
public:
static constexpr DXGI_FORMAT cBackBufferFormat = DXGI_FORMAT_R8G8B8A8_UNORM; // back buffer formátum
static constexpr UINT cSwapChainBufferCount = 2; // double buffering
static constexpr DXGI_FORMAT cDepthStencilFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
// TODO
private:
#if defined(DEBUG) | defined(_DEBUG)
ComPtr<ID3D12Debug> mDebugController; // debug vezérlõ
#endif
// TODO
ComPtr<ID3D12Device> mDevice; // device
ComPtr<IDXGIFactory1> mFactory; // DXGI factory
ComPtr<ID3D12Fence> mFence; // fence
ULONG64 mCurrentFence;
ComPtr<ID3D12CommandQueue> mCommandQueue; // command queue
ComPtr<ID3D12CommandAllocator> mCommandAllocator; // command allocator
ComPtr<ID3D12GraphicsCommandList> mCommandList; // command list
UINT mRTVDescSize, mDSVDescSize, mCBVSRVDescSize; // deszkriptorméretek
ComPtr<IDXGISwapChain> mSwapChain; // swap chain
ComPtr<ID3D12DescriptorHeap> mRtvDescriptorHeap; // render target view descriptor heap
ComPtr<ID3D12DescriptorHeap> mDsvDescriptorHeap; // DSV descriptor heap
ComPtr<ID3D12Resource> mSwapChainBuffer[cSwapChainBufferCount]; // swap chain bufferek
ComPtr<ID3D12Resource> mDepthStencilBuffer; // depth/stencil buffer
UINT mCurrentBackBuffer; // aktuális backbuffer
D3D12_VIEWPORT mViewPort; // viewport
D3D12_RECT mScissorRect; // scissor rect
protected:
// --- KIRAJZOLANDÓ OBJEKTUMOK
std::vector<Vertex> vertices; // vertexek
std::vector<uint32_t> indices; // indexek
ComPtr<ID3D12Resource> vertexBuffer; // vertex buffer
ComPtr<ID3D12Resource> indexBuffer; // index buffer
D3D12_VERTEX_BUFFER_VIEW vertexBufferView; // ...
D3D12_INDEX_BUFFER_VIEW indexBufferView;
std::vector<D3D12_INPUT_ELEMENT_DESC> inputElements; // input layout elemei
ComPtr<ID3D12RootSignature> rootSignature; // root signature
ComPtr<ID3D12PipelineState> pso; // pipeline state object
ComPtr<ID3DBlob> vertexShader, pixelShader; // vertex- és pixel-shader program
// TODO konstansbuffer példány és DX-objektum
ComPtr<ID3D12Resource> cbResource; // konstansbuffer DX-objektuma
ConstantBuffer constantBuffer; // konstansbuffer
// virtuális kamera
Cam * pCam;
void initDrawObjects(); // kirajzolandó objektumok inicializálása
void setupInputLayout(); // input layout beállítása
void loadShaders(); // shaderek betöltése
void createConstantBuffers(); // konstansbufferek létrehozása
void createRootSignature(); // root signature létrehozása
void createPSO(); // PSO létrehozása
void updateConstantBuffers(); // konstansbufferek frissítése
// --------------------
virtual void init(); // inicializáció
void createDevice(); // ...
void createSyncObjects(); // CPU-GPU szinkronizációs objektumok létrehozása
void queryDescriptorSizes(); // lekéri a descriptorok méretét
void createCommandObjects(); // command queue létrehozása
void createSwapChain(); // swap chain létrehozása
void createDescriptorHeaps(); // descriptor heap-ek létrehozása
void createRTVs(); // render target view-k létrehozása
void createDSV(); // depth/stencil létrehozása
void setViewPort(); // viewport beállítása
void setScissorRectangle(); // scissor rectangle beállítása
D3D12_CPU_DESCRIPTOR_HANDLE getCurrentBackBufferRTVHandle() const; // lekéri az aktuális backbuffer handle-jét
D3D12_CPU_DESCRIPTOR_HANDLE getDSVHandle() const; // lekéri az DSV handle-jét
ID3D12Resource * getCurrentBackBuffer() const; // lekéri az aktuális bakcbuffert
void flushCommandQueue(); // ...
public:
DXWindow();
virtual ~DXWindow();
// TODO paraméter átírása
void Draw(const DrawablePool &drawables);
ComPtr<ID3D12Device> getDevice() const; // device elkérése
void setCam(Cam * pCam); // kamera beállítása
};
}