#ifndef DXVIEW_VIEWER_GUARD #define DXVIEW_VIEWER_GUARD #include #include #include #include #include #include #include #include #include using Microsoft::WRL::ComPtr; enum RenderPassType { RENDER_PASS_TYPE_PRESENT = 0, RENDER_PASS_TYPE_COUNT }; struct RenderTarget { ComPtr pTexture; D3D12_CPU_DESCRIPTOR_HANDLE viewDescriptor; }; struct TextureInfo { int32_t textureIndex; int32_t samplerIndex; }; struct PBRMetallicRoughness { DirectX::XMFLOAT4 baseColorFactor; TextureInfo baseColorTexture; float metallicFactor; float roughnessFactor; TextureInfo metallicRoughnessTexture; }; struct Material { std::string name; D3D12_BLEND_DESC blendDesc; D3D12_RASTERIZER_DESC rasterizerDesc; ComPtr pBuffer; void* pBufferData; ComPtr pSRVDescriptorHeap; ComPtr pSamplerDescriptorHeap; }; struct Attribute { std::string name; DXGI_FORMAT format; D3D12_VERTEX_BUFFER_VIEW vertexBufferView; }; struct Primitive { std::vector attributes; uint32_t vertexCount; D3D12_PRIMITIVE_TOPOLOGY primitiveTopology; D3D12_INDEX_BUFFER_VIEW indexBufferView; uint32_t indexCount; Material* pMaterial; ComPtr pRootSignature; ComPtr pPipelineState; }; struct Mesh { std::string name; std::vector primitives; }; struct Node { DirectX::XMFLOAT4X4 M; }; struct Camera { DirectX::XMFLOAT4X4 V; DirectX::XMFLOAT4X4 P; DirectX::XMFLOAT4X4 VP; }; class Viewer { public: Viewer(HWND window, tinygltf::Model* pModel); void update(double deltaTime); void render(double deltaTime); private: void initDirectX(HWND window); void buildRenderTargets(); void buildResources(); void buildBuffers(std::vector >* pStagingResources); void buildImages(std::vector >* pStagingResources); void buildSamplerDescs(); void buildMaterials(); void buildMeshes(); void buildNodes(); void drawNode(uint64_t nodeIndex); private: tinygltf::Model* pModel_; ComPtr pFactory_; ComPtr pAdapter_; ComPtr pDevice_; ComPtr pDirectCommandQueue_; UINT64 directFenceValue_; ComPtr pDirectFence_; ComPtr pCopyCommandQueue_; UINT64 copyFenceValue_; ComPtr pCopyFence_; ComPtr pSwapChain_; ComPtr pSwapChainBuffers_[DXVIEW_SWAP_CHAIN_BUFFER_COUNT]; ComPtr pDirectCommandAllocators_[DXVIEW_SWAP_CHAIN_BUFFER_COUNT]; ComPtr pDirectCommandList_; ComPtr pCopyCommandAllocator_; ComPtr pCopyCommandList_; UINT descriptorIncrementSize_[D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES]; ComPtr pRTVDescriptorHeaps_[DXVIEW_SWAP_CHAIN_BUFFER_COUNT]; std::vector renderTargets_[DXVIEW_SWAP_CHAIN_BUFFER_COUNT]; std::vector > pBuffers_; std::vector > pTextures_; std::vector samplerDescs_; std::vector materials_; std::vector meshes_; std::vector > pNodeBuffers_; ComPtr pCameraBuffer_; }; #endif