Move LoadObjects -> ResourceManager to avoid repeated loading from files.

master
Vectozavr 2021-10-18 10:44:04 +07:00
parent 4c768c5e78
commit 6d0202eaff
9 changed files with 103 additions and 82 deletions

View File

@ -110,7 +110,7 @@ void Player::previousWeapon() {
}
void Player::fire() {
if(attached(ObjectNameTag("camera")) != nullptr) {
if(attached(ObjectNameTag("Camera")) != nullptr) {
auto damagedPlayers = _weapons[_selectedWeapon]->fire(_rayCastFunction);
for(auto& [damagedPlayerName, damage] : damagedPlayers) {
sf::Uint16 targetId = std::stoi(damagedPlayerName.str().substr(6));

View File

@ -41,7 +41,7 @@ void PlayerController::update() {
Keyboard::isKeyPressed(sf::Keyboard::W) ||
Keyboard::isKeyPressed(sf::Keyboard::S));
std::shared_ptr<Object> camera = _player->attached(ObjectNameTag("camera"));
std::shared_ptr<Object> camera = _player->attached(ObjectNameTag("Camera"));
if(camera != nullptr && _inRunning && _player->inCollision()) {
if (!Timeline::isInAnimList(AnimationListTag("camera_hor_oscil"))) {
Timeline::animate(AnimationListTag("camera_hor_oscil"), new ATranslate(camera, -camera->left() / 6, 0.3,Animation::LoopOut::None, Animation::InterpolationType::cos));

View File

@ -87,7 +87,7 @@ void Shooter::start() {
player->initWeapons();
camera->translateToPoint(player->position() + Vec3D{0, 1.8, 0});
player->attach(camera, ObjectNameTag("camera"));
player->attach(camera, ObjectNameTag("Camera"));
world->addBody(player, ObjectNameTag("Player"));
player->translate(Vec3D{0, 10, 0});

View File

@ -3,11 +3,10 @@
//
#include <string>
#include <fstream>
#include <sstream>
#include <utility>
#include "Mesh.h"
#include "utils/Log.h"
#include "ResourceManager.h"
using namespace std;
@ -23,7 +22,7 @@ Mesh &Mesh::operator*=(const Matrix4x4 &matrix4X4) {
Mesh &Mesh::loadObj(const std::string& filename, const Vec3D& scale) {
auto objects = Mesh::LoadObjects(filename, scale);
auto objects = ResourceManager::loadObjects(filename, scale);
for(auto& obj : objects) {
for (auto &tri : obj->triangles()) {
_tris.push_back(tri);
@ -79,75 +78,6 @@ void Mesh::setColor(const sf::Color& c) {
setTriangles(newTriangles);
}
std::vector<std::shared_ptr<Mesh>> Mesh::LoadObjects(const string &filename, const Vec3D &scale) {
std::vector<std::shared_ptr<Mesh>> objects;
map<string, sf::Color> maters;
ifstream file(filename);
if (!file.is_open())
{
Log::log("Mesh::LoadObjects(): cannot load file from " + filename);
return objects;
}
vector<Point4D> verts;
std::vector<Triangle> tris;
sf::Color currentColor = sf::Color(255, 245, 194, 255);
while (!file.eof())
{
char line[128];
file.getline(line, 128);
stringstream s;
s << line;
char junk;
if(line[0] == 'o') {
if(!tris.empty()) {
objects.push_back(make_shared<Mesh>(tris));
objects.back()->scale(scale);
}
tris.clear();
}
if (line[0] == 'v')
{
double x, y, z;
s >> junk >> x >> y >> z;
verts.emplace_back(x, y, z, 1);
}
if(line[0] == 'g') {
string matInfo;
s >> junk >> matInfo;
string colorName = matInfo.substr(matInfo.size()-3, 3);
currentColor = maters[matInfo.substr(matInfo.size()-3, 3)];
}
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);
}
if(line[0] == 'm')
{
int color[4];
string matName;
s >> junk >> matName >> color[0] >> color[1] >> color[2] >> color[3];
maters.insert({matName, sf::Color(color[0],color[1],color[2], color[3])});
}
}
if(!tris.empty()) {
objects.push_back(make_shared<Mesh>(tris));
objects.back()->scale(scale);
}
file.close();
return objects;
}
Mesh Mesh::LineTo(const Vec3D& from, const Vec3D& to, double line_width, const sf::Color& color) {
Mesh line;

View File

@ -52,7 +52,6 @@ public:
~Mesh() override;
Mesh static Obj(const std::string& filename);
std::vector<std::shared_ptr<Mesh>> static LoadObjects(const std::string& filename, const Vec3D& scale = Vec3D{1, 1, 1});
Mesh static LineTo(const Vec3D& from, const Vec3D& to, double line_width = 0.1, const sf::Color& color = {150, 150, 150, 255});
};

View File

@ -3,8 +3,11 @@
//
#include "ResourceManager.h"
#include "utils/Log.h"
#include <map>
#include <memory>
#include <sstream>
#include <fstream>
ResourceManager* ResourceManager::_instance = nullptr;
@ -34,6 +37,7 @@ void ResourceManager::unloadAllResources() {
unloadTextures();
unloadSoundBuffers();
unloadFonts();
unloadObjects();
}
std::shared_ptr<sf::Texture> ResourceManager::loadTexture(const std::string& filename) {
@ -71,7 +75,7 @@ std::shared_ptr<sf::SoundBuffer> ResourceManager::loadSoundBuffer(const std::str
if (!soundBuffer->loadFromFile(filename))
return nullptr;
// If success - remember and return texture pointer
// If success - remember and return sound pointer
_instance->_soundBuffers.emplace(filename, soundBuffer);
return soundBuffer;
@ -91,15 +95,97 @@ std::shared_ptr<sf::Font> ResourceManager::loadFont(const std::string& filename)
if (!font->loadFromFile(filename))
return nullptr;
// If success - remember and return texture pointer
// If success - remember and return font pointer
_instance->_fonts.emplace(filename, font);
return font;
}
std::vector<std::shared_ptr<Mesh>> ResourceManager::loadObjects(const std::string &filename, const Vec3D& scale) {
// If objects is already loaded - return pointer to it
auto it = _instance->_objects.find(filename);
if (it != _instance->_objects.end())
return it->second;
std::vector<std::shared_ptr<Mesh>> objects{};
std::map<std::string, sf::Color> maters{};
std::ifstream file(filename);
if (!file.is_open())
{
Log::log("Mesh::LoadObjects(): cannot load file from " + filename);
return objects;
}
std::vector<Point4D> verts{};
std::vector<Triangle> tris{};
sf::Color currentColor = sf::Color(255, 245, 194, 255);
while (!file.eof())
{
char line[128];
file.getline(line, 128);
std::stringstream s;
s << line;
char junk;
if(line[0] == 'o') {
if(!tris.empty()) {
objects.push_back(make_shared<Mesh>(tris));
objects.back()->scale(scale);
}
tris.clear();
}
if (line[0] == 'v')
{
double x, y, z;
s >> junk >> x >> y >> z;
verts.emplace_back(x, y, z, 1);
}
if(line[0] == 'g') {
std::string matInfo;
s >> junk >> matInfo;
std::string colorName = matInfo.substr(matInfo.size()-3, 3);
currentColor = maters[matInfo.substr(matInfo.size()-3, 3)];
}
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);
}
if(line[0] == 'm')
{
int color[4];
std::string matName;
s >> junk >> matName >> color[0] >> color[1] >> color[2] >> color[3];
maters.insert({matName, sf::Color(color[0],color[1],color[2], color[3])});
}
}
if(!tris.empty()) {
objects.push_back(make_shared<Mesh>(tris));
objects.back()->scale(scale);
}
file.close();
// If success - remember and return vector of objects pointer
_instance->_objects.emplace(filename, objects);
return objects;
}
void ResourceManager::unloadObjects() {
_instance->_objects.clear();
}
void ResourceManager::free() {
unloadAllResources();
delete _instance;
_instance = nullptr;
}

View File

@ -8,12 +8,14 @@
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <memory>
#include "Mesh.h"
class ResourceManager final {
private:
std::map<std::string, std::shared_ptr<sf::Texture>> _textures;
std::map<std::string, std::shared_ptr<sf::Font>> _fonts;
std::map<std::string, std::shared_ptr<sf::SoundBuffer>> _soundBuffers;
std::map<std::string, std::vector<std::shared_ptr<Mesh>>> _objects;
static ResourceManager* _instance;
@ -23,10 +25,10 @@ public:
ResourceManager& operator=(ResourceManager&) = delete;
// Unloads all currently loaded textures.
static void unloadObjects();
static void unloadTextures();
static void unloadSoundBuffers();
static void unloadFonts();
static void unloadShaders();
static void unloadAllResources();
@ -36,6 +38,7 @@ public:
// Try to load texture from file.
// If success returns pointer to texture.
// Otherwise returns nullptr.
static std::vector<std::shared_ptr<Mesh>> loadObjects(const std::string& filename, const Vec3D& scale = Vec3D{1, 1, 1});
static std::shared_ptr<sf::Texture> loadTexture(const std::string& filename);
static std::shared_ptr<sf::Font> loadFont(const std::string& filename);
static std::shared_ptr<sf::SoundBuffer> loadSoundBuffer(const std::string& filename);

View File

@ -45,9 +45,11 @@ sf::Sound::Status SoundController::getStatus(const SoundTag& soundTag) {
if(_instance->_sounds.count(soundTag) > 0)
return _instance->_sounds[soundTag].getStatus();
else
else {
_instance->_sounds.erase(soundTag);
return sf::Sound::Status::Stopped;
}
}
void SoundController::free() {
for(auto& [soundTag, sound] : _instance->_sounds) {

View File

@ -5,6 +5,7 @@
#include "World.h"
#include "utils/Log.h"
#include "Plane.h"
#include "ResourceManager.h"
using namespace std;
@ -46,7 +47,7 @@ std::pair<Vec3D, ObjectNameTag> World::rayCast(const Vec3D& from, const Vec3D& t
}
void World::loadMap(const std::string& filename, const Vec3D& scale) {
auto objs = Mesh::LoadObjects(filename, scale);
auto objs = ResourceManager::loadObjects(filename, scale);
for(unsigned i = 0; i < objs.size(); i++) {
ObjectNameTag meshName = ObjectNameTag("map_" + to_string(i));
addBody(std::make_shared<RigidBody>(*objs[i]), meshName);