asset_manager concept
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
#include "assets/pools/mesh_pool.hpp"
|
||||
|
||||
#include <sophia/util/assert.hpp>
|
||||
|
||||
namespace sophia {
|
||||
|
||||
MeshPool::MeshPool(Device& device) : device{device} {}
|
||||
|
||||
MeshPool::~MeshPool() = default;
|
||||
|
||||
MeshHandle MeshPool::create(const Mesh::Builder& builder) {
|
||||
auto mesh = std::make_unique<Mesh>(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<MeshHandle>(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
|
||||
Reference in New Issue
Block a user