#pragma once #include #include "engine/Runtime/Rendering/Picking/ObjectIdCodec.h" #include #include 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 m_renderObjectIdByRuntimeObjectId = {}; std::unordered_map m_runtimeObjectIdByRenderObjectId = {}; }; } // namespace Rendering } // namespace XCEngine