65 lines
1.3 KiB
C++
65 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <memory>
|
|
#include <sophia/handles.hpp>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "sophia/canvas.hpp"
|
|
#include "sophia/types.hpp"
|
|
|
|
namespace sophia {
|
|
|
|
class Device;
|
|
class Mesh;
|
|
|
|
template <typename T>
|
|
struct AssetTraits;
|
|
|
|
template <>
|
|
struct AssetTraits<Mesh> {
|
|
using Handle = MeshHandle;
|
|
};
|
|
|
|
class AssetRegistry {
|
|
public:
|
|
~AssetRegistry();
|
|
|
|
AssetRegistry(const AssetRegistry&) = delete;
|
|
AssetRegistry& operator=(const AssetRegistry&) = delete;
|
|
|
|
template <typename T>
|
|
typename AssetTraits<T>::Handle load(const std::string& path);
|
|
|
|
/**
|
|
* TEMPORARY: Remove once load<Mesh> can read real model files from disk.
|
|
*/
|
|
MeshHandle loadMesh(std::vector<CanvasVertex> vertices,
|
|
std::vector<u32> indices);
|
|
|
|
template <typename T>
|
|
void release(typename AssetTraits<T>::Handle handle);
|
|
|
|
private:
|
|
friend class Application;
|
|
|
|
explicit AssetRegistry(Device& device);
|
|
|
|
template <typename T>
|
|
const T& get(typename AssetTraits<T>::Handle handle) const;
|
|
|
|
class Impl;
|
|
std::unique_ptr<Impl> impl;
|
|
};
|
|
|
|
template <>
|
|
MeshHandle AssetRegistry::load<Mesh>(const std::string& path);
|
|
|
|
template <>
|
|
void AssetRegistry::release<Mesh>(MeshHandle handle);
|
|
|
|
template <>
|
|
const Mesh& AssetRegistry::get<Mesh>(MeshHandle handle) const;
|
|
|
|
} // namespace sophia
|