shooter/engine/utils/ResourceManager.cpp

253 lines
7.2 KiB
C++
Raw Normal View History

2021-09-13 15:53:43 +03:00
//
// Created by Neirokan on 09.05.2020
//
#include <map>
#include <memory>
#include <sstream>
#include <fstream>
2021-10-31 11:39:08 +03:00
#include "ResourceManager.h"
2022-07-11 16:58:05 +03:00
#include "Log.h"
2021-10-31 11:39:08 +03:00
ResourceManager *ResourceManager::_instance = nullptr;
2021-10-17 19:38:16 +03:00
void ResourceManager::init() {
2021-11-09 22:54:20 +03:00
delete _instance;
2021-10-17 19:38:16 +03:00
_instance = new ResourceManager();
Log::log("ResourceManager::init(): resource manager was initialized");
2021-10-17 19:38:16 +03:00
}
2021-10-31 11:39:08 +03:00
std::shared_ptr<sf::Texture> ResourceManager::loadTexture(const std::string &filename) {
2021-11-09 22:54:20 +03:00
if (_instance == nullptr) {
2021-10-17 19:38:16 +03:00
return nullptr;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
// If texture is already loaded - return pointer to it
auto it = _instance->_textures.find(filename);
2021-10-28 16:58:02 +03:00
if (it != _instance->_textures.end()) {
2021-10-17 19:38:16 +03:00
return it->second;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
// Otherwise - try to load it. If failure - return zero
std::shared_ptr<sf::Texture> texture(new sf::Texture);
2021-10-28 16:58:02 +03:00
if (!texture->loadFromFile(filename)) {
Log::log("ResourceManager::loadTexture: error with loading texture '" + filename + "'");
2021-10-17 19:38:16 +03:00
return nullptr;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
Log::log("ResourceManager::loadTexture: texture '" + filename + "' was loaded");
2021-10-17 19:38:16 +03:00
// If success - remember and return texture pointer
texture->setRepeated(true);
_instance->_textures.emplace(filename, texture);
return texture;
2021-09-13 15:53:43 +03:00
}
2021-10-17 19:38:16 +03:00
2021-10-31 11:39:08 +03:00
std::shared_ptr<sf::SoundBuffer> ResourceManager::loadSoundBuffer(const std::string &filename) {
2021-11-09 22:54:20 +03:00
if (_instance == nullptr) {
2021-10-17 19:38:16 +03:00
return nullptr;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
// If sound buffer is already loaded - return pointer to it
auto it = _instance->_soundBuffers.find(filename);
2021-10-28 16:58:02 +03:00
if (it != _instance->_soundBuffers.end()) {
2021-10-17 19:38:16 +03:00
return it->second;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
// Otherwise - try to load it. If failure - return zero
std::shared_ptr<sf::SoundBuffer> soundBuffer(new sf::SoundBuffer);
2021-10-28 16:58:02 +03:00
if (!soundBuffer->loadFromFile(filename)) {
Log::log("ResourceManager::loadSoundBuffer: error with loading sound buffer '" + filename + "'");
2021-10-17 19:38:16 +03:00
return nullptr;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
Log::log("ResourceManager::loadSoundBuffer: sound buffer '" + filename + "' was loaded");
// If success - remember and return sound pointer
2021-10-17 19:38:16 +03:00
_instance->_soundBuffers.emplace(filename, soundBuffer);
return soundBuffer;
}
2021-10-31 11:39:08 +03:00
std::shared_ptr<sf::Font> ResourceManager::loadFont(const std::string &filename) {
2021-11-09 22:54:20 +03:00
if (_instance == nullptr) {
2021-10-17 19:38:16 +03:00
return nullptr;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
// If font is already loaded - return pointer to it
auto it = _instance->_fonts.find(filename);
2021-10-28 16:58:02 +03:00
if (it != _instance->_fonts.end()) {
2021-10-17 19:38:16 +03:00
return it->second;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
// Otherwise - try to load it. If failure - return zero
std::shared_ptr<sf::Font> font(new sf::Font);
2021-10-28 16:58:02 +03:00
if (!font->loadFromFile(filename)) {
Log::log("ResourceManager::loadFont: error with loading font: '" + filename + "'");
2021-10-17 19:38:16 +03:00
return nullptr;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
Log::log("ResourceManager::loadFont: font '" + filename + "' was loaded");
// If success - remember and return font pointer
2021-10-17 19:38:16 +03:00
_instance->_fonts.emplace(filename, font);
return font;
}
std::vector<std::shared_ptr<Mesh>> ResourceManager::loadObjects(const std::string &filename) {
2021-10-29 23:44:37 +03:00
std::vector<std::shared_ptr<Mesh>> objects{};
std::map<std::string, sf::Color> maters{};
2021-11-09 22:54:20 +03:00
if (_instance == nullptr) {
2021-10-29 23:44:37 +03:00
return objects;
}
// If objects is already loaded - return pointer to it
auto it = _instance->_objects.find(filename);
if (it != _instance->_objects.end()) {
return it->second;
}
std::ifstream file(filename);
2021-10-28 16:58:02 +03:00
if (!file.is_open()) {
Log::log("Mesh::LoadObjects(): cannot load file from '" + filename + "'");
return objects;
}
2021-10-28 16:58:02 +03:00
std::vector<Vec4D> verts{};
std::vector<Triangle> tris{};
sf::Color currentColor = sf::Color(255, 245, 194, 255);
2021-10-28 16:58:02 +03:00
while (!file.eof()) {
char line[128];
file.getline(line, 128);
std::stringstream s;
s << line;
char junk;
2021-10-31 11:39:08 +03:00
if (line[0] == 'o') {
if (!tris.empty())
objects.push_back(
2022-07-07 13:14:00 +03:00
std::make_shared<Mesh>(ObjectNameTag(filename + "_temp_obj_" + std::to_string(objects.size())), tris));
tris.clear();
}
2021-10-31 11:39:08 +03:00
if (line[0] == 'v') {
double x, y, z;
s >> junk >> x >> y >> z;
2021-10-28 16:58:02 +03:00
verts.emplace_back(x, y, z, 1.0);
}
2021-10-31 11:39:08 +03:00
if (line[0] == 'g') {
std::string matInfo;
s >> junk >> matInfo;
2021-10-31 11:39:08 +03:00
std::string colorName = matInfo.substr(matInfo.size() - 3, 3);
currentColor = maters[matInfo.substr(matInfo.size() - 3, 3)];
}
2021-10-31 11:39:08 +03:00
if (line[0] == 'f') {
int f[3];
s >> junk >> f[0] >> f[1] >> f[2];
tris.emplace_back(verts[f[0] - 1], verts[f[1] - 1], verts[f[2] - 1], currentColor);
}
2021-10-31 11:39:08 +03:00
if (line[0] == 'm') {
int color[4];
std::string matName;
s >> junk >> matName >> color[0] >> color[1] >> color[2] >> color[3];
2021-10-31 11:39:08 +03:00
maters.insert({matName, sf::Color(color[0], color[1], color[2], color[3])});
}
}
2021-10-31 11:39:08 +03:00
if (!tris.empty()) {
2021-10-28 16:58:02 +03:00
objects.push_back(
std::make_shared<Mesh>(ObjectNameTag(filename + "_temp_obj_" + std::to_string(objects.size())), tris));
}
tris.clear();
file.close();
Log::log("Mesh::LoadObjects(): obj '" + filename + "' was loaded");
// If success - remember and return vector of objects pointer
_instance->_objects.emplace(filename, objects);
return objects;
}
2021-11-09 22:54:20 +03:00
void ResourceManager::unloadTextures() {
if (_instance == nullptr) {
return;
}
int texturesCounter = _instance->_textures.size();
for (auto &_texture : _instance->_textures) {
_texture.second.reset();
}
_instance->_textures.clear();
Log::log("ResourceManager::unloadTextures(): all " + std::to_string(texturesCounter) + " textures was unloaded");
}
void ResourceManager::unloadSoundBuffers() {
if (_instance == nullptr) {
return;
}
int soundBuffersCounter = _instance->_soundBuffers.size();
for (auto &_soundBuffer : _instance->_soundBuffers) {
_soundBuffer.second.reset();
}
_instance->_soundBuffers.clear();
Log::log("ResourceManager::unloadSoundBuffers(): all " + std::to_string(soundBuffersCounter) +
" soundBuffers was unloaded");
}
void ResourceManager::unloadFonts() {
if (_instance == nullptr) {
return;
}
int fontsCounter = _instance->_fonts.size();
for (auto &_font : _instance->_fonts) {
_font.second.reset();
}
_instance->_fonts.clear();
Log::log("ResourceManager::unloadFonts(): all " + std::to_string(fontsCounter) + " fonts was unloaded");
}
void ResourceManager::unloadObjects() {
if (_instance == nullptr) {
return;
}
int objCounter = _instance->_objects.size();
_instance->_objects.clear();
Log::log("ResourceManager::unloadObjects(): all " + std::to_string(objCounter) + " objects was unloaded");
}
void ResourceManager::unloadAllResources() {
unloadTextures();
unloadSoundBuffers();
unloadFonts();
unloadObjects();
Log::log("ResourceManager::unloadAllResources(): all resources was unloaded");
}
void ResourceManager::free() {
unloadAllResources();
delete _instance;
_instance = nullptr;
Log::log("ResourceManager::free(): pointer to 'ResourceManager' was freed");
}