#include "assets/pools/mesh_pool.hpp" #include namespace sophia { MeshPool::MeshPool(Device& device) : device{device} {} MeshPool::~MeshPool() = default; MeshHandle MeshPool::create(const Mesh::Builder& builder) { auto mesh = std::make_unique(device, builder); if (!freeList.empty()) { MeshHandle handle = freeList.back(); freeList.pop_back(); meshes[handle] = std::move(mesh); return handle; } meshes.push_back(std::move(mesh)); return static_cast(meshes.size() - 1); } const Mesh& MeshPool::get(MeshHandle handle) const { SOPHIA_ASSERT(handle < meshes.size(), "invalid MeshHandle:", handle); SOPHIA_ASSERT(meshes[handle] != nullptr, "MeshHandle refers to a released mesh:", handle); return *meshes[handle]; } void MeshPool::release(MeshHandle handle) { SOPHIA_ASSERT(handle < meshes.size(), "invalid MeshHandle:", handle); SOPHIA_ASSERT(meshes[handle] != nullptr, "MeshHandle already released:", handle); meshes[handle].reset(); freeList.push_back(handle); } } // namespace sophia