#pragma once #include "DX12Buffer.h" #include "GraphicsApi.h" //! DirectX 12 Types struct ID3D12Debug; struct ID3D12Device5; struct ID3D12InfoQueue; struct ID3D12CommandQueue; struct IDXGISwapChain4; struct ID3D12DescriptorHeap; struct ID3D12Resource; struct ID3D12CommandAllocator; struct ID3D12Fence; struct D3D12_VIEWPORT; struct D3D12_VERTEX_BUFFER_VIEW; struct D3D12_INDEX_BUFFER_VIEW; struct ID3D12RootSignature; struct ID3D12PipelineState; struct ID3D12GraphicsCommandList4; struct D3D12_RAYTRACING_INSTANCE_DESC; namespace Framework { class DX12Buffer; class DX12DirectCommandQueue; class DX12CopyCommandQueue; class DX12ComputeCommandQueue; class DX12PixelShader; class DX12VertexShader; class DX12VertexBuffer; class DX12IndexBuffer; class DX12BLASModel; class TextureList; class TextureModel; class DX12TLAS; class DX12Texture; class DX12Pipeline; class DX12GlobalDescriptorHeap; class DX12ShaderBindingTable; class Model3D; class DX12ShaderHitGroup; class DX12ShaderFunction; class DirectX12 : public GraphicsApi { private: ID3D12Debug* debug; ID3D12Device5* device; ID3D12InfoQueue* infoQueue; DX12DirectCommandQueue* directCommandQueue; IDXGISwapChain4* swapChain; ID3D12Resource* backBuffer[2]; int backBufferIndex; int tearing; D3D12_VIEWPORT* viewPort; tagRECT* allowedRenderArea; ID3D12RootSignature* signature; Mat4 matrixBuffer[MAX_KNOCHEN_ANZ]; Mat4 viewAndProj[2]; Vec3 kamPos; Texture* uiTexture; TextureList* texturRegister; DX12BLASModel** blasModels; DX12TLAS** worldTLAS; DX12ShaderBindingTable** worldShaderBindingTables; int lastTLASId; int lastModelId; DX12Texture* defaultRenderTarget; DX12Pipeline* pipeline; DX12GlobalDescriptorHeap* globalDescriptorHeap; DX12ShaderHitGroup* defaultHitGroup; DX12ShaderFunction* defaultRayGenerationShaderFunction; int* renderTargetInputOffset; int* tlasInputOffset; public: DLLEXPORT DirectX12(); DLLEXPORT ~DirectX12(); private: DLLEXPORT void updateBottomLevelAccelerationStructure(); DLLEXPORT void renderKamera( Cam3D* zKamera, DX12Texture* zTarget, bool guiVisible); DLLEXPORT void initializePipeline(); DLLEXPORT void initializeGlobalDescriptorHeap(); DLLEXPORT void fillShaderBindingTable( DX12ShaderBindingTable* zShaderBindingTable, Model3D* zModel, int objectIndex); public: DLLEXPORT void initialize(NativeWindow* fenster, Vec2 backBufferSize, bool fullScreen) override; DLLEXPORT void beginFrame( bool fill2D, bool fill3D, int fillColor) override; DLLEXPORT void renderKamera(Cam3D* zKamera) override; DLLEXPORT virtual void renderKamera( Cam3D* zKamera, Texture* zTarget) override; //! TODO: DLLEXPORT void renderKamera( Cam3D* zKamera, Texture* zTarget //! ) override; DLLEXPORT void presentFrame() override; DLLEXPORT Texture* createOrGetTexture( const char* name, Image* b, TextureDirection dir) override; DLLEXPORT Image* zUIRenderImage() const override; DLLEXPORT virtual DXBuffer* createStructuredBuffer(int eSize) override; DLLEXPORT void setPipeline(DX12Pipeline* pipeline); DLLEXPORT static bool isAvailable(); }; } // namespace Framework