Files
XCEngine/engine/Runtime/Rendering/Picking/RenderObjectIdRegistry.h

49 lines
1.4 KiB
C++

#pragma once
#include <XCEngine/Core/Types.h>
#include "engine/Runtime/Rendering/Picking/ObjectIdCodec.h"
#include <mutex>
#include <unordered_map>
namespace XCEngine {
namespace Rendering {
class RenderObjectIdRegistry {
public:
static RenderObjectIdRegistry& Get();
RenderObjectIdRegistry(const RenderObjectIdRegistry&) = delete;
RenderObjectIdRegistry& operator=(const RenderObjectIdRegistry&) = delete;
RenderObjectId GetOrAllocateRenderObjectId(Core::uint64 runtimeObjectId);
bool TryGetRenderObjectId(
Core::uint64 runtimeObjectId,
RenderObjectId& outRenderObjectId) const;
bool TryResolveRuntimeObjectId(
RenderObjectId renderObjectId,
Core::uint64& outRuntimeObjectId) const;
Core::uint64 ResolveRuntimeObjectId(RenderObjectId renderObjectId) const;
void Reset();
Core::uint64 GetGeneration() const;
private:
RenderObjectIdRegistry() = default;
RenderObjectId AllocateRenderObjectIdLocked();
void BumpGenerationLocked();
mutable std::mutex m_mutex = {};
RenderObjectId m_nextRenderObjectId = 1u;
Core::uint64 m_generation = 1u;
std::unordered_map<Core::uint64, RenderObjectId>
m_renderObjectIdByRuntimeObjectId = {};
std::unordered_map<RenderObjectId, Core::uint64>
m_runtimeObjectIdByRenderObjectId = {};
};
} // namespace Rendering
} // namespace XCEngine