Files
XCEngine/editor/src/Viewport/SceneViewportOverlayProviders.h

69 lines
2.1 KiB
C++

#pragma once
#include "SceneViewportEditorOverlayData.h"
#include <cstddef>
#include <cstdint>
#include <memory>
#include <vector>
namespace XCEngine {
namespace Components {
class Scene;
} // namespace Components
namespace Editor {
class IEditorContext;
struct SceneViewportOverlayBuildContext {
IEditorContext* editorContext = nullptr;
const Components::Scene* scene = nullptr;
const SceneViewportOverlayData* overlay = nullptr;
uint32_t viewportWidth = 0u;
uint32_t viewportHeight = 0u;
const std::vector<uint64_t>* selectedObjectIds = nullptr;
const SceneViewportTransformGizmoOverlayState* transformGizmoOverlayState = nullptr;
bool IsValid() const {
return editorContext != nullptr &&
scene != nullptr &&
overlay != nullptr &&
overlay->valid &&
viewportWidth > 0u &&
viewportHeight > 0u &&
selectedObjectIds != nullptr;
}
};
class ISceneViewportOverlayProvider {
public:
virtual ~ISceneViewportOverlayProvider() = default;
virtual const char* GetName() const = 0;
virtual void AppendOverlay(
const SceneViewportOverlayBuildContext& context,
SceneViewportOverlayFrameData& frameData) const = 0;
};
class SceneViewportOverlayProviderRegistry {
public:
void AddProvider(std::unique_ptr<ISceneViewportOverlayProvider> provider);
size_t GetProviderCount() const;
const ISceneViewportOverlayProvider* GetProvider(size_t index) const;
void AppendOverlay(
const SceneViewportOverlayBuildContext& context,
SceneViewportOverlayFrameData& frameData) const;
private:
std::vector<std::unique_ptr<ISceneViewportOverlayProvider>> m_providers = {};
};
std::unique_ptr<ISceneViewportOverlayProvider> CreateSceneViewportCameraOverlayProvider();
std::unique_ptr<ISceneViewportOverlayProvider> CreateSceneViewportLightOverlayProvider();
std::unique_ptr<ISceneViewportOverlayProvider> CreateSceneViewportTransformGizmoOverlayProvider();
SceneViewportOverlayProviderRegistry BuildDefaultSceneViewportOverlayProviderRegistry();
} // namespace Editor
} // namespace XCEngine