diff --git a/Resources/music/VIdeo Game Music.wav b/Resources/music/VIdeo Game Music.wav deleted file mode 100644 index 01c40ec..0000000 Binary files a/Resources/music/VIdeo Game Music.wav and /dev/null differ diff --git a/Resources/music/main_song.ogg b/Resources/music/main_song.ogg new file mode 100644 index 0000000..71dde7b Binary files /dev/null and b/Resources/music/main_song.ogg differ diff --git a/YuppleMayham/CMakeLists.txt b/YuppleMayham/CMakeLists.txt index 7cea616..7560675 100644 --- a/YuppleMayham/CMakeLists.txt +++ b/YuppleMayham/CMakeLists.txt @@ -47,6 +47,7 @@ add_executable (YuppleMayham "src/gameplay/weapons/bulletmanager.cpp" "src/gameplay/scene.cpp" "src/graphics/texture.cpp" + "src/graphics/background.cpp" "src/utility/resourcemanager.cpp" "src/utility/xmlloader.cpp" diff --git a/YuppleMayham/include/gameplay/game.h b/YuppleMayham/include/gameplay/game.h index 58c194b..69b515c 100644 --- a/YuppleMayham/include/gameplay/game.h +++ b/YuppleMayham/include/gameplay/game.h @@ -27,7 +27,8 @@ public: bool loadDebugScene(); - void handleInput(SDL_Event& e); + void captureInput(SDL_Event& e); + void executeInputs(); void update(double deltaTime); void render(); @@ -38,6 +39,7 @@ public: const unsigned getWindowHeight() const; void quit() { game_state = GAME_QUITTING; } + ~Game(); private: unsigned game_state = GAME_QUITTING; @@ -52,4 +54,4 @@ private: std::shared_ptr globalEventManager; }; -#endif \ No newline at end of file +#endif diff --git a/YuppleMayham/include/gameplay/input.h b/YuppleMayham/include/gameplay/input.h index 4e50b73..b7e16a0 100644 --- a/YuppleMayham/include/gameplay/input.h +++ b/YuppleMayham/include/gameplay/input.h @@ -2,6 +2,7 @@ #define _H_INPUT_H #include "utility/logger.h" +#include #include #include #include @@ -46,15 +47,12 @@ protected: mouseButtons[MOUSE_BUTTON_LEFT] = true; if (e.type == SDL_MOUSEBUTTONUP) mouseButtons[MOUSE_BUTTON_LEFT] = false; - if (e.type == SDL_MOUSEMOTION) - { - mouse_state.x = static_cast(e.motion.x); - mouse_state.y = static_cast(e.motion.y); - // Quick fix regarding linux holding storing too many mouse events - SDL_FlushEvent(SDL_MOUSEMOTION); - } if (e.type == SDL_MOUSEWHEEL) mouse_state.scroll = e.wheel.preciseY; + if (e.type == SDL_MOUSEMOTION) { + mouse_state.x = static_cast(e.motion.x); + mouse_state.y = static_cast(e.motion.y); + } } MouseState mouse_state; std::unordered_map mouseButtons; @@ -95,11 +93,14 @@ public: mouseScrollCommand = command; } void handleInput(); + void executeCommands(); private: GameActor* actor = nullptr; std::unordered_map keyCommands; std::unordered_map mouseCommands; + std::vector commandQueue; + std::vector mouseQueue; MouseCommand* mouseMotionCommand = nullptr; MouseCommand* mouseScrollCommand = nullptr; }; diff --git a/YuppleMayham/include/gameplay/scene.h b/YuppleMayham/include/gameplay/scene.h index 646ab63..45d0a59 100644 --- a/YuppleMayham/include/gameplay/scene.h +++ b/YuppleMayham/include/gameplay/scene.h @@ -7,6 +7,7 @@ #include +class Background; class Entity; class Camera; class Map; @@ -61,6 +62,9 @@ private: void hookSceneEvents(); GameActor* getGameActorByID(const unsigned int ID); + // Non-owning pointer DO NOT DELETE, resource manager will handle that! + Background *background; + SceneType type; std::shared_ptr map; //std::shared_ptr tileSet; @@ -77,4 +81,4 @@ private: std::shared_ptr sceneData; }; -#endif //_H_SCENE_H \ No newline at end of file +#endif //_H_SCENE_H diff --git a/YuppleMayham/include/graphics/background.h b/YuppleMayham/include/graphics/background.h new file mode 100644 index 0000000..ac675bb --- /dev/null +++ b/YuppleMayham/include/graphics/background.h @@ -0,0 +1,24 @@ +#ifndef _H_BACKGROUND_H +#define _H_BACKGROUND_H + +#include "graphics/quad.h" +#include "graphics/drawable.h" +#include "graphics/texture.h" + +#include "utility/logger.h" + +class Background : public Drawable +{ +public: + Background(const std::string& fileName); + + void draw() override; + + ~Background(); + +private: + ScreenQuad *quad; + Texture *texture; +}; + +#endif // _H_BACKGROUND_H diff --git a/YuppleMayham/include/graphics/drawable.h b/YuppleMayham/include/graphics/drawable.h new file mode 100644 index 0000000..3dbe513 --- /dev/null +++ b/YuppleMayham/include/graphics/drawable.h @@ -0,0 +1,50 @@ +#ifndef _H_DRAWABLE_H +#define _H_DRAWABLE_H + +#include +#include +#include +#include + +using UniformValue = std::variant< + int, + bool, + float, + double, + glm::mat4, + glm::vec2 +>; + +struct Uniform { + std::string name; + UniformValue value; +}; + +class Drawable +{ +public: + virtual void draw() = 0; + const unsigned getShaderID() const { return shaderID; } + const std::vector& getUniforms() { return uniforms; } + const std::vector& getOneShotUniforms() { return oneShotUniforms; } + void clearOneShot() { oneShotUniforms.clear(); } + void clearUniforms() { uniforms.clear(); } +protected: + unsigned shaderID; + template + void editUniform(const std::string& name, T value) + { + uniforms.emplace_back(Uniform {name, value}); + } + + template + void editUniformOnce(const std::string& name, T value) + { + oneShotUniforms.emplace_back(Uniform {name, value}); + } +private: + std::vector uniforms; + std::vector oneShotUniforms; +}; + +#endif // _H_DRAWABLE_H diff --git a/YuppleMayham/include/graphics/quad.h b/YuppleMayham/include/graphics/quad.h index a30feff..1445155 100644 --- a/YuppleMayham/include/graphics/quad.h +++ b/YuppleMayham/include/graphics/quad.h @@ -8,7 +8,7 @@ class Quad { public: void draw(); - ~Quad(); + virtual ~Quad(); protected: Quad(const float* vertexData); private: diff --git a/YuppleMayham/include/graphics/renderer.h b/YuppleMayham/include/graphics/renderer.h index 2e38d10..1bdc0fa 100644 --- a/YuppleMayham/include/graphics/renderer.h +++ b/YuppleMayham/include/graphics/renderer.h @@ -3,12 +3,11 @@ #include #include -#include -#include #include #include #include "graphics/quad.h" +#include "graphics/drawable.h" #include "graphics/postprocess.h" class ResourceManager; @@ -23,47 +22,6 @@ enum class RenderLayer { Menu }; -using UniformValue = std::variant< - int, - bool, - float, - double, - glm::mat4, - glm::vec2 ->; - -struct Uniform { - std::string name; - UniformValue value; -}; - -class Drawable -{ -public: - virtual void draw() = 0; - const unsigned getShaderID() const { return shaderID; } - const std::vector& getUniforms() { return uniforms; } - const std::vector& getOneShotUniforms() { return oneShotUniforms; } - void clearOneShot() { oneShotUniforms.clear(); } - void clearUniforms() { uniforms.clear(); } -protected: - unsigned shaderID; - template - void editUniform(const std::string& name, T value) - { - uniforms.emplace_back(Uniform {name, value}); - } - - template - void editUniformOnce(const std::string& name, T value) - { - oneShotUniforms.emplace_back(Uniform {name, value}); - } -private: - std::vector uniforms; - std::vector oneShotUniforms; -}; - class Renderer { public: @@ -74,14 +32,14 @@ public: void hookEventManager(const std::weak_ptr eventManager); void setProjAndViewMatrix(const glm::mat4& proj, const glm::mat4& view); - void addDrawable(RenderLayer renderLayer, std::shared_ptr drawable); - void removeDrawable(RenderLayer renderLayer, std::shared_ptr drawable); + void addDrawable(RenderLayer renderLayer, Drawable *drawable); + void removeDrawable(RenderLayer renderLayer, Drawable *drawable); void render(); private: - std::unordered_map>> worldLayerPool; - std::unordered_map>> HUDLayerPool; + std::unordered_map> worldLayerPool; + std::unordered_map> HUDLayerPool; std::vector renderingOrder = { RenderLayer::Background, RenderLayer::Map, diff --git a/YuppleMayham/include/graphics/shader.h b/YuppleMayham/include/graphics/shader.h index 15a23de..cd19f37 100644 --- a/YuppleMayham/include/graphics/shader.h +++ b/YuppleMayham/include/graphics/shader.h @@ -7,10 +7,15 @@ class Shader { -private: +protected: + bool compileAndLink(const char *vSource, const char *fSource); + std::string vertexPath; + std::string fragmentPath; + bool valid; + Shader(); public: unsigned int ID; - Shader(const char* vertexPath, const char* fragmentPath); + Shader(const char* vertPath, const char* fragPath); void use() { glUseProgram(ID); } void setFloat(const std::string& name, float value); @@ -21,7 +26,15 @@ public: void setVec2(const std::string& name, const float* value); void setMatrix4f(const std::string& name, const float* value); - ~Shader(); + bool isValid() { return valid; } + + virtual ~Shader(); +}; + +class GenericShader : public Shader +{ +public: + GenericShader() : Shader() {}; }; #endif // _H_SHADER_H diff --git a/YuppleMayham/include/utility/resourcemanager.h b/YuppleMayham/include/utility/resourcemanager.h index a0720bc..2d9c480 100644 --- a/YuppleMayham/include/utility/resourcemanager.h +++ b/YuppleMayham/include/utility/resourcemanager.h @@ -8,6 +8,7 @@ #include "utility/xmlloader.h" #include "graphics/shader.h" #include "graphics/sprite.h" +#include "graphics/background.h" #include class Weapon; @@ -28,19 +29,25 @@ public: xmlLoader->loadTileSets("maps/tilesets"); xmlLoader->loadMaps("maps"); xmlLoader->loadScenes("scenes"); + shaders["__fallback__"] = std::make_unique(); }; - SpriteAtlas* loadSpriteAtlas (const std::string& path, float frameSize, bool isDirectional = false); - Sprite* loadSpriteStatic (const std::string& path); - std::shared_ptr loadAIScript (const std::string& path); + // Returns a NON-OWNING pointer to a sprite atlas + SpriteAtlas* loadSpriteAtlas (const std::string& path, float frameSize, bool isDirectional = false); + // Returns a NON-OWNING pointer to a static sprite + Sprite* loadSpriteStatic (const std::string& path); + // Returns a NON-OWNING pointer to a background + Background* loadBackground (const std::string& path); + std::shared_ptr loadAIScript (const std::string& path); std::shared_ptr loadWeaponScript (const std::string& path); - const unsigned loadShader (const std::string& name, const std::string& vertexPath, const std::string& fragPath); - std::shared_ptr loadWeapon (const std::string& name, const unsigned weaponShaderID, const unsigned bulletShaderID); - std::shared_ptr loadScene (const std::string& id); - std::shared_ptr loadAnimationSet(const std::string& name, int entityid = 0); - std::shared_ptr loadTileSet (const std::string& name); + const unsigned loadShader (const std::string& name, const std::string& vertexPath, const std::string& fragPath); + std::shared_ptr loadWeapon (const std::string& name, const unsigned weaponShaderID, const unsigned bulletShaderID); + std::shared_ptr loadScene (const std::string& id); + std::shared_ptr loadAnimationSet (const std::string& name, int entityid = 0); + std::shared_ptr loadTileSet (const std::string& name); + // Returns a NON-OWNING pointer to a shader by ID Shader* getShaderByID(unsigned int ID); void clearResources(); @@ -48,12 +55,13 @@ public: ~ResourceManager(); private: - std::unordered_map> shaders; - std::unordered_map shaderIDs; - std::unordered_map> sprites; - std::unordered_map> weapons; - std::unordered_map> scripts; - std::unordered_map>tileSets; + std::unordered_map> shaders; + std::unordered_map shaderIDs; + std::unordered_map> sprites; + std::unordered_map> weapons; + std::unordered_map> scripts; + std::unordered_map> backgrounds; + std::unordered_map> tileSets; //std::unordered_map> entityData; //std::unordered_map> scenes; //std::unordered_map> maps; @@ -62,4 +70,4 @@ private: std::shared_ptr xmlLoader; }; -#endif // _H_RESOURCEMANAGER_H \ No newline at end of file +#endif // _H_RESOURCEMANAGER_H diff --git a/YuppleMayham/src/gameplay/game.cpp b/YuppleMayham/src/gameplay/game.cpp index 982cf5d..1adf334 100644 --- a/YuppleMayham/src/gameplay/game.cpp +++ b/YuppleMayham/src/gameplay/game.cpp @@ -74,10 +74,15 @@ bool Game::loadDebugScene() return true; } -void Game::handleInput(SDL_Event& e) +void Game::captureInput(SDL_Event& e) { inputHandler->captureInput(e); +} + +void Game::executeInputs() +{ inputHandler->handleInput(); + inputHandler->executeCommands(); } void Game::update(double deltaTime) @@ -102,3 +107,8 @@ void Game::render() window->swap(); } + +Game::~Game() +{ + resourceManager->clearResources(); +} diff --git a/YuppleMayham/src/gameplay/input.cpp b/YuppleMayham/src/gameplay/input.cpp index b4e1edc..61a846b 100644 --- a/YuppleMayham/src/gameplay/input.cpp +++ b/YuppleMayham/src/gameplay/input.cpp @@ -1,6 +1,5 @@ #include "gameplay/input.h" #include "utility/command.h" -#include "gameplay/gameactor.h" #include @@ -17,7 +16,7 @@ void InputHandler::handleInput() { if (currentTime - command.lastExecution >= command.delay) { - command.cmd->execute(*actor); + commandQueue.push_back(command.cmd); command.lastExecution = currentTime; } } @@ -29,7 +28,7 @@ void InputHandler::handleInput() { if (currentTime - command.lastExecution >= command.delay) { - command.cmd->execute(*actor, mouse_state); + mouseQueue.push_back(command.cmd); command.lastExecution = currentTime; } } @@ -40,3 +39,16 @@ void InputHandler::handleInput() mouseScrollCommand->execute(*actor, mouse_state); mouse_state.scroll = 0.0f; // clear mouse scroll since we have handled the event. } + +// Executes every captured command during the frame +void InputHandler::executeCommands() +{ + for (auto& command : commandQueue) { + command->execute(*actor); + } + for (auto& mouse : mouseQueue) { + mouse->execute(*actor, mouse_state); + } + commandQueue.clear(); + mouseQueue.clear(); +} diff --git a/YuppleMayham/src/gameplay/scene.cpp b/YuppleMayham/src/gameplay/scene.cpp index 0691386..7f4230c 100644 --- a/YuppleMayham/src/gameplay/scene.cpp +++ b/YuppleMayham/src/gameplay/scene.cpp @@ -9,6 +9,7 @@ #include "graphics/sprite.h" #include "graphics/animation.h" +#include "graphics/background.h" #include "utility/component.h" #include "utility/ftfont.h" @@ -59,6 +60,11 @@ void Scene::loadDebugShooterScene() auto bubbleShader = resourceManager->loadShader("GL_bubble", "shaders/GL_bubble.vert", "shaders/GL_bubble.frag"); auto weaponShader = resourceManager->loadShader("GL_pistol", "shaders/GL_pistol.vert", "shaders/GL_pistol.frag"); + if (!sceneData->bgFile.empty()) { + LOG(INFO, "Found background loading '{}'", sceneData->bgFile); + background = resourceManager->loadBackground(sceneData->bgFile); + } + // creating map from scene auto tileShader = resourceManager->loadShader("GL_tile", "shaders/GL_tile.vert", "shaders/GL_tile.frag"); map = std::make_shared(mapData, tileShader, resourceManager); @@ -149,16 +155,19 @@ void Scene::render(std::shared_ptr renderer) renderer->clear(); renderer->setProjAndViewMatrix(camera->getProjectionMatrix(), camera->getViewMatrix()); - renderer->addDrawable(RenderLayer::Map, map); + renderer->addDrawable(RenderLayer::Map, map.get()); + if (background) { + renderer->addDrawable(RenderLayer::Background, static_cast(background)); + } //map->draw(); for (auto& [id, e] : entities) { //e->draw(); - renderer->addDrawable(RenderLayer::GameObjects, e); + renderer->addDrawable(RenderLayer::GameObjects, e.get()); if (e->getHeldWeapon()) { - renderer->addDrawable(RenderLayer::GameObjects, e->getHeldWeapon()); + renderer->addDrawable(RenderLayer::GameObjects, e->getHeldWeapon().get()); for (const auto& bullet : e->getHeldWeapon()->getBulletManager()->getBullets()) { - renderer->addDrawable(RenderLayer::GameObjects, bullet); + renderer->addDrawable(RenderLayer::GameObjects, bullet.get()); } } } diff --git a/YuppleMayham/src/graphics/background.cpp b/YuppleMayham/src/graphics/background.cpp new file mode 100644 index 0000000..d2d0f26 --- /dev/null +++ b/YuppleMayham/src/graphics/background.cpp @@ -0,0 +1,23 @@ +#include "graphics/background.h" + +Background::Background(const std::string& fileName) +{ + // This will fallback to the generic shader. + shaderID = 0; + texture = new Texture(); + quad = new ScreenQuad(); + if (!texture->loadTexture(fileName.c_str())) + LOG(ERROR, "Failed to load background texture: '{}'", fileName); +} + +void Background::draw() +{ + texture->bind(); + quad->draw(); +} + +Background::~Background() +{ + delete texture; + delete quad; +} diff --git a/YuppleMayham/src/graphics/quad.cpp b/YuppleMayham/src/graphics/quad.cpp index cc019cd..215c71e 100644 --- a/YuppleMayham/src/graphics/quad.cpp +++ b/YuppleMayham/src/graphics/quad.cpp @@ -1,7 +1,5 @@ #include "graphics/quad.h" -#include - Quad::Quad(const float* vertexData) { std::memcpy(vertices, vertexData, sizeof(vertices)); @@ -43,4 +41,4 @@ Quad::~Quad() glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); glDeleteVertexArrays(1, &VAO); -} \ No newline at end of file +} diff --git a/YuppleMayham/src/graphics/renderer.cpp b/YuppleMayham/src/graphics/renderer.cpp index bd1c9d1..bf496a8 100644 --- a/YuppleMayham/src/graphics/renderer.cpp +++ b/YuppleMayham/src/graphics/renderer.cpp @@ -108,7 +108,7 @@ void Renderer::setProjAndViewMatrix(const glm::mat4& proj, const glm::mat4& view glBindBuffer(GL_UNIFORM_BUFFER, 0); } -void Renderer::addDrawable(RenderLayer renderLayer, std::shared_ptr drawable) +void Renderer::addDrawable(RenderLayer renderLayer, Drawable *drawable) { if (renderLayer == RenderLayer::HUD || renderLayer == RenderLayer::Menu) HUDLayerPool[renderLayer].push_back(drawable); @@ -116,7 +116,7 @@ void Renderer::addDrawable(RenderLayer renderLayer, std::shared_ptr dr worldLayerPool[renderLayer].push_back(drawable); } -void Renderer::removeDrawable(RenderLayer renderLayer, std::shared_ptr drawable) +void Renderer::removeDrawable(RenderLayer renderLayer, Drawable *drawable) { auto erase = [&](auto& pool) { pool.erase(std::remove(pool.begin(), pool.end(), drawable), pool.end()); @@ -163,17 +163,7 @@ void Renderer::renderPool(auto& layerPool) if (item->getShaderID() != curShaderID) { curShaderID = item->getShaderID(); curShader = resourceManager->getShaderByID(curShaderID); - - if (curShader) { - curShader->use(); - /* - curShader->setMatrix4f("projection", glm::value_ptr(projMat)); - curShader->setMatrix4f("view", glm::value_ptr(viewMat)); - */ - } else { - LOG(ERROR, "Shader with ID {} not found!", curShaderID); - continue; - } + curShader->use(); } if (!item->getOneShotUniforms().empty()) { uploadUniforms(curShaderID, item->getOneShotUniforms()); @@ -226,7 +216,7 @@ void Renderer::sortLayerPool(auto& layerPool) // Sort by shader id, this works to batch shaders together to avoid shader switching too much for (auto& [_,pool] : layerPool) { std::sort(pool.begin(), pool.end(), - [](const std::shared_ptr& a, const std::shared_ptr& b) { + [](const Drawable* a, const Drawable* b) { return a->getShaderID() < b->getShaderID(); }); } diff --git a/YuppleMayham/src/graphics/shader.cpp b/YuppleMayham/src/graphics/shader.cpp index d257e29..225fc23 100644 --- a/YuppleMayham/src/graphics/shader.cpp +++ b/YuppleMayham/src/graphics/shader.cpp @@ -3,7 +3,37 @@ #include "utility/logger.h" #include -Shader::Shader(const char* vertexPath, const char* fragmentPath) +// Load a generic fallback shader +Shader::Shader() +{ + std::string vertexSource = { + // generic vertex shader program + "#version 330 core\n" + "layout (location = 0) in vec3 aPos;\n" + "layout (location = 1) in vec2 aTexCoord;\n" + "out vec2 texCoord;\n" + "void main()\n" + "{\n" + " texCoord = aTexCoord;\n" + " gl_Position = vec4(aPos, 1.0);\n" + "}\0" + }; + std::string fragmentSource = { + // generic fragment shader program + "#version 330 core\n" + "in vec2 texCoord;\n" + "out vec4 FragColor;\n" + "uniform sampler2D sprite;\n" + "void main()\n" + "{\n" + " FragColor = texture(sprite, texCoord);\n" + "}\0" + }; + compileAndLink(vertexSource.c_str(), fragmentSource.c_str()); + valid = true; +} + +Shader::Shader(const char* vertPath, const char* fragPath) : vertexPath(vertPath), fragmentPath(fragPath) { std::string vertexSource; std::string fragmentSource; @@ -35,7 +65,15 @@ Shader::Shader(const char* vertexPath, const char* fragmentPath) } const char* vSource = vertexSource.c_str(); const char* fSource = fragmentSource.c_str(); + if (!compileAndLink(vertexSource.c_str(), fragmentSource.c_str())) { + LOG(ERROR, "Failed to compile and/or link shader! Check error details for more information.\nUsing fallback shader!", NULL); + valid = false; + } + valid = true; +} +bool Shader::compileAndLink(const char *vSource, const char *fSource) +{ unsigned int vertexid, fragmentid; char infoLog[512]; int success; @@ -50,6 +88,7 @@ Shader::Shader(const char* vertexPath, const char* fragmentPath) { glGetShaderInfoLog(vertexid, 512, NULL, infoLog); LOG(ERROR, "VERTEX SHADER '{}' COMPILE ERROR\n{}", vertexPath, infoLog); + return false; } //compile fragment shader @@ -62,6 +101,7 @@ Shader::Shader(const char* vertexPath, const char* fragmentPath) { glGetShaderInfoLog(fragmentid, 512, NULL, infoLog); LOG(ERROR, "FRAGMENT SHADER '{}' COMPILE ERROR\n{}", fragmentPath, infoLog); + return false; } //create and link program with compiled shaders @@ -75,12 +115,14 @@ Shader::Shader(const char* vertexPath, const char* fragmentPath) { glGetProgramInfoLog(ID, 512, NULL, infoLog); LOG(ERROR, "PROGRAM LINKER ERROR\n{}", infoLog); + return false; } glDeleteShader(vertexid); glDeleteShader(fragmentid); glUniformBlockBinding(ID, glGetUniformBlockIndex(ID, "Matrices"), 0); + return true; } void Shader::setFloat(const std::string& name, float value) diff --git a/YuppleMayham/src/main.cpp b/YuppleMayham/src/main.cpp index a0584ad..b36147e 100644 --- a/YuppleMayham/src/main.cpp +++ b/YuppleMayham/src/main.cpp @@ -49,11 +49,13 @@ int main(int argc, char* args[]) Uint64 curCounter = SDL_GetPerformanceCounter(); double deltaTime = ((curCounter - lastCounter) / freq); deltaTime = (deltaTime < 1.0) ? deltaTime : 1.0; - SDL_PollEvent(&e); - if (e.type == SDL_QUIT) - game->quit(); + while (SDL_PollEvent(&e)) { + if (e.type == SDL_QUIT) + game->quit(); - game->handleInput(e); + game->captureInput(e); + } + game->executeInputs(); game->render(); game->update(deltaTime); @@ -61,6 +63,7 @@ int main(int argc, char* args[]) } + delete game; IMG_Quit(); SDL_Quit(); diff --git a/YuppleMayham/src/utility/resourcemanager.cpp b/YuppleMayham/src/utility/resourcemanager.cpp index 428f479..b1af38e 100644 --- a/YuppleMayham/src/utility/resourcemanager.cpp +++ b/YuppleMayham/src/utility/resourcemanager.cpp @@ -1,9 +1,9 @@ #include "utility/resourcemanager.h" -#include "utility/component.h" #include "graphics/sprite.h" #include "utility/script.h" #include "graphics/shader.h" #include "graphics/animation.h" +#include "graphics/background.h" #include "gameplay/weapons/weapons.h" SpriteAtlas* ResourceManager::loadSpriteAtlas(const std::string& path, float frameSize, bool isDirectional) @@ -50,6 +50,9 @@ const unsigned ResourceManager::loadShader(const std::string& name, const std::s if (iterator != shaders.end()) return iterator->second->ID; auto shader = std::make_unique(vertexPath.c_str(), fragPath.c_str()); + if (!shader->isValid()) { + return shaders["__fallback__"]->ID; + } unsigned id = shader->ID; shaderIDs[shader->ID] = shader.get(); shaders[name] = std::move(shader); @@ -59,7 +62,17 @@ const unsigned ResourceManager::loadShader(const std::string& name, const std::s Shader* ResourceManager::getShaderByID(unsigned int ID) { auto iterator = shaderIDs.find(ID); - return (iterator != shaderIDs.end() ? iterator->second : nullptr); + return (iterator != shaderIDs.end() ? iterator->second : shaders["__fallback__"].get()); +} + +Background* ResourceManager::loadBackground(const std::string& path) +{ + auto iterator = backgrounds.find(path); + if (iterator != backgrounds.end()) + return iterator->second.get(); + auto background = std::make_unique(path); + backgrounds[path] = std::move(background); + return backgrounds[path].get(); } // We attach our script after we create our weapon because we are passing a reference to the weapon into the script and we don't want to pass an