49 lines
1.4 KiB
C++
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
|