untested texture loader
parent
35273334a3
commit
8c86faf1ce
|
@ -31,17 +31,29 @@ namespace blt::gfx
|
||||||
{
|
{
|
||||||
std::string path;
|
std::string path;
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
|
loadable_texture() = default;
|
||||||
|
|
||||||
|
loadable_texture(std::string path, std::string name): path(std::move(path)), name(std::move(name))
|
||||||
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
class texture_resource_manager
|
class texture_resource_manager
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
blt::thread_pool<false> pool;
|
std::mutex load_lock;
|
||||||
|
std::mutex save_lock;
|
||||||
std::vector<loadable_texture> textures_to_load;
|
std::vector<loadable_texture> textures_to_load;
|
||||||
|
std::vector<texture_file*> loaded_textures;
|
||||||
HASHMAP<std::string, texture_gl2D*> textures_2d;
|
HASHMAP<std::string, texture_gl2D*> textures_2d;
|
||||||
public:
|
public:
|
||||||
texture_resource_manager() = default;
|
texture_resource_manager() = default;
|
||||||
~texture_resource_manager();
|
|
||||||
|
void enqueue(std::string path, std::string name = "");
|
||||||
|
|
||||||
|
void load_resources(std::size_t threads = 8);
|
||||||
|
|
||||||
|
void delete_resources();
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,63 @@
|
||||||
#include <blt/gfx/renderer/texture_manager.h>
|
#include <blt/gfx/renderer/texture_manager.h>
|
||||||
#include <blt/std/logging.h>
|
#include <blt/std/logging.h>
|
||||||
|
|
||||||
blt::gfx::texture_resource_manager::~texture_resource_manager()
|
namespace blt::gfx
|
||||||
{
|
{
|
||||||
|
|
||||||
|
void texture_resource_manager::delete_resources()
|
||||||
|
{
|
||||||
for (const auto& p : textures_2d)
|
for (const auto& p : textures_2d)
|
||||||
delete p.second;
|
delete p.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
void texture_resource_manager::enqueue(std::string path, std::string name)
|
||||||
|
{
|
||||||
|
textures_to_load.emplace_back(std::move(path), std::move(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
void texture_resource_manager::load_resources(std::size_t threads)
|
||||||
|
{
|
||||||
|
blt::thread_pool<false> pool;
|
||||||
|
pool.execute([&]() {
|
||||||
|
loadable_texture texture;
|
||||||
|
{
|
||||||
|
std::scoped_lock lock(load_lock);
|
||||||
|
texture = textures_to_load.back();
|
||||||
|
textures_to_load.pop_back();
|
||||||
|
}
|
||||||
|
auto* file = new texture_file(texture.path, texture.name);
|
||||||
|
{
|
||||||
|
std::scoped_lock lock(save_lock);
|
||||||
|
loaded_textures.push_back(file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
do
|
||||||
|
{
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
{
|
||||||
|
std::scoped_lock lock(load_lock);
|
||||||
|
if (textures_to_load.empty())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::scoped_lock lock(save_lock);
|
||||||
|
while (!loaded_textures.empty())
|
||||||
|
{
|
||||||
|
auto* back = loaded_textures.back();
|
||||||
|
textures_2d.insert({back->getName(), new texture_gl2D(back->texture())});
|
||||||
|
BLT_DEBUG("Loaded Texture %s", back->getName().c_str());
|
||||||
|
delete back;
|
||||||
|
loaded_textures.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (true);
|
||||||
|
pool.stop();
|
||||||
|
while (!pool.complete());
|
||||||
|
while (!loaded_textures.empty())
|
||||||
|
{
|
||||||
|
auto* back = loaded_textures.back();
|
||||||
|
textures_2d.insert({back->getName(), new texture_gl2D(back->texture())});
|
||||||
|
loaded_textures.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue