light/modules/engine/src/utils/resource_manager.cpp

88 lines
2.1 KiB
C++
Raw Normal View History

2025-07-05 13:28:41 +03:30
#include <engine/graphics/graphics_context.hpp>
#include <engine/graphics/shader.hpp>
#include <engine/graphics/texture.hpp>
#include <engine/utils/file_manager.hpp>
#include <engine/utils/resource_manager.hpp>
namespace Light {
2025-07-05 16:07:51 +03:30
ResourceManager *ResourceManager::s_context = nullptr;
2025-07-05 13:28:41 +03:30
Scope<ResourceManager> ResourceManager::create()
2025-07-05 13:28:41 +03:30
{
return make_scope(new ResourceManager());
2025-07-05 13:28:41 +03:30
}
ResourceManager::ResourceManager(): m_shaders {}, m_textures {}
2025-07-05 13:28:41 +03:30
{
2025-07-05 16:07:51 +03:30
lt_assert(!s_context, "Repeated singleton construction");
s_context = this;
2025-07-05 13:28:41 +03:30
}
void ResourceManager::load_shader_impl(
2025-07-05 13:28:41 +03:30
const std::string &name,
const std::string &vertexPath,
const std::string &pixelPath
)
{
// check
2025-07-05 16:07:51 +03:30
lt_assert(s_context, "Uninitliazed singleton");
lt_assert(!vertexPath.empty(), "Empty 'vertexPath'");
lt_assert(!pixelPath.empty(), "Empty 'pixelPath'");
2025-07-05 13:28:41 +03:30
// load files
2025-07-05 16:07:51 +03:30
BasicFileHandle vertexFile = FileManager::read_text_file(vertexPath);
BasicFileHandle pixelFile = FileManager::read_text_file(pixelPath);
2025-07-05 13:28:41 +03:30
// check
lt_assert(vertexFile.is_valid(), "Failed to read vertex file: {}", vertexPath);
lt_assert(pixelFile.is_valid(), "Failed to read vertex file: {}", pixelPath);
2025-07-05 13:28:41 +03:30
// create shader
m_shaders[name] = Ref<Shader>(
Shader::create(vertexFile, pixelFile, GraphicsContext::get_shared_context())
2025-07-05 13:28:41 +03:30
);
// free file
vertexFile.release();
pixelFile.release();
2025-07-05 13:28:41 +03:30
}
void ResourceManager::load_texture_impl(
2025-07-05 13:28:41 +03:30
const std::string &name,
const std::string &path,
unsigned int desiredComponents /* = 4u */
)
{
2025-07-05 16:07:51 +03:30
lt_assert(s_context, "Uninitliazed singleton");
2025-07-05 13:28:41 +03:30
// load file
2025-07-05 16:07:51 +03:30
ImageFileHandle imgFile = FileManager::read_image_file(path, desiredComponents);
2025-07-05 13:28:41 +03:30
// create texture
m_textures[name] = Ref<Texture>(Texture::create(
imgFile.get_width(),
imgFile.get_height(),
imgFile.get_components(),
2025-07-05 16:07:51 +03:30
imgFile.get_data(),
GraphicsContext::get_shared_context(),
2025-07-05 13:28:41 +03:30
path
));
// free file
imgFile.release();
2025-07-05 13:28:41 +03:30
}
void ResourceManager::release_texture_impl(const std::string &name)
2025-07-05 13:28:41 +03:30
{
if (!m_textures[name])
2025-07-05 13:28:41 +03:30
{
lt_log(warn, "Failed to find texture named: {}", name);
2025-07-05 13:28:41 +03:30
return;
}
m_textures[name] = nullptr;
2025-07-05 13:28:41 +03:30
}
} // namespace Light