#pragma once #include "Window.h" #include #include #include "Logger.h" #include #include #include "d3dx12.h" #include "comdef.h" #include "IDrawable.h" #include #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 mDebugController; // debug vezérlő #endif // TODO ComPtr mDevice; // device ComPtr mFactory; // DXGI factory ComPtr mFence; // fence ULONG64 mCurrentFence; ComPtr mCommandQueue; // command queue ComPtr mCommandAllocator; // command allocator ComPtr mCommandList; // command list UINT mRTVDescSize, mDSVDescSize, mCBVSRVDescSize; // deszkriptorméretek ComPtr mSwapChain; // swap chain ComPtr mRtvDescriptorHeap; // render target view descriptor heap ComPtr mDsvDescriptorHeap; // DSV descriptor heap ComPtr mSwapChainBuffer[cSwapChainBufferCount]; // swap chain bufferek ComPtr mDepthStencilBuffer; // depth/stencil buffer UINT mCurrentBackBuffer; // aktuális backbuffer D3D12_VIEWPORT mViewPort; // viewport D3D12_RECT mScissorRect; // scissor rect protected: // --- KIRAJZOLANDÓ OBJEKTUMOK std::vector vertices; // vertexek std::vector indices; // indexek ComPtr vertexBuffer; // vertex buffer ComPtr indexBuffer; // index buffer D3D12_VERTEX_BUFFER_VIEW vertexBufferView; // ... D3D12_INDEX_BUFFER_VIEW indexBufferView; std::vector inputElements; // input layout elemei ComPtr rootSignature; // root signature ComPtr pso; // pipeline state object ComPtr vertexShader, pixelShader; // vertex- és pixel-shader program // TODO konstansbuffer példány és DX-objektum ComPtr cbResource; // konstansbuffer DX-objektuma CB_Frame constantBuffer; // konstansbuffer // virtuális kamera Cam * pCam; // egyebek float lightAngle = 0.0f; 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 getDevice() const; // device elkérése void setCam(Cam * pCam); // kamera beállítása }; }