#pragma once #include "Viewport/SceneViewportEditorOverlayData.h" #include #include #include #include #include #include #include namespace XCEngine { namespace RHI { class RHIBuffer; class RHIDescriptorPool; class RHIDescriptorSet; class RHIDevice; class RHIPipelineLayout; class RHIPipelineState; class RHIResourceView; class RHISampler; class RHITexture; enum class RHIType : uint8_t; } // namespace RHI namespace Editor { class SceneViewportEditorOverlayPassRenderer { public: ~SceneViewportEditorOverlayPassRenderer() = default; void Shutdown(); bool Render( const Rendering::RenderContext& renderContext, const Rendering::RenderSurface& surface, const SceneViewportOverlayFrameData& frameData); private: struct OverlaySpriteTextureResources { RHI::RHITexture* texture = nullptr; RHI::RHIResourceView* shaderView = nullptr; RHI::RHIDescriptorSet* textureSet = nullptr; }; bool EnsureInitialized(const Rendering::RenderContext& renderContext); bool CreateResources(const Rendering::RenderContext& renderContext); bool EnsureLineBufferCapacity(size_t requiredVertexCount); bool EnsureScreenTriangleBufferCapacity(size_t requiredVertexCount); bool EnsureSpriteBufferCapacity(size_t requiredVertexCount); bool EnsureIconTexturesLoaded(); void DestroyResources(); RHI::RHIDevice* m_device = nullptr; RHI::RHIType m_backendType = RHI::RHIType::D3D12; RHI::RHIPipelineLayout* m_linePipelineLayout = nullptr; RHI::RHIPipelineLayout* m_spritePipelineLayout = nullptr; RHI::RHIPipelineState* m_depthTestedLinePipelineState = nullptr; RHI::RHIPipelineState* m_alwaysOnTopLinePipelineState = nullptr; RHI::RHIPipelineState* m_depthTestedScreenTrianglePipelineState = nullptr; RHI::RHIPipelineState* m_alwaysOnTopScreenTrianglePipelineState = nullptr; RHI::RHIPipelineState* m_depthTestedSpritePipelineState = nullptr; RHI::RHIPipelineState* m_alwaysOnTopSpritePipelineState = nullptr; RHI::RHIDescriptorPool* m_constantPool = nullptr; RHI::RHIDescriptorPool* m_texturePool = nullptr; RHI::RHIDescriptorPool* m_samplerPool = nullptr; RHI::RHIDescriptorSet* m_constantSet = nullptr; RHI::RHIDescriptorSet* m_samplerSet = nullptr; RHI::RHISampler* m_sampler = nullptr; RHI::RHIBuffer* m_lineVertexBuffer = nullptr; RHI::RHIResourceView* m_lineVertexBufferView = nullptr; RHI::RHIBuffer* m_screenTriangleVertexBuffer = nullptr; RHI::RHIResourceView* m_screenTriangleVertexBufferView = nullptr; RHI::RHIBuffer* m_spriteVertexBuffer = nullptr; RHI::RHIResourceView* m_spriteVertexBufferView = nullptr; uint64_t m_lineVertexBufferCapacity = 0; uint64_t m_screenTriangleVertexBufferCapacity = 0; uint64_t m_spriteVertexBufferCapacity = 0; std::array m_overlaySpriteTextures = {}; }; std::unique_ptr CreateSceneViewportEditorOverlayPass( SceneViewportEditorOverlayPassRenderer& renderer, const SceneViewportOverlayFrameData& frameData); } // namespace Editor } // namespace XCEngine