90 lines
3.2 KiB
C
90 lines
3.2 KiB
C
|
|
#pragma once
|
||
|
|
|
||
|
|
#include "Viewport/SceneViewportEditorOverlayData.h"
|
||
|
|
|
||
|
|
#include <XCEngine/Rendering/RenderContext.h>
|
||
|
|
#include <XCEngine/Rendering/RenderPass.h>
|
||
|
|
#include <XCEngine/Rendering/RenderSurface.h>
|
||
|
|
|
||
|
|
#include <array>
|
||
|
|
#include <cstddef>
|
||
|
|
#include <cstdint>
|
||
|
|
#include <memory>
|
||
|
|
|
||
|
|
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<OverlaySpriteTextureResources, 2> m_overlaySpriteTextures = {};
|
||
|
|
};
|
||
|
|
|
||
|
|
std::unique_ptr<Rendering::RenderPass> CreateSceneViewportEditorOverlayPass(
|
||
|
|
SceneViewportEditorOverlayPassRenderer& renderer,
|
||
|
|
const SceneViewportOverlayFrameData& frameData);
|
||
|
|
|
||
|
|
} // namespace Editor
|
||
|
|
} // namespace XCEngine
|