From c924a3feb86f6dd71e5dc10d8b48cb9f09a7c048 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 5 Oct 2018 20:33:56 +0800 Subject: [PATCH 01/88] Make `System::update()` non-pure virtual --- BloomFramework/include/Systems/DefaultSystem.h | 2 +- BloomFramework/include/Systems/RenderSystem.h | 2 +- Test Bench/GameObjectTest/RandomizerSystem.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BloomFramework/include/Systems/DefaultSystem.h b/BloomFramework/include/Systems/DefaultSystem.h index 33dbc752..2828bb6a 100644 --- a/BloomFramework/include/Systems/DefaultSystem.h +++ b/BloomFramework/include/Systems/DefaultSystem.h @@ -7,7 +7,7 @@ namespace bloom { class DefaultSystem { public: DefaultSystem(entt::DefaultRegistry & registry) : m_registry(registry) {}; - virtual void update(std::optional deltaTime = std::nullopt) = 0; + virtual void update(std::optional deltaTime = std::nullopt) {}; protected: entt::DefaultRegistry & m_registry; diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index bda6fb61..b186b4e4 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -8,7 +8,7 @@ namespace bloom { class RenderSystem : public System { using System::DefaultSystem; public: - void System::update(std::optional deltaTime = std::nullopt) + void update(std::optional deltaTime = std::nullopt) { m_registry.view().each( [](auto entity, Position & pos, Size& size, Sprite & spr) { diff --git a/Test Bench/GameObjectTest/RandomizerSystem.h b/Test Bench/GameObjectTest/RandomizerSystem.h index c94b3e68..348eca04 100644 --- a/Test Bench/GameObjectTest/RandomizerSystem.h +++ b/Test Bench/GameObjectTest/RandomizerSystem.h @@ -8,7 +8,7 @@ class RandomPositionSystem : bloom::System { public: using bloom::System::DefaultSystem; public: - void bloom::System::update(std::optional dt = std::nullopt) + void update(std::optional dt = std::nullopt) { m_registry.view().each( [this](auto entity, Position & pos) { From a2a93d4afd9d522fafe337bdd6d3e2e0ad00738b Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 5 Oct 2018 20:34:23 +0800 Subject: [PATCH 02/88] Add `Screen` class --- BloomFramework/BloomFramework.vcxproj | 2 ++ BloomFramework/BloomFramework.vcxproj.filters | 6 ++++ BloomFramework/include/Screen.h | 35 +++++++++++++++---- BloomFramework/src/Screen.cpp | 7 ++++ 4 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 BloomFramework/src/Screen.cpp diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index 5998e042..6681fb74 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -163,6 +163,7 @@ + @@ -175,6 +176,7 @@ + diff --git a/BloomFramework/BloomFramework.vcxproj.filters b/BloomFramework/BloomFramework.vcxproj.filters index 3ceb7498..d6ff53d2 100644 --- a/BloomFramework/BloomFramework.vcxproj.filters +++ b/BloomFramework/BloomFramework.vcxproj.filters @@ -39,6 +39,9 @@ Source Files + + Source Files + @@ -86,6 +89,9 @@ Header Files\Systems + + Header Files + diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index 09851308..513beee6 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -1,17 +1,40 @@ #pragma once #include "stdIncludes.h" #include "Game.h" - +#include "Systems/Systems.h" +#include "GameObject.h" +#include +#include namespace bloom { class BLOOMFRAMEWORK_API Screen { public: Screen(Game& gameInstance); - void handleInput(); - void render(); + void update(); + + //Game Object stuff + template + void addGameObject(std::string tag) { + static_assert (std::is_base_of::value, "Type T passed in is not a GameObject."); + auto tmp = m_gameObjects.emplace(tag, T(m_registry, m_gameInstance)); + tmp.second.init(); + } + + void destroyGameObject(std::string tag); + + // System stuff + template + void registerSystem() { + static_assert (std::is_base_of::value, "Type T passed in is not a System."); + } + template + void unregisterSystem() { + static_assert (std::is_base_of::value, "Type T passed in is not a System."); + } private: - // std::vector gameObjects; // GameObject not implemented yet. - entt::DefaultRegistry registry; - Game& _gameInstance; + std::map m_systems; // We use map here because we want to iterate in order of insertion. + std::unordered_map m_gameObjects; + entt::DefaultRegistry m_registry; + Game *& m_gameInstance; }; } \ No newline at end of file diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp new file mode 100644 index 00000000..41719f31 --- /dev/null +++ b/BloomFramework/src/Screen.cpp @@ -0,0 +1,7 @@ +#include "Screen.h" + +void bloom::Screen::update() +{ + for (auto& sys : m_systems) + sys.second.update(m_gameInstance->timer.lap()); +} From ff979e13f9d1ad8499ea5c35321eaacc21ff02e7 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 5 Oct 2018 21:52:49 +0800 Subject: [PATCH 03/88] Add some basic functions to Screen WIP and not ready. --- BloomFramework/include/Screen.h | 25 +++++++++++++++----- BloomFramework/src/Screen.cpp | 2 +- Test Bench/GameObjectTest/RandomizerSystem.h | 2 +- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index 513beee6..a3b2cec0 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -15,16 +15,29 @@ namespace bloom { template void addGameObject(std::string tag) { static_assert (std::is_base_of::value, "Type T passed in is not a GameObject."); - auto tmp = m_gameObjects.emplace(tag, T(m_registry, m_gameInstance)); - tmp.second.init(); + auto tmp = m_gameObjects.emplace(tag, new T(m_registry, m_gameInstance)); + tmp.second->init(); } - void destroyGameObject(std::string tag); + void destroyGameObject(std::string tag) { + m_gameObjects.erase(tag); + } // System stuff template - void registerSystem() { + void registerSystem(int index) { static_assert (std::is_base_of::value, "Type T passed in is not a System."); + bool found = false; + for (auto i : m_systems) { + if (typeid(i) == typeid(T)) { // Need some kind of Type checking here. + found = true; + break; + } + } + if (!found) + m_systems.insert(m_systems.begin + index, new T(m_registry)); + else + std::clog << "This system is already registered." << std::endl; } template void unregisterSystem() { @@ -32,8 +45,8 @@ namespace bloom { } private: - std::map m_systems; // We use map here because we want to iterate in order of insertion. - std::unordered_map m_gameObjects; + std::vector> m_systems; + std::unordered_map> m_gameObjects; entt::DefaultRegistry m_registry; Game *& m_gameInstance; }; diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index 41719f31..24768bfb 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -3,5 +3,5 @@ void bloom::Screen::update() { for (auto& sys : m_systems) - sys.second.update(m_gameInstance->timer.lap()); + sys->update(m_gameInstance->timer.lap()); } diff --git a/Test Bench/GameObjectTest/RandomizerSystem.h b/Test Bench/GameObjectTest/RandomizerSystem.h index 348eca04..9a5520f8 100644 --- a/Test Bench/GameObjectTest/RandomizerSystem.h +++ b/Test Bench/GameObjectTest/RandomizerSystem.h @@ -4,7 +4,7 @@ #include "NoRandomComponent.h" using namespace bloom; -class RandomPositionSystem : bloom::System { +class RandomPositionSystem : public bloom::System { public: using bloom::System::DefaultSystem; public: From d051a2e1a61f2d31c7f4a3ff18031651ae9da311 Mon Sep 17 00:00:00 2001 From: xapdkop Date: Fri, 5 Oct 2018 18:17:16 +0300 Subject: [PATCH 04/88] add real type compare --- BloomFramework/include/Screen.h | 34 +++++++++++++++++++++++---------- Test Bench/main.cpp | 6 ++++++ 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index a3b2cec0..b1362281 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -5,10 +5,13 @@ #include "GameObject.h" #include #include +#include +#include + namespace bloom { class BLOOMFRAMEWORK_API Screen { public: - Screen(Game& gameInstance); + Screen(Game *& gameInstance) : m_gameInstance(gameInstance) {} void update(); //Game Object stuff @@ -27,15 +30,21 @@ namespace bloom { template void registerSystem(int index) { static_assert (std::is_base_of::value, "Type T passed in is not a System."); - bool found = false; - for (auto i : m_systems) { - if (typeid(i) == typeid(T)) { // Need some kind of Type checking here. - found = true; - break; - } + //bool found = false; + //for (auto i : m_systems) { + // if (type_info(i) == type_info(T)) { // Need some kind of Type checking here. + // found = true; + // break; + // } + //} + if (std::find_if(m_systems.begin(), m_systems.end(), + [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }) == m_systems.end()) + { + + m_systems.insert(m_systems.begin() + index, std::unique_ptr{new T(m_registry)}); } - if (!found) - m_systems.insert(m_systems.begin + index, new T(m_registry)); + //if (!found) + // m_systems.insert(m_systems.begin + index, new T(m_registry)); else std::clog << "This system is already registered." << std::endl; } @@ -45,7 +54,12 @@ namespace bloom { } private: - std::vector> m_systems; + template struct Box : public std::unique_ptr { + using std::unique_ptr::unique_ptr; + operator T &() const { return **this; } + }; + + std::vector> m_systems; std::unordered_map> m_gameObjects; entt::DefaultRegistry m_registry; Game *& m_gameInstance; diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index a8fda5cd..3bbb4fec 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -1,6 +1,7 @@ #include "Framework.h" #include +#include "Screen.h" #include "GameObjectTest/TestGameObject.h" #include "GameObjectTest/RandomizerSystem.h" @@ -30,6 +31,11 @@ int main() { catch (Exception & e) { std::cerr << e.what() << std::endl; } + + Screen temp = Screen(game); + temp.registerSystem(0); + temp.registerSystem(1); + temp.registerSystem(2); srand(static_cast(time(0))); SDL_Color randColor = { static_cast(rand() % 255), static_cast(rand() % 255), static_cast(rand() % 255), static_cast(rand() % 255) }; From b3ea51f3e219a7b8b0f43aefad8244de709e8fbc Mon Sep 17 00:00:00 2001 From: xapdkop Date: Fri, 5 Oct 2018 18:39:09 +0300 Subject: [PATCH 05/88] add automatic numbering for `Screen` `System`s --- BloomFramework/include/Screen.h | 17 ++++++++++------- Test Bench/main.cpp | 9 +++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index b1362281..bac5bc61 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -28,7 +28,7 @@ namespace bloom { // System stuff template - void registerSystem(int index) { + size_t registerSystem() { static_assert (std::is_base_of::value, "Type T passed in is not a System."); //bool found = false; //for (auto i : m_systems) { @@ -37,16 +37,19 @@ namespace bloom { // break; // } //} - if (std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }) == m_systems.end()) + if (auto v = std::find_if(m_systems.begin(), m_systems.end(), + [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v == m_systems.end()) { - m_systems.insert(m_systems.begin() + index, std::unique_ptr{new T(m_registry)}); + m_systems.emplace_back(std::unique_ptr{new T(m_registry)}); + return (m_systems.size() - 1); } //if (!found) // m_systems.insert(m_systems.begin + index, new T(m_registry)); - else + else { std::clog << "This system is already registered." << std::endl; + return (v - m_systems.begin()); + } } template void unregisterSystem() { @@ -54,12 +57,12 @@ namespace bloom { } private: - template struct Box : public std::unique_ptr { + template struct Container : public std::unique_ptr { using std::unique_ptr::unique_ptr; operator T &() const { return **this; } }; - std::vector> m_systems; + std::vector> m_systems; std::unordered_map> m_gameObjects; entt::DefaultRegistry m_registry; Game *& m_gameInstance; diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index 3bbb4fec..405cfd97 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -32,10 +32,11 @@ int main() { std::cerr << e.what() << std::endl; } - Screen temp = Screen(game); - temp.registerSystem(0); - temp.registerSystem(1); - temp.registerSystem(2); + Screen screenTest = Screen(game); + std::vector testVector4Screen; + testVector4Screen.push_back(screenTest.registerSystem()); + testVector4Screen.push_back(screenTest.registerSystem()); + testVector4Screen.push_back(screenTest.registerSystem()); srand(static_cast(time(0))); SDL_Color randColor = { static_cast(rand() % 255), static_cast(rand() % 255), static_cast(rand() % 255), static_cast(rand() % 255) }; From 9626849f6d0e1f5fe67f9334928d4cb87d3c5dc9 Mon Sep 17 00:00:00 2001 From: xapdkop Date: Fri, 5 Oct 2018 19:09:03 +0300 Subject: [PATCH 06/88] [Simplify] use SysPtr instead of Container --- BloomFramework/include/Screen.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index bac5bc61..ae951d9c 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -57,12 +57,13 @@ namespace bloom { } private: - template struct Container : public std::unique_ptr { - using std::unique_ptr::unique_ptr; - operator T &() const { return **this; } - }; + //template struct Container : public std::unique_ptr { + // using std::unique_ptr::unique_ptr; + // operator T &() const { return **this; } + //}; + template using SysPtr = std::unique_ptr; - std::vector> m_systems; + std::vector> m_systems; std::unordered_map> m_gameObjects; entt::DefaultRegistry m_registry; Game *& m_gameInstance; From bd92973515c3e17bca24c0b99b617c59f4ff5c69 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 13:49:53 +0800 Subject: [PATCH 07/88] Fix potential runtime exception when entity is destroyed more than once --- BloomFramework/src/GameObject.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BloomFramework/src/GameObject.cpp b/BloomFramework/src/GameObject.cpp index c4837b6f..de1e96fa 100644 --- a/BloomFramework/src/GameObject.cpp +++ b/BloomFramework/src/GameObject.cpp @@ -7,7 +7,8 @@ namespace bloom { } GameObject::~GameObject() { - m_registry.destroy(m_entity); + if(m_registry.valid(m_entity)) + m_registry.destroy(m_entity); } uint32_t GameObject::getEntityID() { From 07ef321b5b8d5b9bcb90eac24a6bc1702a8bb119 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 14:28:55 +0800 Subject: [PATCH 08/88] Add Screen Testing to TestBench --- BloomFramework/include/Screen.h | 42 +++++++++++++++++---------- BloomFramework/src/Screen.cpp | 12 ++++++-- Test Bench/Test Bench.vcxproj | 1 + Test Bench/Test Bench.vcxproj.filters | 3 ++ Test Bench/TestScreen.h | 16 ++++++++++ Test Bench/main.cpp | 28 +++++++++--------- 6 files changed, 70 insertions(+), 32 deletions(-) create mode 100644 Test Bench/TestScreen.h diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index ae951d9c..2de1cdcb 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -9,17 +9,28 @@ #include namespace bloom { + /* This class serves as a container for GameObjects and Systems meant for a particular purpose. + * + * Add the GameObjects and Systems required in the init() function. + * + */ class BLOOMFRAMEWORK_API Screen { public: - Screen(Game *& gameInstance) : m_gameInstance(gameInstance) {} + Screen(Game *& gameInstance); + //~Screen(); + virtual void init() = 0; void update(); //Game Object stuff - template - void addGameObject(std::string tag) { + template + void addGameObject(std::string tag, TArgs&&... initArgs) { static_assert (std::is_base_of::value, "Type T passed in is not a GameObject."); - auto tmp = m_gameObjects.emplace(tag, new T(m_registry, m_gameInstance)); - tmp.second->init(); + m_gameObjects.emplace(tag, new T(m_registry, m_gameInstance)); + + auto & tmp = m_gameObjects[tag]; + T* derived = dynamic_cast(tmp.get()); + if (derived != nullptr) + derived->init(std::forward(initArgs)...); } void destroyGameObject(std::string tag) { @@ -30,13 +41,6 @@ namespace bloom { template size_t registerSystem() { static_assert (std::is_base_of::value, "Type T passed in is not a System."); - //bool found = false; - //for (auto i : m_systems) { - // if (type_info(i) == type_info(T)) { // Need some kind of Type checking here. - // found = true; - // break; - // } - //} if (auto v = std::find_if(m_systems.begin(), m_systems.end(), [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v == m_systems.end()) { @@ -44,8 +48,6 @@ namespace bloom { m_systems.emplace_back(std::unique_ptr{new T(m_registry)}); return (m_systems.size() - 1); } - //if (!found) - // m_systems.insert(m_systems.begin + index, new T(m_registry)); else { std::clog << "This system is already registered." << std::endl; return (v - m_systems.begin()); @@ -54,14 +56,22 @@ namespace bloom { template void unregisterSystem() { static_assert (std::is_base_of::value, "Type T passed in is not a System."); + if (auto v = std::find_if(m_systems.begin(), m_systems.end(), + [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v != m_systems.end()) + { + m_systems.erase(v); + } + else { + std::clog << "Can't unregister system that isn't registered." << std::endl; + } } - private: + protected: //template struct Container : public std::unique_ptr { // using std::unique_ptr::unique_ptr; // operator T &() const { return **this; } //}; - template using SysPtr = std::unique_ptr; + template using SysPtr = std::unique_ptr; std::vector> m_systems; std::unordered_map> m_gameObjects; diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index 24768bfb..a6bbbd5e 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -1,7 +1,15 @@ #include "Screen.h" -void bloom::Screen::update() -{ +bloom::Screen::Screen(Game *& gameInstance) : m_gameInstance(gameInstance) { +} + +//bloom::Screen::~Screen() +//{ +// for (auto& gameObj : m_gameObjects) +// gameObj.second->~GameObject(); +//} + +void bloom::Screen::update(){ for (auto& sys : m_systems) sys->update(m_gameInstance->timer.lap()); } diff --git a/Test Bench/Test Bench.vcxproj b/Test Bench/Test Bench.vcxproj index 52913de9..11d18d93 100644 --- a/Test Bench/Test Bench.vcxproj +++ b/Test Bench/Test Bench.vcxproj @@ -165,6 +165,7 @@ + diff --git a/Test Bench/Test Bench.vcxproj.filters b/Test Bench/Test Bench.vcxproj.filters index 6cfce093..0beeb13d 100644 --- a/Test Bench/Test Bench.vcxproj.filters +++ b/Test Bench/Test Bench.vcxproj.filters @@ -40,5 +40,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/Test Bench/TestScreen.h b/Test Bench/TestScreen.h new file mode 100644 index 00000000..3525133a --- /dev/null +++ b/Test Bench/TestScreen.h @@ -0,0 +1,16 @@ +#pragma once +#include "Screen.h" +#include "GameObjectTest/TestGameObject.h" +class TestScreen : public bloom::Screen { +public: + using bloom::Screen::Screen; + + void Screen::init() { + addGameObject("testSprite", SDL_Rect{ 0,0,128,128 }, "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); + addGameObject("testSprite2", SDL_Rect{ 128,0,128,128 }, "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 }); + addGameObject("testGO", SDL_Rect{ 50,50,256,256 }, "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 }); + + registerSystem(); + registerSystem(); + } +}; \ No newline at end of file diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index 405cfd97..480764f0 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -4,6 +4,7 @@ #include "Screen.h" #include "GameObjectTest/TestGameObject.h" #include "GameObjectTest/RandomizerSystem.h" +#include "TestScreen.h" using namespace bloom; @@ -31,12 +32,11 @@ int main() { catch (Exception & e) { std::cerr << e.what() << std::endl; } + game->textures.load("Assets/OverworldTestSpritesheet.png", SDL_Color{ 64, 176, 104, 113 }); + game->textures.load("Assets/TestChar.png", SDL_Color{ 144,168,0,0 }); + TestScreen screenTest = TestScreen(game); + screenTest.init(); - Screen screenTest = Screen(game); - std::vector testVector4Screen; - testVector4Screen.push_back(screenTest.registerSystem()); - testVector4Screen.push_back(screenTest.registerSystem()); - testVector4Screen.push_back(screenTest.registerSystem()); srand(static_cast(time(0))); SDL_Color randColor = { static_cast(rand() % 255), static_cast(rand() % 255), static_cast(rand() % 255), static_cast(rand() % 255) }; @@ -45,10 +45,9 @@ int main() { game->render(); // Test Game Object - entt::DefaultRegistry testRegistry; + /*entt::DefaultRegistry testRegistry; bloom::RenderSystem renderSysTest(testRegistry); - game->textures.load("Assets/OverworldTestSpritesheet.png", SDL_Color{ 64, 176, 104, 113 }); - game->textures.load("Assets/TestChar.png", SDL_Color{ 144,168,0,0 }); + TestChar testSprite = TestChar(testRegistry, game); testSprite.init(SDL_Rect{ 0,0,128,128 }, "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); renderSysTest.update(); @@ -64,23 +63,24 @@ int main() { testGO.disableRandomPos(); renderSysTest.update(); game->render(); - game->delay(500); + game->delay(500);*/ // Randomizes position of entities(excluding those with `NoRandomPos` Component. - RandomPositionSystem randomizer(testRegistry); + //RandomPositionSystem randomizer(testRegistry); int testX = 0, testY = 0; while (game->isRunning()) { // If manual control of entities is required, this is the method to do so. - auto & testGOpos = testRegistry.get(testGO.getEntityID()); + /*auto & testGOpos = testRegistry.get(testGO.getEntityID()); testGOpos.x = testX++; - testGOpos.y = testY++; + testGOpos.y = testY++;*/ // Demo ends here. framestart = SDL_GetTicks(); game->handleEvents(); game->clear(); - randomizer.update(); - renderSysTest.update(); // Test again. + screenTest.update(); + //randomizer.update(); + //renderSysTest.update(); // Test again. game->render(); game->update(); int frametime = SDL_GetTicks() - framestart; From 8cff58f49b7d9fc0adbce0441bc8dcae8b048b31 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 14:30:29 +0800 Subject: [PATCH 09/88] Made Screen protected variables private --- BloomFramework/include/Screen.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index 2de1cdcb..a6100fbe 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -66,7 +66,7 @@ namespace bloom { } } - protected: + private: //template struct Container : public std::unique_ptr { // using std::unique_ptr::unique_ptr; // operator T &() const { return **this; } From 3d8828e4f92308ed82cd8a0b4840f6e108a2bc68 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 15:27:29 +0800 Subject: [PATCH 10/88] Re-add dtor and improve `update()` function --- BloomFramework/include/Screen.h | 2 +- BloomFramework/src/Screen.cpp | 13 +++++++------ Test Bench/GameObjectTest/RandomizerSystem.h | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index a6100fbe..eece4942 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -17,7 +17,7 @@ namespace bloom { class BLOOMFRAMEWORK_API Screen { public: Screen(Game *& gameInstance); - //~Screen(); + ~Screen(); virtual void init() = 0; void update(); diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index a6bbbd5e..c7588fe1 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -3,13 +3,14 @@ bloom::Screen::Screen(Game *& gameInstance) : m_gameInstance(gameInstance) { } -//bloom::Screen::~Screen() -//{ -// for (auto& gameObj : m_gameObjects) -// gameObj.second->~GameObject(); -//} +bloom::Screen::~Screen() +{ + for (auto& gameObj : m_gameObjects) + gameObj.second->~GameObject(); +} void bloom::Screen::update(){ + double dt = m_gameInstance->timer.lap(); for (auto& sys : m_systems) - sys->update(m_gameInstance->timer.lap()); + sys->update(dt); } diff --git a/Test Bench/GameObjectTest/RandomizerSystem.h b/Test Bench/GameObjectTest/RandomizerSystem.h index 9a5520f8..6d841cff 100644 --- a/Test Bench/GameObjectTest/RandomizerSystem.h +++ b/Test Bench/GameObjectTest/RandomizerSystem.h @@ -8,7 +8,7 @@ class RandomPositionSystem : public bloom::System { public: using bloom::System::DefaultSystem; public: - void update(std::optional dt = std::nullopt) + void update(std::optional dt = std::nullopt) override { m_registry.view().each( [this](auto entity, Position & pos) { From b103f70dec31c38ca999068722ae9a0248a68ad0 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 16:38:52 +0800 Subject: [PATCH 11/88] Use forward declaration instead of includes in some files This prevents circular dependency when including them in Game.h --- BloomFramework/include/GameObject.h | 2 +- BloomFramework/include/Screen.h | 7 ++++--- BloomFramework/src/Screen.cpp | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/BloomFramework/include/GameObject.h b/BloomFramework/include/GameObject.h index b59c0a2a..1d0cc947 100644 --- a/BloomFramework/include/GameObject.h +++ b/BloomFramework/include/GameObject.h @@ -2,9 +2,9 @@ #include "stdIncludes.h" #include "Components/Components.h" -#include "Game.h" namespace bloom { + class Game; /* * This class is used to make a sort of prefab object. * diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index eece4942..b4376e7f 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -1,14 +1,13 @@ #pragma once #include "stdIncludes.h" -#include "Game.h" #include "Systems/Systems.h" #include "GameObject.h" #include -#include #include #include - namespace bloom { + + class Game; /* This class serves as a container for GameObjects and Systems meant for a particular purpose. * * Add the GameObjects and Systems required in the init() function. @@ -78,4 +77,6 @@ namespace bloom { entt::DefaultRegistry m_registry; Game *& m_gameInstance; }; + + using ScrPtr = std::shared_ptr; } \ No newline at end of file diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index c7588fe1..18a04c83 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -1,5 +1,5 @@ #include "Screen.h" - +#include "Game.h" bloom::Screen::Screen(Game *& gameInstance) : m_gameInstance(gameInstance) { } @@ -13,4 +13,5 @@ void bloom::Screen::update(){ double dt = m_gameInstance->timer.lap(); for (auto& sys : m_systems) sys->update(dt); + std::cout << "Delta Time: " << dt << "ms" << std::endl; } From b9ffe87d95f63161f598daad8dcd7aa7b1bf011f Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 16:39:19 +0800 Subject: [PATCH 12/88] Remove comments --- Test Bench/main.cpp | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index 480764f0..30eb67b9 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -43,44 +43,12 @@ int main() { game->setColor(randColor); game->clear(); game->render(); - - // Test Game Object - /*entt::DefaultRegistry testRegistry; - bloom::RenderSystem renderSysTest(testRegistry); - - TestChar testSprite = TestChar(testRegistry, game); - testSprite.init(SDL_Rect{ 0,0,128,128 }, "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); - renderSysTest.update(); - game->render(); - game->delay(500); - TestChar testSprite2 = TestChar(testRegistry, game); - testSprite2.init(SDL_Rect{ 128,0,128,128 }, "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 }); - renderSysTest.update(); - game->render(); - game->delay(500); - TestChar testGO = TestChar(testRegistry, game); - testGO.init(SDL_Rect{ 50,50,256,256 }, "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 }); - testGO.disableRandomPos(); - renderSysTest.update(); - game->render(); - game->delay(500);*/ - - // Randomizes position of entities(excluding those with `NoRandomPos` Component. - //RandomPositionSystem randomizer(testRegistry); - int testX = 0, testY = 0; while (game->isRunning()) { - // If manual control of entities is required, this is the method to do so. - /*auto & testGOpos = testRegistry.get(testGO.getEntityID()); - testGOpos.x = testX++; - testGOpos.y = testY++;*/ - // Demo ends here. framestart = SDL_GetTicks(); game->handleEvents(); game->clear(); screenTest.update(); - //randomizer.update(); - //renderSysTest.update(); // Test again. game->render(); game->update(); int frametime = SDL_GetTicks() - framestart; From 2e4bdca0de08e0865a7c4e49a4e1d14a29895333 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 16:39:59 +0800 Subject: [PATCH 13/88] Add functions in Game.h to make use of Screens --- BloomFramework/include/Game.h | 26 ++++++++++++++++++++++++++ BloomFramework/src/Game.cpp | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index 190a4719..6cca7e9d 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -4,6 +4,8 @@ #include "stdIncludes.h" #include "TextureStore.h" #include "Timer.h" +#include "Screen.h" +#include "Exception.h" namespace bloom { class BLOOMFRAMEWORK_API Game { @@ -40,6 +42,28 @@ namespace bloom { TextureStore textures = TextureStore(m_renderer); Timer timer; + template + void registerScreen(const std::string & tag) { + static_assert (std::is_base_of::value, "Type T passed in is not a Screen"); + if (m_screens.find(tag) != m_screens.end()) { + m_screens.emplace(tag, std::unique_ptr); + } + else { + throw Exception("Screen with tag " + tag + " has been registered already"); + } + } + + void unregisterScreen(const std::string & tag) { + m_screens.erase(tag); + } + void setActiveScreen(const std::string & tag) { + auto tmp = m_screens.find(tag); + if (tmp != m_screens.end()) + m_activeScreen = tmp->second; + else + throw Exception("Can't set Screen with tag " + tag + " as active screen. It is not registered."); + } + protected: SDL_Renderer * m_renderer = nullptr; SDL_Window * m_window = nullptr; @@ -48,5 +72,7 @@ namespace bloom { SDL_Color m_color; SDL_Event m_event; bool m_isRunning; + std::unordered_map m_screens; + ScrPtr m_activeScreen; }; } \ No newline at end of file diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index 7a5030d9..839a6a2f 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -115,7 +115,8 @@ namespace bloom { } void Game::update() { - std::clog << "Delta time: " << timer.lap() << std::endl; + if(m_activeScreen != nullptr) + m_activeScreen->update(); } void Game::clear() { From e2fa4f7c137bdad07482d151c1dddc280115f080 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 17:23:26 +0800 Subject: [PATCH 14/88] Use the new functionality in TestBench --- BloomFramework/include/Game.h | 9 +++++---- BloomFramework/include/Screen.h | 4 ++-- BloomFramework/src/Screen.cpp | 2 +- Test Bench/main.cpp | 7 +++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index 6cca7e9d..7cc716a6 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -45,16 +45,17 @@ namespace bloom { template void registerScreen(const std::string & tag) { static_assert (std::is_base_of::value, "Type T passed in is not a Screen"); - if (m_screens.find(tag) != m_screens.end()) { - m_screens.emplace(tag, std::unique_ptr); + if (m_screens.find(tag) == m_screens.end()) { + m_screens.emplace(tag, std::shared_ptr(new T(this))); + m_screens[tag]->init(); } else { - throw Exception("Screen with tag " + tag + " has been registered already"); + //throw Exception("Screen with tag " + tag + " has been registered already"); } } void unregisterScreen(const std::string & tag) { - m_screens.erase(tag); + m_screens.erase(tag); } void setActiveScreen(const std::string & tag) { auto tmp = m_screens.find(tag); diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index b4376e7f..7993fade 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -15,7 +15,7 @@ namespace bloom { */ class BLOOMFRAMEWORK_API Screen { public: - Screen(Game *& gameInstance); + Screen(Game * gameInstance); ~Screen(); virtual void init() = 0; void update(); @@ -75,7 +75,7 @@ namespace bloom { std::vector> m_systems; std::unordered_map> m_gameObjects; entt::DefaultRegistry m_registry; - Game *& m_gameInstance; + Game * m_gameInstance; }; using ScrPtr = std::shared_ptr; diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index 18a04c83..a6cc6223 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -1,6 +1,6 @@ #include "Screen.h" #include "Game.h" -bloom::Screen::Screen(Game *& gameInstance) : m_gameInstance(gameInstance) { +bloom::Screen::Screen(Game * gameInstance) : m_gameInstance(gameInstance) { } bloom::Screen::~Screen() diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index 30eb67b9..41f52846 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -34,8 +34,8 @@ int main() { } game->textures.load("Assets/OverworldTestSpritesheet.png", SDL_Color{ 64, 176, 104, 113 }); game->textures.load("Assets/TestChar.png", SDL_Color{ 144,168,0,0 }); - TestScreen screenTest = TestScreen(game); - screenTest.init(); + game->registerScreen("Test"); + game->setActiveScreen("Test"); srand(static_cast(time(0))); SDL_Color randColor = { static_cast(rand() % 255), static_cast(rand() % 255), @@ -48,9 +48,8 @@ int main() { framestart = SDL_GetTicks(); game->handleEvents(); game->clear(); - screenTest.update(); - game->render(); game->update(); + game->render(); int frametime = SDL_GetTicks() - framestart; if (framedelay > frametime) From 45ffcd4ead07e9a65dd1fac0ff1f2a710c96a3a6 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 20:11:53 +0800 Subject: [PATCH 15/88] Make code consistent with the rest of the project --- BloomFramework/include/Game.h | 25 +++++++++++-------------- BloomFramework/include/Screen.h | 8 +------- BloomFramework/src/Game.cpp | 10 ++++++++++ BloomFramework/src/Screen.cpp | 30 +++++++++++++++++------------- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index 7cc716a6..a3f9d541 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -39,9 +39,7 @@ namespace bloom { int getScreenHeight(); SDL_Event getEvent(); - TextureStore textures = TextureStore(m_renderer); - Timer timer; - + // Screen stuff template void registerScreen(const std::string & tag) { static_assert (std::is_base_of::value, "Type T passed in is not a Screen"); @@ -50,20 +48,19 @@ namespace bloom { m_screens[tag]->init(); } else { - //throw Exception("Screen with tag " + tag + " has been registered already"); + std::clog << "Tag has already been registered, overwriting..." << std::endl; + m_screens.erase(tag); + m_screens.emplace(tag, std::shared_ptr(new T(this))); + m_screens[tag]->init(); + } } - void unregisterScreen(const std::string & tag) { - m_screens.erase(tag); - } - void setActiveScreen(const std::string & tag) { - auto tmp = m_screens.find(tag); - if (tmp != m_screens.end()) - m_activeScreen = tmp->second; - else - throw Exception("Can't set Screen with tag " + tag + " as active screen. It is not registered."); - } + void unregisterScreen(const std::string & tag); + void setActiveScreen(const std::string & tag); + + TextureStore textures = TextureStore(m_renderer); + Timer timer; protected: SDL_Renderer * m_renderer = nullptr; diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index 7993fade..d50c2001 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -32,9 +32,7 @@ namespace bloom { derived->init(std::forward(initArgs)...); } - void destroyGameObject(std::string tag) { - m_gameObjects.erase(tag); - } + void destroyGameObject(std::string tag); // System stuff template @@ -66,10 +64,6 @@ namespace bloom { } private: - //template struct Container : public std::unique_ptr { - // using std::unique_ptr::unique_ptr; - // operator T &() const { return **this; } - //}; template using SysPtr = std::unique_ptr; std::vector> m_systems; diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index 839a6a2f..265ce31d 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -172,4 +172,14 @@ namespace bloom { SDL_Event Game::getEvent() { return m_event; } + void Game::unregisterScreen(const std::string & tag) { + m_screens.erase(tag); + } + void Game::setActiveScreen(const std::string & tag) { + auto tmp = m_screens.find(tag); + if (tmp != m_screens.end()) + m_activeScreen = tmp->second; + else + throw Exception("Can't set Screen with tag " + tag + " as active screen. It is not registered."); + } } \ No newline at end of file diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index a6cc6223..0b674b2c 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -1,17 +1,21 @@ #include "Screen.h" #include "Game.h" -bloom::Screen::Screen(Game * gameInstance) : m_gameInstance(gameInstance) { -} -bloom::Screen::~Screen() -{ - for (auto& gameObj : m_gameObjects) - gameObj.second->~GameObject(); -} +namespace bloom { + Screen::Screen(Game * gameInstance) : m_gameInstance(gameInstance) {} -void bloom::Screen::update(){ - double dt = m_gameInstance->timer.lap(); - for (auto& sys : m_systems) - sys->update(dt); - std::cout << "Delta Time: " << dt << "ms" << std::endl; -} + Screen::~Screen() { + for (auto& gameObj : m_gameObjects) + gameObj.second->~GameObject(); + } + + void Screen::update() { + double dt = m_gameInstance->timer.lap(); + for (auto& sys : m_systems) + sys->update(dt); + std::cout << "Delta Time: " << dt << "ms" << std::endl; + } + void Screen::destroyGameObject(std::string tag) { + m_gameObjects.erase(tag); + } +} \ No newline at end of file From cd8aa479ac03ac288551cfc42675a01a6f3d819f Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 20:19:47 +0800 Subject: [PATCH 16/88] Make `DefaultSystem::update()` a pure virtual function --- BloomFramework/include/Systems/DefaultSystem.h | 2 +- BloomFramework/include/Systems/RenderSystem.h | 2 +- Test Bench/GameObjectTest/RandomizerSystem.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BloomFramework/include/Systems/DefaultSystem.h b/BloomFramework/include/Systems/DefaultSystem.h index 2828bb6a..33dbc752 100644 --- a/BloomFramework/include/Systems/DefaultSystem.h +++ b/BloomFramework/include/Systems/DefaultSystem.h @@ -7,7 +7,7 @@ namespace bloom { class DefaultSystem { public: DefaultSystem(entt::DefaultRegistry & registry) : m_registry(registry) {}; - virtual void update(std::optional deltaTime = std::nullopt) {}; + virtual void update(std::optional deltaTime = std::nullopt) = 0; protected: entt::DefaultRegistry & m_registry; diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index b186b4e4..03d5ad04 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -8,7 +8,7 @@ namespace bloom { class RenderSystem : public System { using System::DefaultSystem; public: - void update(std::optional deltaTime = std::nullopt) + void System::update(std::optional deltaTime) { m_registry.view().each( [](auto entity, Position & pos, Size& size, Sprite & spr) { diff --git a/Test Bench/GameObjectTest/RandomizerSystem.h b/Test Bench/GameObjectTest/RandomizerSystem.h index 6d841cff..197a9881 100644 --- a/Test Bench/GameObjectTest/RandomizerSystem.h +++ b/Test Bench/GameObjectTest/RandomizerSystem.h @@ -8,7 +8,7 @@ class RandomPositionSystem : public bloom::System { public: using bloom::System::DefaultSystem; public: - void update(std::optional dt = std::nullopt) override + void System::update(std::optional dt) { m_registry.view().each( [this](auto entity, Position & pos) { From f042b3c354150dbef2623f1e5fe592a5c6e3d24a Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 6 Oct 2018 20:30:41 +0800 Subject: [PATCH 17/88] Make all build configs not generate xmldocs --- BloomFramework/BloomFramework.vcxproj | 2 +- Test Bench/Test Bench.vcxproj | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index 6681fb74..7f3744a9 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -94,7 +94,7 @@ true true BLOOMFRAMEWORK_EXPORT;%(PreprocessorDefinitions) - true + false include/;../entt/src/ /Zc:__cplusplus /std:c++latest %(AdditionalOptions) diff --git a/Test Bench/Test Bench.vcxproj b/Test Bench/Test Bench.vcxproj index 11d18d93..e12b27b3 100644 --- a/Test Bench/Test Bench.vcxproj +++ b/Test Bench/Test Bench.vcxproj @@ -102,7 +102,7 @@ true true ..\BloomFramework\include\;..\entt\src\;%(AdditionalIncludeDirectories) - true + false /Zc:__cplusplus /std:c++latest %(AdditionalOptions) @@ -118,7 +118,7 @@ true true ..\BloomFramework\include\;..\entt\src\;%(AdditionalIncludeDirectories) - true + false /Zc:__cplusplus /std:c++latest %(AdditionalOptions) @@ -135,7 +135,7 @@ true true ..\BloomFramework\include\;..\entt\src\;%(AdditionalIncludeDirectories) - true + false /Zc:__cplusplus /std:c++latest %(AdditionalOptions) @@ -157,7 +157,7 @@ - true + false Image From 9950953979e20678221d7fab5165b50d5f1be5a1 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 12 Oct 2018 22:46:41 +0800 Subject: [PATCH 18/88] Add SDL_RENDERER_TARGETTEXTURE to default renderer flags --- BloomFramework/include/Game.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index a3f9d541..5d309b69 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -12,7 +12,7 @@ namespace bloom { friend TextureStore::TextureStore(Game & object); public: - Game(int width, int height, int windowFlags = NULL, int rendererFlags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + Game(int width, int height, int windowFlags = NULL, int rendererFlags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE); Game(std::nothrow_t, int width, int height, int windowFlags = NULL, int rendererFlags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); ~Game(); From adad9ba2b10e596b50ebbc046cbdd9483932a4d4 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 12 Oct 2018 22:48:06 +0800 Subject: [PATCH 19/88] [EXPERIMENTAL] Let `Screens` render to texture and let `Game` render it. --- BloomFramework/include/Game.h | 2 ++ BloomFramework/include/Screen.h | 5 ++++- BloomFramework/src/Game.cpp | 5 +++++ BloomFramework/src/Screen.cpp | 21 ++++++++++++++++++++- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index 5d309b69..17c7f388 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -39,6 +39,8 @@ namespace bloom { int getScreenHeight(); SDL_Event getEvent(); + SDL_Renderer * getRenderer(); + // Screen stuff template void registerScreen(const std::string & tag) { diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index d50c2001..e9e087a6 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -63,13 +63,16 @@ namespace bloom { } } + SDL_Texture *& getScreenTexture(); + private: template using SysPtr = std::unique_ptr; - + void m_createTexture(); std::vector> m_systems; std::unordered_map> m_gameObjects; entt::DefaultRegistry m_registry; Game * m_gameInstance; + SDL_Texture * m_screenTexture; }; using ScrPtr = std::shared_ptr; diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index 265ce31d..df840e58 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -128,6 +128,8 @@ namespace bloom { } void Game::render() { + SDL_SetRenderTarget(m_renderer, NULL); + SDL_RenderCopyEx(m_renderer, m_activeScreen->getScreenTexture(),NULL,NULL, NULL,NULL, SDL_FLIP_NONE); SDL_RenderPresent(m_renderer); } @@ -172,6 +174,9 @@ namespace bloom { SDL_Event Game::getEvent() { return m_event; } + SDL_Renderer * Game::getRenderer(){ + return m_renderer; + } void Game::unregisterScreen(const std::string & tag) { m_screens.erase(tag); } diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index 0b674b2c..7b8f841d 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -2,7 +2,9 @@ #include "Game.h" namespace bloom { - Screen::Screen(Game * gameInstance) : m_gameInstance(gameInstance) {} + Screen::Screen(Game * gameInstance) : m_gameInstance(gameInstance) { + m_createTexture(); + } Screen::~Screen() { for (auto& gameObj : m_gameObjects) @@ -10,6 +12,8 @@ namespace bloom { } void Screen::update() { + m_createTexture(); + SDL_SetRenderTarget(m_gameInstance->getRenderer(), m_screenTexture); double dt = m_gameInstance->timer.lap(); for (auto& sys : m_systems) sys->update(dt); @@ -18,4 +22,19 @@ namespace bloom { void Screen::destroyGameObject(std::string tag) { m_gameObjects.erase(tag); } + SDL_Texture *& Screen::getScreenTexture() + { + return m_screenTexture; + } + void Screen::m_createTexture() + { + if (!m_screenTexture) + SDL_DestroyTexture(m_screenTexture); + + m_screenTexture = SDL_CreateTexture(m_gameInstance->getRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, + m_gameInstance->getScreenWidth(), + m_gameInstance->getScreenHeight()); + + SDL_SetTextureBlendMode(m_screenTexture, SDL_BLENDMODE_BLEND); + } } \ No newline at end of file From 7af06eabfe8a5e71249dc9ffd7d3a6ed11f33eff Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 12 Oct 2018 22:49:11 +0800 Subject: [PATCH 20/88] The unsafe `Game` ctor should also have the TARGETTEXTURE flag --- BloomFramework/include/Game.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index 17c7f388..feed1628 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -13,7 +13,7 @@ namespace bloom { public: Game(int width, int height, int windowFlags = NULL, int rendererFlags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE); - Game(std::nothrow_t, int width, int height, int windowFlags = NULL, int rendererFlags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + Game(std::nothrow_t, int width, int height, int windowFlags = NULL, int rendererFlags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE); ~Game(); static void initialize(Uint32 initFlags = SDL_INIT_EVERYTHING, From 4ada58381621fa2b699d6af1b682b9b49805a6ef Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 12 Oct 2018 23:22:25 +0800 Subject: [PATCH 21/88] Use SDL_RenderClear to clear Screen texture instead of recreating it This prevents the program from continuously allocating memory, resulting in increased memory usage as time passes. --- BloomFramework/include/Screen.h | 1 - BloomFramework/src/Game.cpp | 1 + BloomFramework/src/Screen.cpp | 19 ++++++------------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index e9e087a6..9aa7118e 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -67,7 +67,6 @@ namespace bloom { private: template using SysPtr = std::unique_ptr; - void m_createTexture(); std::vector> m_systems; std::unordered_map> m_gameObjects; entt::DefaultRegistry m_registry; diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index df840e58..5b769541 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -120,6 +120,7 @@ namespace bloom { } void Game::clear() { + SDL_SetRenderTarget(m_renderer, NULL); SDL_RenderClear(m_renderer); } diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index 7b8f841d..d0d1dffb 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -3,7 +3,11 @@ namespace bloom { Screen::Screen(Game * gameInstance) : m_gameInstance(gameInstance) { - m_createTexture(); + m_screenTexture = SDL_CreateTexture(m_gameInstance->getRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, + m_gameInstance->getScreenWidth(), + m_gameInstance->getScreenHeight()); + + SDL_SetTextureBlendMode(m_screenTexture, SDL_BLENDMODE_BLEND); } Screen::~Screen() { @@ -12,8 +16,8 @@ namespace bloom { } void Screen::update() { - m_createTexture(); SDL_SetRenderTarget(m_gameInstance->getRenderer(), m_screenTexture); + SDL_RenderClear(m_gameInstance->getRenderer()); double dt = m_gameInstance->timer.lap(); for (auto& sys : m_systems) sys->update(dt); @@ -26,15 +30,4 @@ namespace bloom { { return m_screenTexture; } - void Screen::m_createTexture() - { - if (!m_screenTexture) - SDL_DestroyTexture(m_screenTexture); - - m_screenTexture = SDL_CreateTexture(m_gameInstance->getRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, - m_gameInstance->getScreenWidth(), - m_gameInstance->getScreenHeight()); - - SDL_SetTextureBlendMode(m_screenTexture, SDL_BLENDMODE_BLEND); - } } \ No newline at end of file From d1667b9e573fac19515ba153c80bcd21fc4ad1d3 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 12 Oct 2018 23:23:40 +0800 Subject: [PATCH 22/88] Destroy Screen texture in dtor --- BloomFramework/src/Screen.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index d0d1dffb..b1666f17 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -13,6 +13,7 @@ namespace bloom { Screen::~Screen() { for (auto& gameObj : m_gameObjects) gameObj.second->~GameObject(); + SDL_DestroyTexture(m_screenTexture); } void Screen::update() { From 5c20f472731923ee30df2784ffa9acb23f31787a Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 13 Oct 2018 11:38:52 +0800 Subject: [PATCH 23/88] Move Screen.h template definitions to prevent implicit inline --- BloomFramework/include/Screen.h | 79 +++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index 9aa7118e..5a1b4b35 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -22,46 +22,16 @@ namespace bloom { //Game Object stuff template - void addGameObject(std::string tag, TArgs&&... initArgs) { - static_assert (std::is_base_of::value, "Type T passed in is not a GameObject."); - m_gameObjects.emplace(tag, new T(m_registry, m_gameInstance)); - - auto & tmp = m_gameObjects[tag]; - T* derived = dynamic_cast(tmp.get()); - if (derived != nullptr) - derived->init(std::forward(initArgs)...); - } + void addGameObject(std::string tag, TArgs&&... initArgs); void destroyGameObject(std::string tag); // System stuff template - size_t registerSystem() { - static_assert (std::is_base_of::value, "Type T passed in is not a System."); - if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v == m_systems.end()) - { + size_t registerSystem(); - m_systems.emplace_back(std::unique_ptr{new T(m_registry)}); - return (m_systems.size() - 1); - } - else { - std::clog << "This system is already registered." << std::endl; - return (v - m_systems.begin()); - } - } template - void unregisterSystem() { - static_assert (std::is_base_of::value, "Type T passed in is not a System."); - if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v != m_systems.end()) - { - m_systems.erase(v); - } - else { - std::clog << "Can't unregister system that isn't registered." << std::endl; - } - } + void unregisterSystem(); SDL_Texture *& getScreenTexture(); @@ -75,4 +45,47 @@ namespace bloom { }; using ScrPtr = std::shared_ptr; + + //Game Object stuff + + template + void Screen::addGameObject(std::string tag, TArgs && ...initArgs) { + static_assert (std::is_base_of::value, "Type T passed in is not a GameObject."); + m_gameObjects.emplace(tag, new T(m_registry, m_gameInstance)); + + auto & tmp = m_gameObjects[tag]; + T* derived = dynamic_cast(tmp.get()); + if (derived != nullptr) + derived->init(std::forward(initArgs)...); + } + + // System stuff + + template + size_t Screen::registerSystem() { + static_assert (std::is_base_of::value, "Type T passed in is not a System."); + if (auto v = std::find_if(m_systems.begin(), m_systems.end(), + [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v == m_systems.end()) + { + + m_systems.emplace_back(std::unique_ptr{new T(m_registry)}); + return (m_systems.size() - 1); + } + else { + std::clog << "This system is already registered." << std::endl; + return (v - m_systems.begin()); + } + } + template + void Screen::unregisterSystem() { + static_assert (std::is_base_of::value, "Type T passed in is not a System."); + if (auto v = std::find_if(m_systems.begin(), m_systems.end(), + [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v != m_systems.end()) + { + m_systems.erase(v); + } + else { + std::clog << "Can't unregister system that isn't registered." << std::endl; + } + } } \ No newline at end of file From f0b82926947847da5c8068f17db1b8fffd1fda55 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 13 Oct 2018 21:43:19 +0800 Subject: [PATCH 24/88] Use provided alias instead of just `uint32_t` in `GameObject` --- BloomFramework/include/GameObject.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BloomFramework/include/GameObject.h b/BloomFramework/include/GameObject.h index 1d0cc947..2b999e4f 100644 --- a/BloomFramework/include/GameObject.h +++ b/BloomFramework/include/GameObject.h @@ -27,6 +27,6 @@ namespace bloom { protected: entt::DefaultRegistry & m_registry; Game *& m_gameInstance; - uint32_t m_entity; + entt::DefaultRegistry::entity_type m_entity; }; } \ No newline at end of file From 78a3434be696b57ea19b39922f942ac32132cfea Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 13 Oct 2018 23:52:18 +0800 Subject: [PATCH 25/88] The components don't depend on "stdIncludes.h" --- BloomFramework/include/Components/Position.h | 2 -- BloomFramework/include/Components/Size.h | 2 -- BloomFramework/include/Components/Sprite.h | 1 - 3 files changed, 5 deletions(-) diff --git a/BloomFramework/include/Components/Position.h b/BloomFramework/include/Components/Position.h index 0f6202a1..1e2f7e81 100644 --- a/BloomFramework/include/Components/Position.h +++ b/BloomFramework/include/Components/Position.h @@ -1,7 +1,5 @@ #pragma once -#include "stdIncludes.h" - namespace bloom { struct Position { Position(int xPos = 0, int yPos = 0) : x(xPos), y(yPos) {} diff --git a/BloomFramework/include/Components/Size.h b/BloomFramework/include/Components/Size.h index 5d9c362f..e1c4ea96 100644 --- a/BloomFramework/include/Components/Size.h +++ b/BloomFramework/include/Components/Size.h @@ -1,7 +1,5 @@ #pragma once -#include "stdIncludes.h" - namespace bloom { struct Size { Size(int w = 1, int h = 1) : w(w), h(h) {} diff --git a/BloomFramework/include/Components/Sprite.h b/BloomFramework/include/Components/Sprite.h index 5faea92c..37bb908b 100644 --- a/BloomFramework/include/Components/Sprite.h +++ b/BloomFramework/include/Components/Sprite.h @@ -1,6 +1,5 @@ #pragma once -#include "stdIncludes.h" #include "TextureStore.h" #include From acafe2877206518d1b5b94385f5dfe44e25bcadd Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 13 Oct 2018 23:53:17 +0800 Subject: [PATCH 26/88] Implement ability to change render order of sprites --- BloomFramework/BloomFramework.vcxproj | 1 + BloomFramework/BloomFramework.vcxproj.filters | 3 +++ .../include/Components/Components.h | 3 ++- BloomFramework/include/Components/Priority.h | 5 ++++ BloomFramework/include/Systems/RenderSystem.h | 27 +++++++++++++++++-- Test Bench/GameObjectTest/TestGameObject.h | 6 +++-- Test Bench/TestScreen.h | 4 +-- 7 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 BloomFramework/include/Components/Priority.h diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index 7f3744a9..06ef6a93 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -157,6 +157,7 @@ + diff --git a/BloomFramework/BloomFramework.vcxproj.filters b/BloomFramework/BloomFramework.vcxproj.filters index d6ff53d2..ad3060fc 100644 --- a/BloomFramework/BloomFramework.vcxproj.filters +++ b/BloomFramework/BloomFramework.vcxproj.filters @@ -92,6 +92,9 @@ Header Files + + Header Files + diff --git a/BloomFramework/include/Components/Components.h b/BloomFramework/include/Components/Components.h index 61bebfa7..83b62ff2 100644 --- a/BloomFramework/include/Components/Components.h +++ b/BloomFramework/include/Components/Components.h @@ -2,4 +2,5 @@ #include "Position.h" #include "Size.h" -#include "Sprite.h" \ No newline at end of file +#include "Sprite.h" +#include "Priority.h" \ No newline at end of file diff --git a/BloomFramework/include/Components/Priority.h b/BloomFramework/include/Components/Priority.h new file mode 100644 index 00000000..7f92184b --- /dev/null +++ b/BloomFramework/include/Components/Priority.h @@ -0,0 +1,5 @@ +#pragma once + +namespace bloom { + using Priority = Uint32; +} \ No newline at end of file diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 03d5ad04..8b61404d 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -3,6 +3,7 @@ #include "stdIncludes.h" #include "DefaultSystem.h" #include "Components/Components.h" +#include namespace bloom { class RenderSystem : public System { @@ -10,16 +11,38 @@ namespace bloom { public: void System::update(std::optional deltaTime) { + std::vector> renderQueue{}; + m_registry.view().each( - [](auto entity, Position & pos, Size& size, Sprite & spr) { + [&](auto entity, Position & pos, Size& size, Sprite & spr) { SDL_Rect destRect{ static_cast(pos.x), static_cast(pos.y), static_cast(size.w), static_cast(size.h) }; - spr._texture->render(spr._srcRect, destRect); + + Priority tmp2; + if (m_registry.has(entity)) + tmp2 = m_registry.get(entity); + else + tmp2 = 0; + + // Place sprites into queue for sorting later. + renderQueue.emplace_back(std::make_tuple(spr,destRect,tmp2)); }); + + // Sort the sprites based on priority, higher number means rendered later. Same layer may fight + std::sort(renderQueue.begin(), renderQueue.end(), [](const auto& lhs, const auto& rhs) { + return std::get<2>(lhs) < std::get<2>(rhs); + }); + + // Render + for (auto i : renderQueue) { + auto & spr = std::get<0>(i); + auto & destRect = std::get<1>(i); + spr._texture->render(spr._srcRect, destRect); + } } }; } \ No newline at end of file diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index 8b6057c2..d8860bf7 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -7,12 +7,14 @@ class TestChar : public bloom::GameObject { public: using bloom::GameObject::GameObject; - void init(SDL_Rect pos_and_size = SDL_Rect{ 50,50, 256, 256 }, const std::string & texturePath = "Assets/TestChar.png", std::optional srcRect = std::nullopt) { + void init(SDL_Rect pos_and_size = SDL_Rect{ 50,50, 256, 256 }, const std::string & texturePath = "Assets/TestChar.png", std::optional srcRect = std::nullopt, std::optional priority = std::nullopt) { m_registry.replace(m_entity, pos_and_size.x, pos_and_size.y); m_registry.assign(m_entity, pos_and_size.w, pos_and_size.h); auto tmp = m_gameInstance->textures.load(texturePath); - m_registry.assign(m_entity, tmp, srcRect); + + if (priority != std::nullopt) + m_registry.assign(m_entity, priority.value()); } void disableRandomPos() { m_registry.assign(m_entity); diff --git a/Test Bench/TestScreen.h b/Test Bench/TestScreen.h index 3525133a..e7f0ef01 100644 --- a/Test Bench/TestScreen.h +++ b/Test Bench/TestScreen.h @@ -7,8 +7,8 @@ class TestScreen : public bloom::Screen { void Screen::init() { addGameObject("testSprite", SDL_Rect{ 0,0,128,128 }, "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); - addGameObject("testSprite2", SDL_Rect{ 128,0,128,128 }, "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 }); - addGameObject("testGO", SDL_Rect{ 50,50,256,256 }, "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 }); + addGameObject("testSprite2", SDL_Rect{ 128,0,128,128 }, "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 },2); + addGameObject("testGO", SDL_Rect{ 50,50,256,256 }, "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 },3); registerSystem(); registerSystem(); From 0b956f2d799b6109dd5edecf4b714132e389ac4d Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 13 Oct 2018 23:56:30 +0800 Subject: [PATCH 27/88] Change grouping name from `Priority` to `LayerGroup` --- BloomFramework/BloomFramework.vcxproj | 2 +- BloomFramework/BloomFramework.vcxproj.filters | 2 +- BloomFramework/include/Components/Components.h | 2 +- .../include/Components/{Priority.h => LayerGroup.h} | 2 +- BloomFramework/include/Systems/RenderSystem.h | 8 ++++---- Test Bench/GameObjectTest/TestGameObject.h | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) rename BloomFramework/include/Components/{Priority.h => LayerGroup.h} (54%) diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index 06ef6a93..6d39e63b 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -157,7 +157,7 @@ - + diff --git a/BloomFramework/BloomFramework.vcxproj.filters b/BloomFramework/BloomFramework.vcxproj.filters index ad3060fc..bfd2dad1 100644 --- a/BloomFramework/BloomFramework.vcxproj.filters +++ b/BloomFramework/BloomFramework.vcxproj.filters @@ -92,7 +92,7 @@ Header Files - + Header Files diff --git a/BloomFramework/include/Components/Components.h b/BloomFramework/include/Components/Components.h index 83b62ff2..8c5d5471 100644 --- a/BloomFramework/include/Components/Components.h +++ b/BloomFramework/include/Components/Components.h @@ -3,4 +3,4 @@ #include "Position.h" #include "Size.h" #include "Sprite.h" -#include "Priority.h" \ No newline at end of file +#include "LayerGroup.h" \ No newline at end of file diff --git a/BloomFramework/include/Components/Priority.h b/BloomFramework/include/Components/LayerGroup.h similarity index 54% rename from BloomFramework/include/Components/Priority.h rename to BloomFramework/include/Components/LayerGroup.h index 7f92184b..71a007c4 100644 --- a/BloomFramework/include/Components/Priority.h +++ b/BloomFramework/include/Components/LayerGroup.h @@ -1,5 +1,5 @@ #pragma once namespace bloom { - using Priority = Uint32; + using LayerGroup = Uint32; } \ No newline at end of file diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 8b61404d..0df28c13 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -11,7 +11,7 @@ namespace bloom { public: void System::update(std::optional deltaTime) { - std::vector> renderQueue{}; + std::vector> renderQueue{}; m_registry.view().each( [&](auto entity, Position & pos, Size& size, Sprite & spr) { @@ -22,9 +22,9 @@ namespace bloom { static_cast(size.h) }; - Priority tmp2; - if (m_registry.has(entity)) - tmp2 = m_registry.get(entity); + LayerGroup tmp2; + if (m_registry.has(entity)) + tmp2 = m_registry.get(entity); else tmp2 = 0; diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index d8860bf7..0b581406 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -14,7 +14,7 @@ class TestChar : public bloom::GameObject { m_registry.assign(m_entity, tmp, srcRect); if (priority != std::nullopt) - m_registry.assign(m_entity, priority.value()); + m_registry.assign(m_entity, priority.value()); } void disableRandomPos() { m_registry.assign(m_entity); From fd98ec4f6858efcd896e756424a48725848ea3d0 Mon Sep 17 00:00:00 2001 From: xapdkop Date: Sat, 13 Oct 2018 20:47:51 +0300 Subject: [PATCH 28/88] Prevent implicit inline of `Game::registerScreen()` --- BloomFramework/include/Game.h | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index feed1628..50c3cdb4 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -43,20 +43,7 @@ namespace bloom { // Screen stuff template - void registerScreen(const std::string & tag) { - static_assert (std::is_base_of::value, "Type T passed in is not a Screen"); - if (m_screens.find(tag) == m_screens.end()) { - m_screens.emplace(tag, std::shared_ptr(new T(this))); - m_screens[tag]->init(); - } - else { - std::clog << "Tag has already been registered, overwriting..." << std::endl; - m_screens.erase(tag); - m_screens.emplace(tag, std::shared_ptr(new T(this))); - m_screens[tag]->init(); - - } - } + void registerScreen(const std::string & tag); void unregisterScreen(const std::string & tag); void setActiveScreen(const std::string & tag); @@ -75,4 +62,20 @@ namespace bloom { std::unordered_map m_screens; ScrPtr m_activeScreen; }; + + template + void Game::registerScreen(const std::string & tag) { + static_assert (std::is_base_of::value, "Type T passed in is not a Screen"); + if (m_screens.find(tag) == m_screens.end()) { + m_screens.emplace(tag, std::shared_ptr(new T(this))); + m_screens[tag]->init(); + } + else { + std::clog << "Tag has already been registered, overwriting..." << std::endl; + m_screens.erase(tag); + m_screens.emplace(tag, std::shared_ptr(new T(this))); + m_screens[tag]->init(); + + } + } } \ No newline at end of file From 8eb9d16775801e53cbb1a4317ee9c77119341c18 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Thu, 18 Oct 2018 17:10:24 +0800 Subject: [PATCH 29/88] Rename tmp2 to layerNo in RenderSystem --- BloomFramework/include/Systems/RenderSystem.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 0df28c13..95b5b38a 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -22,14 +22,14 @@ namespace bloom { static_cast(size.h) }; - LayerGroup tmp2; + LayerGroup layerNo; if (m_registry.has(entity)) - tmp2 = m_registry.get(entity); + layerNo = m_registry.get(entity); else - tmp2 = 0; + layerNo = 0; // Place sprites into queue for sorting later. - renderQueue.emplace_back(std::make_tuple(spr,destRect,tmp2)); + renderQueue.emplace_back(std::make_tuple(spr,destRect,layer)); }); // Sort the sprites based on priority, higher number means rendered later. Same layer may fight From 7b31ec2639dd0f921d40e4c794616a1e686cabdf Mon Sep 17 00:00:00 2001 From: xapdkop Date: Sun, 21 Oct 2018 13:23:04 +0300 Subject: [PATCH 30/88] Fix bug with wrong var name, should be `layerNo`, not `layer` --- BloomFramework/include/Systems/RenderSystem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 95b5b38a..150abf09 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -29,7 +29,7 @@ namespace bloom { layerNo = 0; // Place sprites into queue for sorting later. - renderQueue.emplace_back(std::make_tuple(spr,destRect,layer)); + renderQueue.emplace_back(std::make_tuple(spr,destRect,layerNo)); }); // Sort the sprites based on priority, higher number means rendered later. Same layer may fight From 41c32bbb3d3bc1c51b8271d5c5e353cd294f7dfd Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Thu, 25 Oct 2018 15:10:37 +0800 Subject: [PATCH 31/88] Use logical renderer size Also added SDL_WINDOW_RESIZABLE flag to test logical render size --- BloomFramework/src/Game.cpp | 1 + Test Bench/main.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index ce080a00..eaaee78e 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -103,6 +103,7 @@ namespace bloom { else { std::clog << "Renderer initialized." << std::endl; } + SDL_RenderSetLogicalSize(m_renderer, m_screenWidth, m_screenHeight); m_isRunning = true; std::clog << "Game is now running!" << std::endl; diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index dc689ab5..3b061ce8 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -25,7 +25,7 @@ int main() { exit(-1); } - game = new Game(std::nothrow, 800, 600); + game = new Game(std::nothrow, 800, 600, SDL_WINDOW_RESIZABLE); try { game->create("Bloom Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); } @@ -43,7 +43,7 @@ int main() { game->setColor(randColor); game->clear(); game->render(); - int testX = 0, testY = 0; + int x = 0; while (game->isRunning()) { framestart = SDL_GetTicks(); game->handleEvents(); From 2d626415584bb02e0c859e91f2e12215e6b2f003 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Thu, 25 Oct 2018 17:14:13 +0800 Subject: [PATCH 32/88] New position system --- BloomFramework/BloomFramework.vcxproj | 3 ++ BloomFramework/BloomFramework.vcxproj.filters | 9 +++++ BloomFramework/include/Components/Position.h | 7 +--- BloomFramework/include/Components/Size.h | 1 + BloomFramework/include/Coord.h | 35 ++++++++++++++++++ BloomFramework/include/Framework.h | 3 +- BloomFramework/include/Screen.h | 7 ++-- .../include/Systems/DefaultSystem.h | 22 ++++++----- BloomFramework/include/Systems/RenderSystem.h | 15 +++++--- BloomFramework/src/Coord.cpp | 37 +++++++++++++++++++ BloomFramework/src/Screen.cpp | 4 ++ BloomFramework/src/Systems/DefaultSystem.cpp | 6 +++ Test Bench/GameObjectTest/TestGameObject.h | 6 +-- Test Bench/TestScreen.h | 11 +++--- 14 files changed, 135 insertions(+), 31 deletions(-) create mode 100644 BloomFramework/include/Coord.h create mode 100644 BloomFramework/src/Coord.cpp create mode 100644 BloomFramework/src/Systems/DefaultSystem.cpp diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index 72c8af3d..b5616bc1 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -163,6 +163,7 @@ + @@ -182,12 +183,14 @@ + + diff --git a/BloomFramework/BloomFramework.vcxproj.filters b/BloomFramework/BloomFramework.vcxproj.filters index 30ebb93b..69bd041a 100644 --- a/BloomFramework/BloomFramework.vcxproj.filters +++ b/BloomFramework/BloomFramework.vcxproj.filters @@ -48,6 +48,12 @@ Source Files + + Source Files + + + Source Files + @@ -101,6 +107,9 @@ Header Files\Graphics + + Header Files + diff --git a/BloomFramework/include/Components/Position.h b/BloomFramework/include/Components/Position.h index 58ec6e49..52af4234 100644 --- a/BloomFramework/include/Components/Position.h +++ b/BloomFramework/include/Components/Position.h @@ -1,9 +1,6 @@ #pragma once +#include "Coord.h" namespace bloom::components { - struct Position { - Position(int x = 0, int y = 0) : x(x), y(y) {} - - int x, y; - }; + using Position = bloom::Coord; } \ No newline at end of file diff --git a/BloomFramework/include/Components/Size.h b/BloomFramework/include/Components/Size.h index db5af32c..5e2af1dd 100644 --- a/BloomFramework/include/Components/Size.h +++ b/BloomFramework/include/Components/Size.h @@ -2,6 +2,7 @@ namespace bloom::components { struct Size { + Size(const Size & s2) = default; Size(int w = 1, int h = 1) : w(w), h(h) {} int w, h; diff --git a/BloomFramework/include/Coord.h b/BloomFramework/include/Coord.h new file mode 100644 index 00000000..99ce48b1 --- /dev/null +++ b/BloomFramework/include/Coord.h @@ -0,0 +1,35 @@ +#pragma once + +#include "stdIncludes.h" + +enum CoordType { + absolute, + relative +}; + +enum VerticalPosition { + top = 1, + middle = 2, + bottom = 4, +}; +enum HorizontalPosition { + left = 8, + center = 16, + right = 32 +}; + + +namespace bloom { + class BLOOMFRAMEWORK_API Coord { + public: + Coord(); + Coord(const Coord & c2) = default; + Coord(int x, int y, CoordType type = absolute, int direction = top | left); + + Coord getSDLPos(SDL_Renderer * targetRenderer, int width, int height); + + int x, y; + CoordType type; + int relativeTo; + }; +} \ No newline at end of file diff --git a/BloomFramework/include/Framework.h b/BloomFramework/include/Framework.h index 01dfa44e..2cc65105 100644 --- a/BloomFramework/include/Framework.h +++ b/BloomFramework/include/Framework.h @@ -7,4 +7,5 @@ #include "Game.h" #include "GameObject.h" #include "Components/Components.h" -#include "Systems/Systems.h" \ No newline at end of file +#include "Systems/Systems.h" +#include "Coord.h" \ No newline at end of file diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index 6f136514..e3f46ad0 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -15,12 +15,13 @@ namespace bloom { */ class BLOOMFRAMEWORK_API Screen { using System = bloom::systems::System; - + friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Screen & screenObject); public: Screen(Game * gameInstance); ~Screen(); virtual void init() = 0; void update(); + SDL_Renderer * getGameRenderer(); //Game Object stuff template @@ -37,7 +38,7 @@ namespace bloom { SDL_Texture *& getScreenTexture(); - private: + protected: template using SysPtr = std::unique_ptr; std::vector> m_systems; std::unordered_map> m_gameObjects; @@ -70,7 +71,7 @@ namespace bloom { [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v == m_systems.end()) { - m_systems.emplace_back(std::unique_ptr{new T(m_registry)}); + m_systems.emplace_back(std::unique_ptr{new T(*this)}); return (m_systems.size() - 1); } else { diff --git a/BloomFramework/include/Systems/DefaultSystem.h b/BloomFramework/include/Systems/DefaultSystem.h index 12237040..49af54fc 100644 --- a/BloomFramework/include/Systems/DefaultSystem.h +++ b/BloomFramework/include/Systems/DefaultSystem.h @@ -3,16 +3,20 @@ #include #include "stdIncludes.h" -namespace bloom::systems { - class DefaultSystem { - public: - DefaultSystem(entt::DefaultRegistry & registry) : m_registry(registry) {}; +namespace bloom { + class Screen; + namespace systems { + class BLOOMFRAMEWORK_API DefaultSystem { + public: + DefaultSystem(bloom::Screen & screenObject);; - virtual void update(std::optional deltaTime = std::nullopt) = 0; + virtual void update(std::optional deltaTime = std::nullopt) = 0; - protected: - entt::DefaultRegistry & m_registry; - }; + protected: + bloom::Screen & parentScreen; + entt::DefaultRegistry & m_registry; + }; - using System = DefaultSystem; + using System = DefaultSystem; + } } \ No newline at end of file diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 998462b0..1fc9cc91 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -15,14 +15,16 @@ namespace bloom::systems { using System::DefaultSystem; public: + void update(std::optional deltaTime = std::nullopt) override { std::vector> renderQueue{}; m_registry.view().each( [&](auto entity, Position & pos, Size& size, Sprite & spr) { + Coord actualPos = pos.getSDLPos(parentScreen.getGameRenderer(), size.w, size.h); SDL_Rect destRect{ - static_cast(pos.x), - static_cast(pos.y), + static_cast(actualPos.x), + static_cast(actualPos.y), static_cast(size.w), static_cast(size.h) }; @@ -34,9 +36,9 @@ namespace bloom::systems { layerNo = 0; // Place sprites into queue for sorting later. - renderQueue.emplace_back(std::make_tuple(spr,destRect,layerNo)); + renderQueue.emplace_back(std::make_tuple(spr, destRect, layerNo)); }); - + // Sort the sprites based on priority, higher number means rendered later. Same layer may fight std::sort(renderQueue.begin(), renderQueue.end(), [](const auto& lhs, const auto& rhs) { return std::get<2>(lhs) < std::get<2>(rhs); @@ -49,5 +51,8 @@ namespace bloom::systems { spr.texture->render(spr.srcRect, destRect); } } + + private: + SDL_Renderer * renderer; }; -} \ No newline at end of file +} \ No newline at end of file diff --git a/BloomFramework/src/Coord.cpp b/BloomFramework/src/Coord.cpp new file mode 100644 index 00000000..f95b5541 --- /dev/null +++ b/BloomFramework/src/Coord.cpp @@ -0,0 +1,37 @@ +#include "Coord.h" + +namespace bloom { + Coord::Coord() : x(0), y(0), type(absolute), relativeTo(middle | center) {} + Coord::Coord(int x, int y, CoordType type, int direction) : x(x), y(y), type(type), relativeTo(direction) { + if (type == absolute) + this->relativeTo = (middle | center); + } + Coord Coord::getSDLPos(SDL_Renderer * targetRenderer, int width, int height) { + int rendererWidth, rendererHeight; + SDL_RenderGetLogicalSize(targetRenderer, &rendererWidth, &rendererHeight); + Coord result; + if ((relativeTo & left) == left) { + result.x = x; + } + else if ((relativeTo & center) == center) { + result.x = rendererWidth / 2 - width / 2 + x; + } + else if ((relativeTo & right) == right) { + result.x = rendererWidth - width - x; + } + else { + result.x = x; + } + + if ((relativeTo & top) == top) { + result.y = y; + } + else if ((relativeTo & middle) == middle) { + result.y = rendererHeight / 2 - height / 2 - y; + } + else if ((relativeTo & bottom) == bottom) { + result.y = rendererHeight - height - y; + } + return result; + } +} \ No newline at end of file diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index b1666f17..95cf0f86 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -24,6 +24,9 @@ namespace bloom { sys->update(dt); std::cout << "Delta Time: " << dt << "ms" << std::endl; } + SDL_Renderer * Screen::getGameRenderer(){ + return m_gameInstance->getRenderer(); + } void Screen::destroyGameObject(std::string tag) { m_gameObjects.erase(tag); } @@ -31,4 +34,5 @@ namespace bloom { { return m_screenTexture; } + } \ No newline at end of file diff --git a/BloomFramework/src/Systems/DefaultSystem.cpp b/BloomFramework/src/Systems/DefaultSystem.cpp new file mode 100644 index 00000000..39ccf914 --- /dev/null +++ b/BloomFramework/src/Systems/DefaultSystem.cpp @@ -0,0 +1,6 @@ +#include "Systems/DefaultSystem.h" +#include "Screen.h" + +namespace bloom::systems { + DefaultSystem::DefaultSystem(bloom::Screen & screenObject) : parentScreen(screenObject), m_registry(screenObject.m_registry) {} +} \ No newline at end of file diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index a2eabd33..3ab1def4 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -13,9 +13,9 @@ class TestChar : public bloom::GameObject { public: void init() override {} - void init(SDL_Rect pos_and_size = SDL_Rect{ 50,50, 256, 256 }, const std::string & texturePath = "Assets/TestChar.png", std::optional srcRect = std::nullopt, std::optional priority = std::nullopt) { - m_registry.replace(m_entity, pos_and_size.x, pos_and_size.y); - m_registry.assign(m_entity, pos_and_size.w, pos_and_size.h); + void init(Position pos, Size size, const std::string & texturePath = "Assets/TestChar.png", std::optional srcRect = std::nullopt, std::optional priority = std::nullopt) { + m_registry.replace(m_entity, pos); + m_registry.assign(m_entity, size); auto tmp = m_gameInstance->textures.load(texturePath); m_registry.assign(m_entity, tmp, srcRect); diff --git a/Test Bench/TestScreen.h b/Test Bench/TestScreen.h index ff44fbe4..65cfe6b3 100644 --- a/Test Bench/TestScreen.h +++ b/Test Bench/TestScreen.h @@ -3,16 +3,17 @@ #include "GameObjectTest/TestGameObject.h" class TestScreen : public bloom::Screen { using RenderSystem = bloom::systems::RenderSystem; - + using Position = bloom::components::Position; + using Size = bloom::components::Size; public: using bloom::Screen::Screen; void Screen::init() { - addGameObject("testSprite", SDL_Rect{ 0,0,128,128 }, "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); - addGameObject("testSprite2", SDL_Rect{ 128,0,128,128 }, "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 },2); - addGameObject("testGO", SDL_Rect{ 50,50,256,256 }, "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 },3); + addGameObject("testSprite", Position( 10,10 ), Size( 128,128 ), "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); + addGameObject("testSprite2", Position(0, 0, relative), Size(128, 128), "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 },2); + addGameObject("testGO", Position(50, 50, relative, (middle|right)), Size(128, 128), "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 },3); - registerSystem(); + //registerSystem(); registerSystem(); } }; \ No newline at end of file From f960008991bf6d2560e44bfb7aa49782cc5ef8a2 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Thu, 25 Oct 2018 17:18:55 +0800 Subject: [PATCH 33/88] Re-enable randomizer system in Test Bench Maybe a little bit wonky due to new positioning system --- Test Bench/TestScreen.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Test Bench/TestScreen.h b/Test Bench/TestScreen.h index 65cfe6b3..d9fbf891 100644 --- a/Test Bench/TestScreen.h +++ b/Test Bench/TestScreen.h @@ -11,9 +11,9 @@ class TestScreen : public bloom::Screen { void Screen::init() { addGameObject("testSprite", Position( 10,10 ), Size( 128,128 ), "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); addGameObject("testSprite2", Position(0, 0, relative), Size(128, 128), "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 },2); - addGameObject("testGO", Position(50, 50, relative, (middle|right)), Size(128, 128), "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 },3); + addGameObject("testGO", Position(50, 50, relative, (middle|right)), Size(256, 256), "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 },3); - //registerSystem(); + registerSystem(); registerSystem(); } }; \ No newline at end of file From 905e26a7fccca504f5b6afb2488c588dbd52d670 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Thu, 25 Oct 2018 17:22:07 +0800 Subject: [PATCH 34/88] We actually don't need to keep a variable to store coord type --- BloomFramework/include/Coord.h | 1 - BloomFramework/src/Coord.cpp | 29 +++++++++++++---------------- Test Bench/TestScreen.h | 2 +- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/BloomFramework/include/Coord.h b/BloomFramework/include/Coord.h index 99ce48b1..c309968e 100644 --- a/BloomFramework/include/Coord.h +++ b/BloomFramework/include/Coord.h @@ -29,7 +29,6 @@ namespace bloom { Coord getSDLPos(SDL_Renderer * targetRenderer, int width, int height); int x, y; - CoordType type; int relativeTo; }; } \ No newline at end of file diff --git a/BloomFramework/src/Coord.cpp b/BloomFramework/src/Coord.cpp index f95b5541..3f878ca2 100644 --- a/BloomFramework/src/Coord.cpp +++ b/BloomFramework/src/Coord.cpp @@ -1,8 +1,8 @@ #include "Coord.h" namespace bloom { - Coord::Coord() : x(0), y(0), type(absolute), relativeTo(middle | center) {} - Coord::Coord(int x, int y, CoordType type, int direction) : x(x), y(y), type(type), relativeTo(direction) { + Coord::Coord() : x(0), y(0), relativeTo(middle | center) {} + Coord::Coord(int x, int y, CoordType type, int direction) : x(x), y(y), relativeTo(direction) { if (type == absolute) this->relativeTo = (middle | center); } @@ -10,28 +10,25 @@ namespace bloom { int rendererWidth, rendererHeight; SDL_RenderGetLogicalSize(targetRenderer, &rendererWidth, &rendererHeight); Coord result; - if ((relativeTo & left) == left) { + + // Get SDL style X position, factoring object width as well. + if ((relativeTo & left) == left) result.x = x; - } - else if ((relativeTo & center) == center) { + else if ((relativeTo & center) == center) result.x = rendererWidth / 2 - width / 2 + x; - } - else if ((relativeTo & right) == right) { + else if ((relativeTo & right) == right) result.x = rendererWidth - width - x; - } - else { + else result.x = x; - } - if ((relativeTo & top) == top) { + // Get SDL style Y position, factoring object height as well. + if ((relativeTo & top) == top) result.y = y; - } - else if ((relativeTo & middle) == middle) { + else if ((relativeTo & middle) == middle) result.y = rendererHeight / 2 - height / 2 - y; - } - else if ((relativeTo & bottom) == bottom) { + else if ((relativeTo & bottom) == bottom) result.y = rendererHeight - height - y; - } + return result; } } \ No newline at end of file diff --git a/Test Bench/TestScreen.h b/Test Bench/TestScreen.h index d9fbf891..42f00e78 100644 --- a/Test Bench/TestScreen.h +++ b/Test Bench/TestScreen.h @@ -13,7 +13,7 @@ class TestScreen : public bloom::Screen { addGameObject("testSprite2", Position(0, 0, relative), Size(128, 128), "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 },2); addGameObject("testGO", Position(50, 50, relative, (middle|right)), Size(256, 256), "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 },3); - registerSystem(); + //registerSystem(); registerSystem(); } }; \ No newline at end of file From a40fa15f563b8bfbbcf257eae5fb44c20c93d5da Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Thu, 25 Oct 2018 18:14:18 +0800 Subject: [PATCH 35/88] Missing failsafe --- BloomFramework/src/Coord.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BloomFramework/src/Coord.cpp b/BloomFramework/src/Coord.cpp index 3f878ca2..56625660 100644 --- a/BloomFramework/src/Coord.cpp +++ b/BloomFramework/src/Coord.cpp @@ -28,6 +28,8 @@ namespace bloom { result.y = rendererHeight / 2 - height / 2 - y; else if ((relativeTo & bottom) == bottom) result.y = rendererHeight - height - y; + else + result.y = y; return result; } From 2560fd0204f0f5a5dd5c1b12903e8f2af5efcc0a Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Thu, 25 Oct 2018 18:43:22 +0800 Subject: [PATCH 36/88] Negative sizes should count as 0 --- BloomFramework/include/Systems/RenderSystem.h | 6 ++++++ BloomFramework/src/Coord.cpp | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 1fc9cc91..d68dcc49 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -21,6 +21,12 @@ namespace bloom::systems { m_registry.view().each( [&](auto entity, Position & pos, Size& size, Sprite & spr) { + + if (size.w < 0) + size.w = 0; + if (size.h < 0) + size.h = 0; + Coord actualPos = pos.getSDLPos(parentScreen.getGameRenderer(), size.w, size.h); SDL_Rect destRect{ static_cast(actualPos.x), diff --git a/BloomFramework/src/Coord.cpp b/BloomFramework/src/Coord.cpp index 56625660..c1cc1569 100644 --- a/BloomFramework/src/Coord.cpp +++ b/BloomFramework/src/Coord.cpp @@ -11,6 +11,11 @@ namespace bloom { SDL_RenderGetLogicalSize(targetRenderer, &rendererWidth, &rendererHeight); Coord result; + if (width < 0) + width = 0; + if (height < 0) + height = 0; + // Get SDL style X position, factoring object width as well. if ((relativeTo & left) == left) result.x = x; From 411f8a26331ba854e159e0f077171e1792c77d28 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 31 Oct 2018 20:05:30 +0800 Subject: [PATCH 37/88] Make base for SceneManager --- BloomFramework/BloomFramework.vcxproj | 4 ++++ BloomFramework/BloomFramework.vcxproj.filters | 24 ++++++++++++++++--- BloomFramework/include/Scenes/SceneManager.h | 17 +++++++++++++ BloomFramework/src/Scenes/SceneManager.cpp | 16 +++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 BloomFramework/include/Scenes/SceneManager.h create mode 100644 BloomFramework/src/Scenes/SceneManager.cpp diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index b5616bc1..c64ed6ce 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -173,6 +173,8 @@ + + @@ -187,6 +189,8 @@ + + diff --git a/BloomFramework/BloomFramework.vcxproj.filters b/BloomFramework/BloomFramework.vcxproj.filters index 69bd041a..78084903 100644 --- a/BloomFramework/BloomFramework.vcxproj.filters +++ b/BloomFramework/BloomFramework.vcxproj.filters @@ -25,6 +25,12 @@ {901b4a12-4da2-4795-b576-f703b5eb63bc} + + {88b678a9-afd8-4bf2-8497-4a206009a84c} + + + {dd833aec-1858-4a66-867e-60efaeeec2cb} + @@ -54,6 +60,12 @@ Source Files + + Source Files\Scenes + + + Source Files\Scenes + @@ -98,9 +110,6 @@ Header Files - - Header Files - Header Files\Graphics @@ -110,6 +119,15 @@ Header Files + + Header Files\Scenes + + + Header Files\Scenes + + + Header Files\Components + diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h new file mode 100644 index 00000000..d0f145c4 --- /dev/null +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -0,0 +1,17 @@ +#pragma once + +#include "stdIncludes.h" +#include + +namespace bloom { + class Scene; + class BLOOMFRAMEWORK_API SceneManager { + public: + void changeScene(Scene * newScene); + void update(); + void draw(); + + private: + Scene * currScene; + }; +} \ No newline at end of file diff --git a/BloomFramework/src/Scenes/SceneManager.cpp b/BloomFramework/src/Scenes/SceneManager.cpp new file mode 100644 index 00000000..9751fa55 --- /dev/null +++ b/BloomFramework/src/Scenes/SceneManager.cpp @@ -0,0 +1,16 @@ +#include "Scenes\SceneManager.h" +#include "Scenes/Scene.h" + +namespace bloom { + void SceneManager::changeScene(Scene * newScene) { + if (currScene != nullptr) currScene->unload(); + newScene->load(); + currScene = newScene; + } + void SceneManager::update() { + if (currScene != nullptr) currScene->update(); + } + void SceneManager::draw() { + // Might not need this. + } +} From 0c7e25738df2f229b91dee156f5bc0a55ee9e92d Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 31 Oct 2018 20:14:50 +0800 Subject: [PATCH 38/88] Create `Scene` class --- BloomFramework/include/Scenes/Scene.h | 70 ++++++++++++++++++++ BloomFramework/include/Scenes/SceneManager.h | 7 +- BloomFramework/src/Scenes/Scene.cpp | 7 ++ BloomFramework/src/Scenes/SceneManager.cpp | 8 ++- 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 BloomFramework/include/Scenes/Scene.h create mode 100644 BloomFramework/src/Scenes/Scene.cpp diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h new file mode 100644 index 00000000..5a220ec6 --- /dev/null +++ b/BloomFramework/include/Scenes/Scene.h @@ -0,0 +1,70 @@ +#pragma once + +#include "stdIncludes.h" +#include "Systems/DefaultSystem.h" +#include "GameObject.h" + +namespace bloom { + class SceneManager; + class BLOOMFRAMEWORK_API Scene { + public: + Scene(SceneManager & sceneManager); + virtual void update() = 0; + virtual void draw() = 0; // May not need this since we use a render system on a Texture. + virtual void load() = 0; + virtual void unload() = 0; + + //Game Object stuff + template void addGameObject(std::string tag, TArgs&&... initArgs); + void destroyGameObject(std::string tag); + + // System stuff + template size_t registerSystem(); + template void unregisterSystem(); + + protected: + SceneManager & m_sceneManager; + Game & m_gameInstance; + entt::DefaultRegistry m_registry; + SDL_Texture * m_sceneTexture; + }; + + using System = bloom::System; + template void Scene::addGameObject(std::string tag, TArgs && ...initArgs) { + static_assert (std::is_base_of::value, "Type T passed in is not a GameObject."); + m_gameObjects.emplace(tag, new T(m_registry, m_gameInstance)); + + auto & tmp = m_gameObjects[tag]; + T* derived = dynamic_cast(tmp.get()); + if (derived != nullptr) + derived->init(std::forward(initArgs)...); + } + + // System stuff + template size_t Scene::registerSystem() { + static_assert (std::is_base_of::value, "Type T passed in is not a System."); + if (auto v = std::find_if(m_systems.begin(), m_systems.end(), + [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v == m_systems.end()) + { + + m_systems.emplace_back(std::unique_ptr{new T(*this)}); + return (m_systems.size() - 1); + } + else { + std::clog << "This system is already registered." << std::endl; + return (v - m_systems.begin()); + } + } + template void Scene::unregisterSystem() { + static_assert (std::is_base_of::value, "Type T passed in is not a System."); + if (auto v = std::find_if(m_systems.begin(), m_systems.end(), + [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v != m_systems.end()) + { + m_systems.erase(v); + } + else { + std::clog << "Can't unregister system that isn't registered." << std::endl; + } + } +} + diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index d0f145c4..ff0bf924 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -2,16 +2,21 @@ #include "stdIncludes.h" #include +#include "Scene.h" namespace bloom { + class Game; class Scene; class BLOOMFRAMEWORK_API SceneManager { + friend Scene::Scene(SceneManager & sceneManager); public: + SceneManager(Game& gameInstance); void changeScene(Scene * newScene); void update(); void draw(); private: - Scene * currScene; + Scene * m_currScene; + Game & m_gameInstance; }; } \ No newline at end of file diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp new file mode 100644 index 00000000..deb443df --- /dev/null +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -0,0 +1,7 @@ +#include "Scenes\Scene.h" +#include "Scenes/SceneManager.h" + +namespace bloom { + Scene::Scene(SceneManager & sceneManager) : m_sceneManager(sceneManager), m_gameInstance(sceneManager.m_gameInstance) {} +} + diff --git a/BloomFramework/src/Scenes/SceneManager.cpp b/BloomFramework/src/Scenes/SceneManager.cpp index 9751fa55..5925380e 100644 --- a/BloomFramework/src/Scenes/SceneManager.cpp +++ b/BloomFramework/src/Scenes/SceneManager.cpp @@ -2,13 +2,15 @@ #include "Scenes/Scene.h" namespace bloom { + inline SceneManager::SceneManager(Game & gameInstance) : m_gameInstance(gameInstance) {} void SceneManager::changeScene(Scene * newScene) { - if (currScene != nullptr) currScene->unload(); + if (m_currScene != nullptr) m_currScene->unload(); newScene->load(); - currScene = newScene; + m_currScene = newScene; } void SceneManager::update() { - if (currScene != nullptr) currScene->update(); + if (m_currScene != nullptr) m_currScene->update(); + else std::cerr << "There is currently no active Scene" << std::endl; } void SceneManager::draw() { // Might not need this. From 520b7e9fd138c2558d1841b326cf543305b88fc9 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 2 Nov 2018 00:25:05 +0800 Subject: [PATCH 39/88] Implemented Scene and SceneManager --- BloomFramework/include/Game.h | 27 +++---------------- BloomFramework/include/GameObject.h | 4 +-- BloomFramework/include/Scenes/Scene.h | 13 +++++++-- BloomFramework/include/Scenes/SceneManager.h | 6 +++-- .../include/Systems/DefaultSystem.h | 6 ++--- BloomFramework/include/Systems/RenderSystem.h | 2 +- BloomFramework/src/Game.cpp | 15 ++--------- BloomFramework/src/GameObject.cpp | 2 +- BloomFramework/src/Scenes/Scene.cpp | 22 +++++++++++++-- BloomFramework/src/Scenes/SceneManager.cpp | 8 +++--- BloomFramework/src/Systems/DefaultSystem.cpp | 4 +-- Test Bench/GameObjectTest/TestGameObject.h | 2 +- Test Bench/TestScreen.h | 13 ++++++--- Test Bench/main.cpp | 3 +-- 14 files changed, 65 insertions(+), 62 deletions(-) diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index 1580b1f9..764f2e60 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -5,6 +5,7 @@ #include "Timer.h" #include "Screen.h" #include "Exception.h" +#include "Scenes/SceneManager.h" namespace bloom { class BLOOMFRAMEWORK_API Game { @@ -41,15 +42,10 @@ namespace bloom { SDL_Renderer * getRenderer(); - // Screen stuff - template - void registerScreen(const std::string & tag); - - void unregisterScreen(const std::string & tag); - void setActiveScreen(const std::string & tag); - TextureStore textures = TextureStore(m_renderer); Timer timer; + + SceneManager sceneManager = SceneManager(*this); protected: SDL_Renderer * m_renderer = nullptr; @@ -60,22 +56,5 @@ namespace bloom { SDL_Event m_event; bool m_isRunning; std::unordered_map m_screens; - ScrPtr m_activeScreen; }; - - template - void Game::registerScreen(const std::string & tag) { - static_assert (std::is_base_of::value, "Type T passed in is not a Screen"); - if (m_screens.find(tag) == m_screens.end()) { - m_screens.emplace(tag, std::shared_ptr(new T(this))); - m_screens[tag]->init(); - } - else { - std::clog << "Tag has already been registered, overwriting..." << std::endl; - m_screens.erase(tag); - m_screens.emplace(tag, std::shared_ptr(new T(this))); - m_screens[tag]->init(); - - } - } } \ No newline at end of file diff --git a/BloomFramework/include/GameObject.h b/BloomFramework/include/GameObject.h index e430cde8..6f936b74 100644 --- a/BloomFramework/include/GameObject.h +++ b/BloomFramework/include/GameObject.h @@ -19,7 +19,7 @@ namespace bloom { using Position = bloom::components::Position; public: - GameObject(entt::DefaultRegistry & registry, Game *& gameInstance); + GameObject(entt::DefaultRegistry & registry, Game & gameInstance); ~GameObject(); virtual void init() = 0; @@ -28,7 +28,7 @@ namespace bloom { protected: entt::DefaultRegistry & m_registry; - Game *& m_gameInstance; + Game & m_gameInstance; entt::DefaultRegistry::entity_type m_entity; }; } \ No newline at end of file diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 5a220ec6..b6d91889 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -7,12 +7,17 @@ namespace bloom { class SceneManager; class BLOOMFRAMEWORK_API Scene { + using System = bloom::systems::System; + friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Scene & screenObject); + public: Scene(SceneManager & sceneManager); - virtual void update() = 0; + void update(); virtual void draw() = 0; // May not need this since we use a render system on a Texture. virtual void load() = 0; virtual void unload() = 0; + SDL_Texture * getSceneTexture(); + Game & getGameInstance() { return m_gameInstance; } //Game Object stuff template void addGameObject(std::string tag, TArgs&&... initArgs); @@ -26,10 +31,14 @@ namespace bloom { SceneManager & m_sceneManager; Game & m_gameInstance; entt::DefaultRegistry m_registry; + + template using SysPtr = std::unique_ptr; + std::vector> m_systems; + + std::unordered_map> m_gameObjects; SDL_Texture * m_sceneTexture; }; - using System = bloom::System; template void Scene::addGameObject(std::string tag, TArgs && ...initArgs) { static_assert (std::is_base_of::value, "Type T passed in is not a GameObject."); m_gameObjects.emplace(tag, new T(m_registry, m_gameInstance)); diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index ff0bf924..695ec954 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -11,12 +11,14 @@ namespace bloom { friend Scene::Scene(SceneManager & sceneManager); public: SceneManager(Game& gameInstance); - void changeScene(Scene * newScene); + void changeScene(std::shared_ptr newScene); void update(); void draw(); + + const SceneManager * thisPtr = this; private: - Scene * m_currScene; + std::shared_ptr m_currScene; Game & m_gameInstance; }; } \ No newline at end of file diff --git a/BloomFramework/include/Systems/DefaultSystem.h b/BloomFramework/include/Systems/DefaultSystem.h index 49af54fc..6391aee0 100644 --- a/BloomFramework/include/Systems/DefaultSystem.h +++ b/BloomFramework/include/Systems/DefaultSystem.h @@ -4,16 +4,16 @@ #include "stdIncludes.h" namespace bloom { - class Screen; + class Scene; namespace systems { class BLOOMFRAMEWORK_API DefaultSystem { public: - DefaultSystem(bloom::Screen & screenObject);; + DefaultSystem(bloom::Scene & screenObject);; virtual void update(std::optional deltaTime = std::nullopt) = 0; protected: - bloom::Screen & parentScreen; + bloom::Scene & parentScreen; entt::DefaultRegistry & m_registry; }; diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index d68dcc49..7bd25a05 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -27,7 +27,7 @@ namespace bloom::systems { if (size.h < 0) size.h = 0; - Coord actualPos = pos.getSDLPos(parentScreen.getGameRenderer(), size.w, size.h); + Coord actualPos = pos.getSDLPos(parentScreen.getGameInstance().getRenderer(), size.w, size.h); SDL_Rect destRect{ static_cast(actualPos.x), static_cast(actualPos.y), diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index eaaee78e..37053447 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -117,8 +117,7 @@ namespace bloom { } void Game::update() { - if(m_activeScreen != nullptr) - m_activeScreen->update(); + sceneManager.update(); } void Game::clear() { @@ -132,7 +131,7 @@ namespace bloom { void Game::render() { SDL_SetRenderTarget(m_renderer, NULL); - SDL_RenderCopyEx(m_renderer, m_activeScreen->getScreenTexture(),NULL,NULL, NULL,NULL, SDL_FLIP_NONE); + sceneManager.draw(); SDL_RenderPresent(m_renderer); } @@ -180,14 +179,4 @@ namespace bloom { SDL_Renderer * Game::getRenderer(){ return m_renderer; } - void Game::unregisterScreen(const std::string & tag) { - m_screens.erase(tag); - } - void Game::setActiveScreen(const std::string & tag) { - auto tmp = m_screens.find(tag); - if (tmp != m_screens.end()) - m_activeScreen = tmp->second; - else - throw Exception("Can't set Screen with tag " + tag + " as active screen. It is not registered."); - } } \ No newline at end of file diff --git a/BloomFramework/src/GameObject.cpp b/BloomFramework/src/GameObject.cpp index 0ed6a9a2..82240d38 100644 --- a/BloomFramework/src/GameObject.cpp +++ b/BloomFramework/src/GameObject.cpp @@ -1,7 +1,7 @@ #include "GameObject.h" namespace bloom { - GameObject::GameObject(entt::DefaultRegistry & registry, Game *& gameInstance) : m_registry(registry), m_gameInstance(gameInstance) { + GameObject::GameObject(entt::DefaultRegistry & registry, Game & gameInstance) : m_registry(registry), m_gameInstance(gameInstance) { m_entity = m_registry.create(); m_registry.assign(m_entity, 0, 0); } diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index deb443df..452ceeca 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -1,7 +1,25 @@ #include "Scenes\Scene.h" -#include "Scenes/SceneManager.h" +#include "Scenes\SceneManager.h" +#include "Game.h" namespace bloom { - Scene::Scene(SceneManager & sceneManager) : m_sceneManager(sceneManager), m_gameInstance(sceneManager.m_gameInstance) {} + Scene::Scene(SceneManager & sceneManager) : m_sceneManager(sceneManager), m_gameInstance(sceneManager.m_gameInstance) { + m_sceneTexture = SDL_CreateTexture(m_gameInstance.getRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, + m_gameInstance.getScreenWidth(), + m_gameInstance.getScreenHeight()); + + SDL_SetTextureBlendMode(m_sceneTexture, SDL_BLENDMODE_BLEND); + } + void Scene::update() { + SDL_SetRenderTarget(m_gameInstance.getRenderer(), m_sceneTexture); + SDL_RenderClear(m_gameInstance.getRenderer()); + double dt = m_gameInstance.timer.lap(); + for (auto& sys : m_systems) + sys->update(dt); + std::cout << "Delta Time: " << dt << "ms" << std::endl; + } + SDL_Texture * Scene::getSceneTexture(){ + return m_sceneTexture; + } } diff --git a/BloomFramework/src/Scenes/SceneManager.cpp b/BloomFramework/src/Scenes/SceneManager.cpp index 5925380e..ff1e7319 100644 --- a/BloomFramework/src/Scenes/SceneManager.cpp +++ b/BloomFramework/src/Scenes/SceneManager.cpp @@ -1,9 +1,10 @@ #include "Scenes\SceneManager.h" -#include "Scenes/Scene.h" +#include "Scenes\Scene.h" +#include "Game.h" namespace bloom { inline SceneManager::SceneManager(Game & gameInstance) : m_gameInstance(gameInstance) {} - void SceneManager::changeScene(Scene * newScene) { + void SceneManager::changeScene(std::shared_ptr newScene) { if (m_currScene != nullptr) m_currScene->unload(); newScene->load(); m_currScene = newScene; @@ -13,6 +14,7 @@ namespace bloom { else std::cerr << "There is currently no active Scene" << std::endl; } void SceneManager::draw() { - // Might not need this. + if (m_currScene != nullptr) + SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_currScene->getSceneTexture(), NULL, NULL, NULL, NULL, SDL_FLIP_NONE); } } diff --git a/BloomFramework/src/Systems/DefaultSystem.cpp b/BloomFramework/src/Systems/DefaultSystem.cpp index 39ccf914..5975453f 100644 --- a/BloomFramework/src/Systems/DefaultSystem.cpp +++ b/BloomFramework/src/Systems/DefaultSystem.cpp @@ -1,6 +1,6 @@ #include "Systems/DefaultSystem.h" -#include "Screen.h" +#include "Scenes/Scene.h" namespace bloom::systems { - DefaultSystem::DefaultSystem(bloom::Screen & screenObject) : parentScreen(screenObject), m_registry(screenObject.m_registry) {} + DefaultSystem::DefaultSystem(bloom::Scene & screenObject) : parentScreen(screenObject), m_registry(screenObject.m_registry) {} } \ No newline at end of file diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index 3ab1def4..94d71015 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -16,7 +16,7 @@ class TestChar : public bloom::GameObject { void init(Position pos, Size size, const std::string & texturePath = "Assets/TestChar.png", std::optional srcRect = std::nullopt, std::optional priority = std::nullopt) { m_registry.replace(m_entity, pos); m_registry.assign(m_entity, size); - auto tmp = m_gameInstance->textures.load(texturePath); + auto tmp = m_gameInstance.textures.load(texturePath); m_registry.assign(m_entity, tmp, srcRect); if (priority != std::nullopt) diff --git a/Test Bench/TestScreen.h b/Test Bench/TestScreen.h index 42f00e78..74e39192 100644 --- a/Test Bench/TestScreen.h +++ b/Test Bench/TestScreen.h @@ -1,14 +1,17 @@ #pragma once -#include "Screen.h" +#include "Scenes/Scene.h" #include "GameObjectTest/TestGameObject.h" -class TestScreen : public bloom::Screen { + +class TestScreen : public bloom::Scene { using RenderSystem = bloom::systems::RenderSystem; using Position = bloom::components::Position; using Size = bloom::components::Size; public: - using bloom::Screen::Screen; + using bloom::Scene::Scene; + + void draw() override {} - void Screen::init() { + void load() override { addGameObject("testSprite", Position( 10,10 ), Size( 128,128 ), "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); addGameObject("testSprite2", Position(0, 0, relative), Size(128, 128), "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 },2); addGameObject("testGO", Position(50, 50, relative, (middle|right)), Size(256, 256), "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 },3); @@ -16,4 +19,6 @@ class TestScreen : public bloom::Screen { //registerSystem(); registerSystem(); } + + void unload() override {} }; \ No newline at end of file diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index 3b061ce8..da3c3298 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -34,8 +34,7 @@ int main() { } game->textures.load("Assets/OverworldTestSpritesheet.png", SDL_Color{ 64, 176, 104, 113 }); game->textures.load("Assets/TestChar.png", SDL_Color{ 144,168,0,0 }); - game->registerScreen("Test"); - game->setActiveScreen("Test"); + game->sceneManager.changeScene(std::shared_ptr(new TestScreen(game->sceneManager))); srand(static_cast(time(0))); SDL_Color randColor = { static_cast(rand() % 255), static_cast(rand() % 255), From 1b8d36412b903dc30f515e4dee4669cde97ec1c0 Mon Sep 17 00:00:00 2001 From: xapdkop Date: Thu, 1 Nov 2018 22:26:21 +0300 Subject: [PATCH 40/88] Small fixes and improvements [Coord]: - use struct instead of class [Scene]: - make `getSceneTexture` inline - rename template main argument name (from `T` to `GO` or `S`) in `addGameObject`, `registerSystem` and `unregisterSystem` - use `const std::string &` instead of `std::string` - optimize `addGameObject` - use `std::is_base_v` instead of `std::is_base::value` - don't use `template using SysPtr = std::unique_ptr;` - minor readability fixes [SceneManager]: - remove unnecessary `stack` include - fixes in `draw()` - readability fixes [Screen]: - move system includes above - disable `DefaultSystem` friend - rename template main argument name (from `T` to `GO` or `S`) in `addGameObject`, `registerSystem` and `unregisterSystem` - use `const std::string &` instead of `std::string` - optimize `addGameObject` - use `std::is_base_v` instead of `std::is_base::value` - don't use `template using SysPtr = std::unique_ptr;` - minor readability fixes Add missed blank lines, indents and line feeds. --- BloomFramework/include/Components/Size.h | 2 +- BloomFramework/include/Coord.h | 11 ++-- BloomFramework/include/Scenes/Scene.h | 57 ++++++++++-------- BloomFramework/include/Scenes/SceneManager.h | 7 ++- BloomFramework/include/Screen.h | 61 +++++++++++--------- BloomFramework/src/Coord.cpp | 2 + BloomFramework/src/Scenes/Scene.cpp | 8 +-- BloomFramework/src/Scenes/SceneManager.cpp | 14 +++-- BloomFramework/src/Screen.cpp | 11 ++-- Test Bench/TestScreen.h | 4 +- 10 files changed, 100 insertions(+), 77 deletions(-) diff --git a/BloomFramework/include/Components/Size.h b/BloomFramework/include/Components/Size.h index 5e2af1dd..f2a62673 100644 --- a/BloomFramework/include/Components/Size.h +++ b/BloomFramework/include/Components/Size.h @@ -2,7 +2,7 @@ namespace bloom::components { struct Size { - Size(const Size & s2) = default; + Size(const Size & other) = default; Size(int w = 1, int h = 1) : w(w), h(h) {} int w, h; diff --git a/BloomFramework/include/Coord.h b/BloomFramework/include/Coord.h index c309968e..fc8142cb 100644 --- a/BloomFramework/include/Coord.h +++ b/BloomFramework/include/Coord.h @@ -12,6 +12,7 @@ enum VerticalPosition { middle = 2, bottom = 4, }; + enum HorizontalPosition { left = 8, center = 16, @@ -20,15 +21,15 @@ enum HorizontalPosition { namespace bloom { - class BLOOMFRAMEWORK_API Coord { + struct BLOOMFRAMEWORK_API Coord { public: + int x, y; + int relativeTo; + Coord(); - Coord(const Coord & c2) = default; + Coord(const Coord & other) = default; Coord(int x, int y, CoordType type = absolute, int direction = top | left); Coord getSDLPos(SDL_Renderer * targetRenderer, int width, int height); - - int x, y; - int relativeTo; }; } \ No newline at end of file diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index b6d91889..d420abfe 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -6,57 +6,65 @@ namespace bloom { class SceneManager; + class BLOOMFRAMEWORK_API Scene { using System = bloom::systems::System; friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Scene & screenObject); public: Scene(SceneManager & sceneManager); + void update(); virtual void draw() = 0; // May not need this since we use a render system on a Texture. virtual void load() = 0; virtual void unload() = 0; - SDL_Texture * getSceneTexture(); + SDL_Texture * getSceneTexture() { return m_sceneTexture; } Game & getGameInstance() { return m_gameInstance; } //Game Object stuff - template void addGameObject(std::string tag, TArgs&&... initArgs); - void destroyGameObject(std::string tag); + template + void addGameObject(const std::string & tag, TArgs &&... initArgs); + + //void destroyGameObject(const std::string & tag); // System stuff - template size_t registerSystem(); - template void unregisterSystem(); + template + size_t registerSystem(); + + template + void unregisterSystem(); protected: SceneManager & m_sceneManager; Game & m_gameInstance; entt::DefaultRegistry m_registry; - - template using SysPtr = std::unique_ptr; - std::vector> m_systems; - + std::vector> m_systems; std::unordered_map> m_gameObjects; SDL_Texture * m_sceneTexture; }; - template void Scene::addGameObject(std::string tag, TArgs && ...initArgs) { - static_assert (std::is_base_of::value, "Type T passed in is not a GameObject."); - m_gameObjects.emplace(tag, new T(m_registry, m_gameInstance)); + template void Scene::addGameObject(const std::string & tag, TArgs &&... initArgs) { + static_assert(std::is_base_of_v, "Type GO passed in is not a GameObject."); + + GO* obj = new GO(m_registry, m_gameInstance); + obj->init(std::forward(initArgs)...); - auto & tmp = m_gameObjects[tag]; - T* derived = dynamic_cast(tmp.get()); - if (derived != nullptr) - derived->init(std::forward(initArgs)...); + m_gameObjects.emplace(tag, std::unique_ptr(obj)); + + //auto & tmp = m_gameObjects[tag]; + //GO* derived = dynamic_cast(tmp.get()); + ////if (derived != nullptr) // we just already emplaced object, nullptr will never be returned + // derived->init(std::forward(initArgs)...); } // System stuff - template size_t Scene::registerSystem() { - static_assert (std::is_base_of::value, "Type T passed in is not a System."); + template size_t Scene::registerSystem() { + static_assert (std::is_base_of_v, "Type S passed in is not a System."); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v == m_systems.end()) + [](auto & i) -> bool {if (typeid(*i).name() == typeid(S).name()) return true; return false; }); + v == m_systems.end()) { - - m_systems.emplace_back(std::unique_ptr{new T(*this)}); + m_systems.emplace_back(std::unique_ptr(new S(*this))); return (m_systems.size() - 1); } else { @@ -64,10 +72,11 @@ namespace bloom { return (v - m_systems.begin()); } } - template void Scene::unregisterSystem() { - static_assert (std::is_base_of::value, "Type T passed in is not a System."); + template void Scene::unregisterSystem() { + static_assert (std::is_base_of_v, "Type S passed in is not a System."); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v != m_systems.end()) + [](auto & i) -> bool {if (typeid(*i).name() == typeid(S).name()) return true; return false; }); + v != m_systems.end()) { m_systems.erase(v); } diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index 695ec954..015618bd 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -1,16 +1,17 @@ #pragma once #include "stdIncludes.h" -#include #include "Scene.h" namespace bloom { - class Game; - class Scene; + class Game; class Scene; + class BLOOMFRAMEWORK_API SceneManager { friend Scene::Scene(SceneManager & sceneManager); + public: SceneManager(Game& gameInstance); + void changeScene(std::shared_ptr newScene); void update(); void draw(); diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h index e3f46ad0..c4af72ad 100644 --- a/BloomFramework/include/Screen.h +++ b/BloomFramework/include/Screen.h @@ -1,10 +1,12 @@ #pragma once -#include "stdIncludes.h" -#include "Systems/Systems.h" -#include "GameObject.h" + #include #include #include +#include "stdIncludes.h" +#include "Systems/Systems.h" +#include "GameObject.h" + namespace bloom { class Game; @@ -15,32 +17,31 @@ namespace bloom { */ class BLOOMFRAMEWORK_API Screen { using System = bloom::systems::System; - friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Screen & screenObject); + //friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Screen & screenObject); + public: Screen(Game * gameInstance); ~Screen(); virtual void init() = 0; void update(); SDL_Renderer * getGameRenderer(); + SDL_Texture * getScreenTexture(); //Game Object stuff - template - void addGameObject(std::string tag, TArgs&&... initArgs); + template + void addGameObject(const std::string & tag, TArgs&&... initArgs); - void destroyGameObject(std::string tag); + void destroyGameObject(const std::string & tag); // System stuff - template + template size_t registerSystem(); - template + template void unregisterSystem(); - SDL_Texture *& getScreenTexture(); - protected: - template using SysPtr = std::unique_ptr; - std::vector> m_systems; + std::vector> m_systems; std::unordered_map> m_gameObjects; entt::DefaultRegistry m_registry; Game * m_gameInstance; @@ -51,27 +52,31 @@ namespace bloom { //Game Object stuff - template - void Screen::addGameObject(std::string tag, TArgs && ...initArgs) { - static_assert (std::is_base_of::value, "Type T passed in is not a GameObject."); - m_gameObjects.emplace(tag, new T(m_registry, m_gameInstance)); + template + void Screen::addGameObject(const std::string & tag, TArgs && ...initArgs) { + static_assert (std::is_base_of_v, "Type GO passed in is not a GameObject."); + + GO* obj = new GO(m_registry, m_gameInstance); + obj->init(std::forward(initArgs)...);; + + m_gameObjects.emplace(tag, std::unique_ptr(obj)); - auto & tmp = m_gameObjects[tag]; - T* derived = dynamic_cast(tmp.get()); - if (derived != nullptr) - derived->init(std::forward(initArgs)...); + //auto & tmp = m_gameObjects[tag]; + //GO* derived = dynamic_cast(tmp.get()); + ////if (derived != nullptr) + // derived->init(std::forward(initArgs)...); } // System stuff - template + template size_t Screen::registerSystem() { - static_assert (std::is_base_of::value, "Type T passed in is not a System."); + static_assert (std::is_base_of_v, "Type S passed in is not a System."); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v == m_systems.end()) + [](auto & i) -> bool {if (typeid(*i).name() == typeid(S).name()) return true; return false; }); v == m_systems.end()) { - m_systems.emplace_back(std::unique_ptr{new T(*this)}); + m_systems.emplace_back(std::unique_ptr{new S(*this)}); return (m_systems.size() - 1); } else { @@ -79,11 +84,11 @@ namespace bloom { return (v - m_systems.begin()); } } - template + template void Screen::unregisterSystem() { - static_assert (std::is_base_of::value, "Type T passed in is not a System."); + static_assert (std::is_base_of_v, "Type S passed in is not a System."); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(T).name()) return true; return false; }); v != m_systems.end()) + [](auto & i) -> bool {if (typeid(*i).name() == typeid(S).name()) return true; return false; }); v != m_systems.end()) { m_systems.erase(v); } diff --git a/BloomFramework/src/Coord.cpp b/BloomFramework/src/Coord.cpp index c1cc1569..0dbe74a6 100644 --- a/BloomFramework/src/Coord.cpp +++ b/BloomFramework/src/Coord.cpp @@ -2,10 +2,12 @@ namespace bloom { Coord::Coord() : x(0), y(0), relativeTo(middle | center) {} + Coord::Coord(int x, int y, CoordType type, int direction) : x(x), y(y), relativeTo(direction) { if (type == absolute) this->relativeTo = (middle | center); } + Coord Coord::getSDLPos(SDL_Renderer * targetRenderer, int width, int height) { int rendererWidth, rendererHeight; SDL_RenderGetLogicalSize(targetRenderer, &rendererWidth, &rendererHeight); diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index 452ceeca..e3419f33 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -10,16 +10,14 @@ namespace bloom { SDL_SetTextureBlendMode(m_sceneTexture, SDL_BLENDMODE_BLEND); } + void Scene::update() { SDL_SetRenderTarget(m_gameInstance.getRenderer(), m_sceneTexture); SDL_RenderClear(m_gameInstance.getRenderer()); double dt = m_gameInstance.timer.lap(); - for (auto& sys : m_systems) + for (auto & sys : m_systems) sys->update(dt); - std::cout << "Delta Time: " << dt << "ms" << std::endl; - } - SDL_Texture * Scene::getSceneTexture(){ - return m_sceneTexture; + std::clog << "Delta Time: " << dt << "ms" << std::endl; } } diff --git a/BloomFramework/src/Scenes/SceneManager.cpp b/BloomFramework/src/Scenes/SceneManager.cpp index ff1e7319..a8911e44 100644 --- a/BloomFramework/src/Scenes/SceneManager.cpp +++ b/BloomFramework/src/Scenes/SceneManager.cpp @@ -4,17 +4,23 @@ namespace bloom { inline SceneManager::SceneManager(Game & gameInstance) : m_gameInstance(gameInstance) {} + void SceneManager::changeScene(std::shared_ptr newScene) { - if (m_currScene != nullptr) m_currScene->unload(); + if (m_currScene != nullptr) + m_currScene->unload(); newScene->load(); m_currScene = newScene; } + void SceneManager::update() { - if (m_currScene != nullptr) m_currScene->update(); - else std::cerr << "There is currently no active Scene" << std::endl; + if (m_currScene != nullptr) + m_currScene->update(); + else + std::cerr << "There is no currently active Scene" << std::endl; } + void SceneManager::draw() { if (m_currScene != nullptr) - SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_currScene->getSceneTexture(), NULL, NULL, NULL, NULL, SDL_FLIP_NONE); + SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_currScene->getSceneTexture(), nullptr, nullptr, 0.0, nullptr, SDL_FLIP_NONE); } } diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp index 95cf0f86..11d67104 100644 --- a/BloomFramework/src/Screen.cpp +++ b/BloomFramework/src/Screen.cpp @@ -24,15 +24,16 @@ namespace bloom { sys->update(dt); std::cout << "Delta Time: " << dt << "ms" << std::endl; } + SDL_Renderer * Screen::getGameRenderer(){ return m_gameInstance->getRenderer(); } - void Screen::destroyGameObject(std::string tag) { - m_gameObjects.erase(tag); - } - SDL_Texture *& Screen::getScreenTexture() - { + + SDL_Texture * Screen::getScreenTexture() { return m_screenTexture; } + void Screen::destroyGameObject(const std::string & tag) { + m_gameObjects.erase(tag); + } } \ No newline at end of file diff --git a/Test Bench/TestScreen.h b/Test Bench/TestScreen.h index 74e39192..f3c6ef9a 100644 --- a/Test Bench/TestScreen.h +++ b/Test Bench/TestScreen.h @@ -13,8 +13,8 @@ class TestScreen : public bloom::Scene { void load() override { addGameObject("testSprite", Position( 10,10 ), Size( 128,128 ), "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); - addGameObject("testSprite2", Position(0, 0, relative), Size(128, 128), "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 },2); - addGameObject("testGO", Position(50, 50, relative, (middle|right)), Size(256, 256), "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 },3); + addGameObject("testSprite2", Position(0, 0, relative), Size(128, 128), "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 }, 2); + addGameObject("testGO", Position(50, 50, relative, (middle|right)), Size(256, 256), "Assets/TestChar.png", SDL_Rect{ 64, 96, 32, 32 }, 3); //registerSystem(); registerSystem(); From 919d2e0ea2db25cac468c3bf0a55a0075b0dcbfb Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 2 Nov 2018 23:26:37 +0800 Subject: [PATCH 41/88] Rename variables relating to Screen --- BloomFramework/include/Scenes/Scene.h | 2 +- BloomFramework/include/Systems/DefaultSystem.h | 4 ++-- BloomFramework/include/Systems/RenderSystem.h | 2 +- BloomFramework/src/Systems/DefaultSystem.cpp | 2 +- Test Bench/{TestScreen.h => TestScene.h} | 2 +- Test Bench/main.cpp | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) rename Test Bench/{TestScreen.h => TestScene.h} (95%) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index d420abfe..f3bbf210 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -9,7 +9,7 @@ namespace bloom { class BLOOMFRAMEWORK_API Scene { using System = bloom::systems::System; - friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Scene & screenObject); + friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Scene & sceneObject); public: Scene(SceneManager & sceneManager); diff --git a/BloomFramework/include/Systems/DefaultSystem.h b/BloomFramework/include/Systems/DefaultSystem.h index 6391aee0..8959b8d1 100644 --- a/BloomFramework/include/Systems/DefaultSystem.h +++ b/BloomFramework/include/Systems/DefaultSystem.h @@ -8,12 +8,12 @@ namespace bloom { namespace systems { class BLOOMFRAMEWORK_API DefaultSystem { public: - DefaultSystem(bloom::Scene & screenObject);; + DefaultSystem(bloom::Scene & sceneObject);; virtual void update(std::optional deltaTime = std::nullopt) = 0; protected: - bloom::Scene & parentScreen; + bloom::Scene & parentScene; entt::DefaultRegistry & m_registry; }; diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 7bd25a05..37db2e4c 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -27,7 +27,7 @@ namespace bloom::systems { if (size.h < 0) size.h = 0; - Coord actualPos = pos.getSDLPos(parentScreen.getGameInstance().getRenderer(), size.w, size.h); + Coord actualPos = pos.getSDLPos(parentScene.getGameInstance().getRenderer(), size.w, size.h); SDL_Rect destRect{ static_cast(actualPos.x), static_cast(actualPos.y), diff --git a/BloomFramework/src/Systems/DefaultSystem.cpp b/BloomFramework/src/Systems/DefaultSystem.cpp index 5975453f..84f5ab76 100644 --- a/BloomFramework/src/Systems/DefaultSystem.cpp +++ b/BloomFramework/src/Systems/DefaultSystem.cpp @@ -2,5 +2,5 @@ #include "Scenes/Scene.h" namespace bloom::systems { - DefaultSystem::DefaultSystem(bloom::Scene & screenObject) : parentScreen(screenObject), m_registry(screenObject.m_registry) {} + DefaultSystem::DefaultSystem(bloom::Scene & sceneObject) : parentScene(sceneObject), m_registry(sceneObject.m_registry) {} } \ No newline at end of file diff --git a/Test Bench/TestScreen.h b/Test Bench/TestScene.h similarity index 95% rename from Test Bench/TestScreen.h rename to Test Bench/TestScene.h index f3c6ef9a..fcb4fed7 100644 --- a/Test Bench/TestScreen.h +++ b/Test Bench/TestScene.h @@ -2,7 +2,7 @@ #include "Scenes/Scene.h" #include "GameObjectTest/TestGameObject.h" -class TestScreen : public bloom::Scene { +class TestScene : public bloom::Scene { using RenderSystem = bloom::systems::RenderSystem; using Position = bloom::components::Position; using Size = bloom::components::Size; diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index da3c3298..74abaf56 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -4,7 +4,7 @@ #include "Screen.h" #include "GameObjectTest/TestGameObject.h" #include "GameObjectTest/RandomizerSystem.h" -#include "TestScreen.h" +#include "TestScene.h" using namespace bloom; using bloom::components::Position; @@ -34,7 +34,7 @@ int main() { } game->textures.load("Assets/OverworldTestSpritesheet.png", SDL_Color{ 64, 176, 104, 113 }); game->textures.load("Assets/TestChar.png", SDL_Color{ 144,168,0,0 }); - game->sceneManager.changeScene(std::shared_ptr(new TestScreen(game->sceneManager))); + game->sceneManager.changeScene(std::shared_ptr(new TestScene(game->sceneManager))); srand(static_cast(time(0))); SDL_Color randColor = { static_cast(rand() % 255), static_cast(rand() % 255), From 41aa3f7fec99e9b7cabff929b933f8980be19dfc Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 2 Nov 2018 23:29:21 +0800 Subject: [PATCH 42/88] Remove all code relating to Screen --- BloomFramework/BloomFramework.vcxproj | 2 - BloomFramework/BloomFramework.vcxproj.filters | 6 -- BloomFramework/include/Game.h | 2 - BloomFramework/include/Screen.h | 99 ------------------- BloomFramework/src/Screen.cpp | 39 -------- Test Bench/Test Bench.vcxproj | 2 +- Test Bench/Test Bench.vcxproj.filters | 2 +- Test Bench/main.cpp | 1 - 8 files changed, 2 insertions(+), 151 deletions(-) delete mode 100644 BloomFramework/include/Screen.h delete mode 100644 BloomFramework/src/Screen.cpp diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index c64ed6ce..6cc3f693 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -175,7 +175,6 @@ - @@ -191,7 +190,6 @@ - diff --git a/BloomFramework/BloomFramework.vcxproj.filters b/BloomFramework/BloomFramework.vcxproj.filters index 78084903..d691f411 100644 --- a/BloomFramework/BloomFramework.vcxproj.filters +++ b/BloomFramework/BloomFramework.vcxproj.filters @@ -51,9 +51,6 @@ Source Files\Graphics - - Source Files - Source Files @@ -107,9 +104,6 @@ Header Files\Systems - - Header Files - Header Files\Graphics diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index 764f2e60..16c30b8e 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -3,7 +3,6 @@ #include "stdIncludes.h" #include "Graphics/TextureStore.h" #include "Timer.h" -#include "Screen.h" #include "Exception.h" #include "Scenes/SceneManager.h" @@ -55,6 +54,5 @@ namespace bloom { SDL_Color m_color; SDL_Event m_event; bool m_isRunning; - std::unordered_map m_screens; }; } \ No newline at end of file diff --git a/BloomFramework/include/Screen.h b/BloomFramework/include/Screen.h deleted file mode 100644 index c4af72ad..00000000 --- a/BloomFramework/include/Screen.h +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -#include -#include -#include -#include "stdIncludes.h" -#include "Systems/Systems.h" -#include "GameObject.h" - -namespace bloom { - - class Game; - /* This class serves as a container for GameObjects and Systems meant for a particular purpose. - * - * Add the GameObjects and Systems required in the init() function. - * - */ - class BLOOMFRAMEWORK_API Screen { - using System = bloom::systems::System; - //friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Screen & screenObject); - - public: - Screen(Game * gameInstance); - ~Screen(); - virtual void init() = 0; - void update(); - SDL_Renderer * getGameRenderer(); - SDL_Texture * getScreenTexture(); - - //Game Object stuff - template - void addGameObject(const std::string & tag, TArgs&&... initArgs); - - void destroyGameObject(const std::string & tag); - - // System stuff - template - size_t registerSystem(); - - template - void unregisterSystem(); - - protected: - std::vector> m_systems; - std::unordered_map> m_gameObjects; - entt::DefaultRegistry m_registry; - Game * m_gameInstance; - SDL_Texture * m_screenTexture; - }; - - using ScrPtr = std::shared_ptr; - - //Game Object stuff - - template - void Screen::addGameObject(const std::string & tag, TArgs && ...initArgs) { - static_assert (std::is_base_of_v, "Type GO passed in is not a GameObject."); - - GO* obj = new GO(m_registry, m_gameInstance); - obj->init(std::forward(initArgs)...);; - - m_gameObjects.emplace(tag, std::unique_ptr(obj)); - - //auto & tmp = m_gameObjects[tag]; - //GO* derived = dynamic_cast(tmp.get()); - ////if (derived != nullptr) - // derived->init(std::forward(initArgs)...); - } - - // System stuff - - template - size_t Screen::registerSystem() { - static_assert (std::is_base_of_v, "Type S passed in is not a System."); - if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(S).name()) return true; return false; }); v == m_systems.end()) - { - - m_systems.emplace_back(std::unique_ptr{new S(*this)}); - return (m_systems.size() - 1); - } - else { - std::clog << "This system is already registered." << std::endl; - return (v - m_systems.begin()); - } - } - template - void Screen::unregisterSystem() { - static_assert (std::is_base_of_v, "Type S passed in is not a System."); - if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(S).name()) return true; return false; }); v != m_systems.end()) - { - m_systems.erase(v); - } - else { - std::clog << "Can't unregister system that isn't registered." << std::endl; - } - } -} \ No newline at end of file diff --git a/BloomFramework/src/Screen.cpp b/BloomFramework/src/Screen.cpp deleted file mode 100644 index 11d67104..00000000 --- a/BloomFramework/src/Screen.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "Screen.h" -#include "Game.h" - -namespace bloom { - Screen::Screen(Game * gameInstance) : m_gameInstance(gameInstance) { - m_screenTexture = SDL_CreateTexture(m_gameInstance->getRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, - m_gameInstance->getScreenWidth(), - m_gameInstance->getScreenHeight()); - - SDL_SetTextureBlendMode(m_screenTexture, SDL_BLENDMODE_BLEND); - } - - Screen::~Screen() { - for (auto& gameObj : m_gameObjects) - gameObj.second->~GameObject(); - SDL_DestroyTexture(m_screenTexture); - } - - void Screen::update() { - SDL_SetRenderTarget(m_gameInstance->getRenderer(), m_screenTexture); - SDL_RenderClear(m_gameInstance->getRenderer()); - double dt = m_gameInstance->timer.lap(); - for (auto& sys : m_systems) - sys->update(dt); - std::cout << "Delta Time: " << dt << "ms" << std::endl; - } - - SDL_Renderer * Screen::getGameRenderer(){ - return m_gameInstance->getRenderer(); - } - - SDL_Texture * Screen::getScreenTexture() { - return m_screenTexture; - } - - void Screen::destroyGameObject(const std::string & tag) { - m_gameObjects.erase(tag); - } -} \ No newline at end of file diff --git a/Test Bench/Test Bench.vcxproj b/Test Bench/Test Bench.vcxproj index e2ba22d6..f9c156a4 100644 --- a/Test Bench/Test Bench.vcxproj +++ b/Test Bench/Test Bench.vcxproj @@ -173,7 +173,7 @@ - + diff --git a/Test Bench/Test Bench.vcxproj.filters b/Test Bench/Test Bench.vcxproj.filters index 0beeb13d..aaf295f2 100644 --- a/Test Bench/Test Bench.vcxproj.filters +++ b/Test Bench/Test Bench.vcxproj.filters @@ -40,7 +40,7 @@ Header Files - + Header Files diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index 74abaf56..beac9f21 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -1,7 +1,6 @@ #include "Framework.h" #include -#include "Screen.h" #include "GameObjectTest/TestGameObject.h" #include "GameObjectTest/RandomizerSystem.h" #include "TestScene.h" From 43d984610e5ccbff08a6cdd09a8b7ad657f3d505 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 2 Nov 2018 23:30:44 +0800 Subject: [PATCH 43/88] Use `make_shared` instead of `new` --- Test Bench/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index beac9f21..bc7d62c6 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -33,7 +33,7 @@ int main() { } game->textures.load("Assets/OverworldTestSpritesheet.png", SDL_Color{ 64, 176, 104, 113 }); game->textures.load("Assets/TestChar.png", SDL_Color{ 144,168,0,0 }); - game->sceneManager.changeScene(std::shared_ptr(new TestScene(game->sceneManager))); + game->sceneManager.changeScene(std::make_shared(game->sceneManager)); srand(static_cast(time(0))); SDL_Color randColor = { static_cast(rand() % 255), static_cast(rand() % 255), From 73c14addc82c58d868e0e5deaaad00c3b09ee57e Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 2 Nov 2018 23:34:54 +0800 Subject: [PATCH 44/88] Restore `destroyGameObject()` in `Scene` --- BloomFramework/src/Scenes/Scene.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index e3419f33..d009d806 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -19,5 +19,9 @@ namespace bloom { sys->update(dt); std::clog << "Delta Time: " << dt << "ms" << std::endl; } + + void Scene::destroyGameObject(const std::string & tag) { + m_gameObjects.erase(tag); + } } From 83c8918316161162688552d92dcd8097ccb5a9ab Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 2 Nov 2018 23:40:39 +0800 Subject: [PATCH 45/88] Leave scene drawing to `Scene::draw()` Requiring `SceneManager` to get the `Scene`'s texture is dumb and could be misused. --- BloomFramework/include/Scenes/Scene.h | 5 ++--- BloomFramework/src/Scenes/Scene.cpp | 4 ++++ BloomFramework/src/Scenes/SceneManager.cpp | 4 ++-- Test Bench/TestScene.h | 2 -- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index f3bbf210..9980804c 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -15,17 +15,16 @@ namespace bloom { Scene(SceneManager & sceneManager); void update(); - virtual void draw() = 0; // May not need this since we use a render system on a Texture. + void draw(); virtual void load() = 0; virtual void unload() = 0; - SDL_Texture * getSceneTexture() { return m_sceneTexture; } Game & getGameInstance() { return m_gameInstance; } //Game Object stuff template void addGameObject(const std::string & tag, TArgs &&... initArgs); - //void destroyGameObject(const std::string & tag); + void destroyGameObject(const std::string & tag); // System stuff template diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index d009d806..c48b131e 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -20,6 +20,10 @@ namespace bloom { std::clog << "Delta Time: " << dt << "ms" << std::endl; } + void Scene::draw() { + SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_sceneTexture, nullptr, nullptr, 0.0, nullptr, SDL_FLIP_NONE); + } + void Scene::destroyGameObject(const std::string & tag) { m_gameObjects.erase(tag); } diff --git a/BloomFramework/src/Scenes/SceneManager.cpp b/BloomFramework/src/Scenes/SceneManager.cpp index a8911e44..8ef70993 100644 --- a/BloomFramework/src/Scenes/SceneManager.cpp +++ b/BloomFramework/src/Scenes/SceneManager.cpp @@ -20,7 +20,7 @@ namespace bloom { } void SceneManager::draw() { - if (m_currScene != nullptr) - SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_currScene->getSceneTexture(), nullptr, nullptr, 0.0, nullptr, SDL_FLIP_NONE); + if (m_currScene != nullptr) + m_currScene->draw(); } } diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index fcb4fed7..805a0e48 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -9,8 +9,6 @@ class TestScene : public bloom::Scene { public: using bloom::Scene::Scene; - void draw() override {} - void load() override { addGameObject("testSprite", Position( 10,10 ), Size( 128,128 ), "Assets/OverworldTestSpritesheet.png", SDL_Rect{ 0,0,32,32 }); addGameObject("testSprite2", Position(0, 0, relative), Size(128, 128), "Assets/TestChar.png", SDL_Rect{ 0, 0, 32, 32 }, 2); From 4036db88c7ce4eeb1fdc8e8092c0f6060b6b391a Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 2 Nov 2018 23:54:26 +0800 Subject: [PATCH 46/88] Provide deltaTime as argument for `Scene::update()` Delta Time lapping will be done in `Game::update()` --- BloomFramework/include/Scenes/Scene.h | 3 ++- BloomFramework/include/Scenes/SceneManager.h | 2 +- BloomFramework/src/Game.cpp | 4 +++- BloomFramework/src/Scenes/Scene.cpp | 6 ++---- BloomFramework/src/Scenes/SceneManager.cpp | 4 ++-- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 9980804c..4fae650f 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -11,10 +11,11 @@ namespace bloom { using System = bloom::systems::System; friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Scene & sceneObject); + public: Scene(SceneManager & sceneManager); - void update(); + void update(double deltaTime); void draw(); virtual void load() = 0; virtual void unload() = 0; diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index 015618bd..577b7aa9 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -13,7 +13,7 @@ namespace bloom { SceneManager(Game& gameInstance); void changeScene(std::shared_ptr newScene); - void update(); + void update(double deltaTime); void draw(); const SceneManager * thisPtr = this; diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index 37053447..8f8725ff 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -117,7 +117,9 @@ namespace bloom { } void Game::update() { - sceneManager.update(); + double dt = timer.lap(); + sceneManager.update(dt); + std::clog << "Delta Time: " << dt << "ms" << std::endl; } void Game::clear() { diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index c48b131e..754570a6 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -11,13 +11,11 @@ namespace bloom { SDL_SetTextureBlendMode(m_sceneTexture, SDL_BLENDMODE_BLEND); } - void Scene::update() { + void Scene::update(double deltaTime) { SDL_SetRenderTarget(m_gameInstance.getRenderer(), m_sceneTexture); SDL_RenderClear(m_gameInstance.getRenderer()); - double dt = m_gameInstance.timer.lap(); for (auto & sys : m_systems) - sys->update(dt); - std::clog << "Delta Time: " << dt << "ms" << std::endl; + sys->update(deltaTime); } void Scene::draw() { diff --git a/BloomFramework/src/Scenes/SceneManager.cpp b/BloomFramework/src/Scenes/SceneManager.cpp index 8ef70993..a1202d92 100644 --- a/BloomFramework/src/Scenes/SceneManager.cpp +++ b/BloomFramework/src/Scenes/SceneManager.cpp @@ -12,9 +12,9 @@ namespace bloom { m_currScene = newScene; } - void SceneManager::update() { + void SceneManager::update(double deltaTime) { if (m_currScene != nullptr) - m_currScene->update(); + m_currScene->update(deltaTime); else std::cerr << "There is no currently active Scene" << std::endl; } From f50038b8d02c1cd016fd815c5ff1d282ee7eb376 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 10 Nov 2018 14:25:12 +0800 Subject: [PATCH 47/88] Fix wrong type on Coord forward declare --- BloomFramework/include/Scenes/Scene.h | 1 + 1 file changed, 1 insertion(+) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 4fae650f..eab2c348 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -6,6 +6,7 @@ namespace bloom { class SceneManager; + struct Coord; class BLOOMFRAMEWORK_API Scene { using System = bloom::systems::System; From 1f34e49a4aad7dc516f7e770deced851833c3bb3 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 10 Nov 2018 14:32:56 +0800 Subject: [PATCH 48/88] Add ability to change `Scene` rotate angle Also added a new system in TestBench to rotate the scene. Not sure about the practical use case of this though... --- BloomFramework/include/Scenes/Scene.h | 17 +++++++++++------ BloomFramework/src/Scenes/Scene.cpp | 11 ++++++++++- Test Bench/GameObjectTest/SceneRotateSystem.h | 13 +++++++++++++ Test Bench/Test Bench.vcxproj | 1 + Test Bench/Test Bench.vcxproj.filters | 3 +++ Test Bench/TestScene.h | 2 ++ 6 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 Test Bench/GameObjectTest/SceneRotateSystem.h diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index eab2c348..70f39ce6 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -11,8 +11,8 @@ namespace bloom { class BLOOMFRAMEWORK_API Scene { using System = bloom::systems::System; friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Scene & sceneObject); - - + + public: Scene(SceneManager & sceneManager); @@ -23,18 +23,21 @@ namespace bloom { Game & getGameInstance() { return m_gameInstance; } //Game Object stuff - template + template void addGameObject(const std::string & tag, TArgs &&... initArgs); void destroyGameObject(const std::string & tag); - + // System stuff - template + template size_t registerSystem(); - template + template void unregisterSystem(); + void setSceneRotation(double angle); + void adjustSceneRotation(double adjustment); + protected: SceneManager & m_sceneManager; Game & m_gameInstance; @@ -42,6 +45,8 @@ namespace bloom { std::vector> m_systems; std::unordered_map> m_gameObjects; SDL_Texture * m_sceneTexture; + + double m_sceneRotateAngle = 0.0; }; template void Scene::addGameObject(const std::string & tag, TArgs &&... initArgs) { diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index 754570a6..32cd16ac 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -19,11 +19,20 @@ namespace bloom { } void Scene::draw() { - SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_sceneTexture, nullptr, nullptr, 0.0, nullptr, SDL_FLIP_NONE); +// SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_sceneTexture, nullptr, nullptr, 0.0, nullptr, SDL_FLIP_NONE); + SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_sceneTexture, nullptr, nullptr, m_sceneRotateAngle, nullptr, SDL_FLIP_NONE); } void Scene::destroyGameObject(const std::string & tag) { m_gameObjects.erase(tag); } + void Scene::setSceneRotation(double angle){ + m_sceneRotateAngle = fmod(angle, 360.0); + } + + void Scene::adjustSceneRotation(double adjustment){ + m_sceneRotateAngle = fmod((m_sceneRotateAngle + adjustment), 360.0); + } + } diff --git a/Test Bench/GameObjectTest/SceneRotateSystem.h b/Test Bench/GameObjectTest/SceneRotateSystem.h new file mode 100644 index 00000000..ced5b9ba --- /dev/null +++ b/Test Bench/GameObjectTest/SceneRotateSystem.h @@ -0,0 +1,13 @@ +#pragma once +#include "Framework.h" + +class SceneRotateSystem : public bloom::systems::System { + using Position = bloom::components::Position; + using bloom::systems::System::DefaultSystem; + +public: + void update(std::optional deltaTime = std::nullopt) override { + auto adjustValue = 60.0 * (deltaTime.value() / 1000); + parentScene.adjustSceneRotation(adjustValue); + } +}; \ No newline at end of file diff --git a/Test Bench/Test Bench.vcxproj b/Test Bench/Test Bench.vcxproj index 5009b4bf..ed417b14 100644 --- a/Test Bench/Test Bench.vcxproj +++ b/Test Bench/Test Bench.vcxproj @@ -195,6 +195,7 @@ + diff --git a/Test Bench/Test Bench.vcxproj.filters b/Test Bench/Test Bench.vcxproj.filters index 3a302e15..8c17b6c0 100644 --- a/Test Bench/Test Bench.vcxproj.filters +++ b/Test Bench/Test Bench.vcxproj.filters @@ -49,5 +49,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index 7b2c791b..8ff14bf6 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -1,6 +1,7 @@ #pragma once #include "Scenes/Scene.h" #include "GameObjectTest/TestGameObject.h" +#include "GameObjectTest/SceneRotateSystem.h" class TestScene : public bloom::Scene { using RenderSystem = bloom::systems::RenderSystem; @@ -22,6 +23,7 @@ class TestScene : public bloom::Scene { //registerSystem(); registerSystem(); + registerSystem(); } void unload() override {} From b3739797a9707a5a16a21602dd338c14f8a1404c Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 10 Nov 2018 14:43:21 +0800 Subject: [PATCH 49/88] For some reason I keep disabling the randomizer without realising --- Test Bench/TestScene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index 8ff14bf6..78fbce03 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -21,7 +21,7 @@ class TestScene : public bloom::Scene { addGameObject("testSprite2", Position(0, 0, relative), Size(128, 128), testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); addGameObject("testGO", Position(50, 50, relative, (middle|right)), Size(256, 256), testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); - //registerSystem(); + registerSystem(); registerSystem(); registerSystem(); } From d093727759bfc6a7eb94e09c97e4776918a7ef67 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 10 Nov 2018 15:00:27 +0800 Subject: [PATCH 50/88] Add ability to change center of rotation --- BloomFramework/include/Coord.h | 1 + BloomFramework/include/Scenes/Scene.h | 4 ++++ BloomFramework/src/Coord.cpp | 4 ++++ BloomFramework/src/Scenes/Scene.cpp | 21 ++++++++++++++++----- Test Bench/TestScene.h | 2 +- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/BloomFramework/include/Coord.h b/BloomFramework/include/Coord.h index fc8142cb..9165760d 100644 --- a/BloomFramework/include/Coord.h +++ b/BloomFramework/include/Coord.h @@ -31,5 +31,6 @@ namespace bloom { Coord(int x, int y, CoordType type = absolute, int direction = top | left); Coord getSDLPos(SDL_Renderer * targetRenderer, int width, int height); + SDL_Point toSDLPoint(SDL_Renderer * targetRenderer); }; } \ No newline at end of file diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 70f39ce6..3f720db3 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -35,8 +35,11 @@ namespace bloom { template void unregisterSystem(); + // Rotation stuff void setSceneRotation(double angle); void adjustSceneRotation(double adjustment); + void setSceneRotationCenter(Coord center); + void setSceneRotationCenter(SDL_Point center); protected: SceneManager & m_sceneManager; @@ -47,6 +50,7 @@ namespace bloom { SDL_Texture * m_sceneTexture; double m_sceneRotateAngle = 0.0; + SDL_Point m_sceneRotateCenter; }; template void Scene::addGameObject(const std::string & tag, TArgs &&... initArgs) { diff --git a/BloomFramework/src/Coord.cpp b/BloomFramework/src/Coord.cpp index 0dbe74a6..4410eec6 100644 --- a/BloomFramework/src/Coord.cpp +++ b/BloomFramework/src/Coord.cpp @@ -40,4 +40,8 @@ namespace bloom { return result; } + SDL_Point Coord::toSDLPoint(SDL_Renderer * targetRenderer){ + auto tmp = getSDLPos(targetRenderer, 0, 0); + return SDL_Point{ tmp.x, tmp.y }; + } } \ No newline at end of file diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index 32cd16ac..ba2e22e6 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -3,7 +3,11 @@ #include "Game.h" namespace bloom { - Scene::Scene(SceneManager & sceneManager) : m_sceneManager(sceneManager), m_gameInstance(sceneManager.m_gameInstance) { + Scene::Scene(SceneManager & sceneManager) : + m_sceneManager(sceneManager), + m_gameInstance(sceneManager.m_gameInstance), + m_sceneRotateCenter(Coord().toSDLPoint(m_gameInstance.getRenderer())) + { m_sceneTexture = SDL_CreateTexture(m_gameInstance.getRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, m_gameInstance.getScreenWidth(), m_gameInstance.getScreenHeight()); @@ -19,20 +23,27 @@ namespace bloom { } void Scene::draw() { -// SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_sceneTexture, nullptr, nullptr, 0.0, nullptr, SDL_FLIP_NONE); - SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_sceneTexture, nullptr, nullptr, m_sceneRotateAngle, nullptr, SDL_FLIP_NONE); + SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_sceneTexture, nullptr, nullptr, m_sceneRotateAngle, &m_sceneRotateCenter, SDL_FLIP_NONE); } void Scene::destroyGameObject(const std::string & tag) { m_gameObjects.erase(tag); } - void Scene::setSceneRotation(double angle){ + void Scene::setSceneRotation(double angle) { m_sceneRotateAngle = fmod(angle, 360.0); } - void Scene::adjustSceneRotation(double adjustment){ + void Scene::adjustSceneRotation(double adjustment) { m_sceneRotateAngle = fmod((m_sceneRotateAngle + adjustment), 360.0); } + void Scene::setSceneRotationCenter(Coord center) { + m_sceneRotateCenter = center.toSDLPoint(m_gameInstance.getRenderer()); + } + + void Scene::setSceneRotationCenter(SDL_Point center) { + m_sceneRotateCenter = center; + } + } diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index 78fbce03..63d6b539 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -23,7 +23,7 @@ class TestScene : public bloom::Scene { registerSystem(); registerSystem(); - registerSystem(); + registerSystem(); // Do barrel rolls!!! } void unload() override {} From d933ece4967fe78bea068582e107112eb7b3b479 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 10 Nov 2018 15:09:43 +0800 Subject: [PATCH 51/88] Allow sprites to be rotated as well No setting the rotation center though. --- BloomFramework/include/Components/Sprite.h | 1 + BloomFramework/include/Graphics/Texture.h | 2 +- BloomFramework/include/Systems/RenderSystem.h | 2 +- BloomFramework/src/Graphics/Texture.cpp | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/BloomFramework/include/Components/Sprite.h b/BloomFramework/include/Components/Sprite.h index a02fdbee..f3b00fd0 100644 --- a/BloomFramework/include/Components/Sprite.h +++ b/BloomFramework/include/Components/Sprite.h @@ -11,5 +11,6 @@ namespace bloom::components { TexturePtr texture; std::optional srcRect; + double rotation = 0.0; }; } \ No newline at end of file diff --git a/BloomFramework/include/Graphics/Texture.h b/BloomFramework/include/Graphics/Texture.h index b4df629e..2e6c7269 100644 --- a/BloomFramework/include/Graphics/Texture.h +++ b/BloomFramework/include/Graphics/Texture.h @@ -9,7 +9,7 @@ namespace bloom::graphics { explicit Texture(SDL_Renderer *& targetRenderer, const std::filesystem::path & filePath, std::optional colorKey = std::nullopt); ~Texture(); - void render(std::optional srcRect, SDL_Rect destRect, SDL_RendererFlip flip = SDL_FLIP_NONE); + void render(std::optional srcRect, SDL_Rect destRect, double rotation = 0.0, SDL_RendererFlip flip = SDL_FLIP_NONE); private: SDL_Texture * m_texture; diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 37db2e4c..d7a8add0 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -54,7 +54,7 @@ namespace bloom::systems { for (auto i : renderQueue) { auto & spr = std::get<0>(i); auto & destRect = std::get<1>(i); - spr.texture->render(spr.srcRect, destRect); + spr.texture->render(spr.srcRect, destRect, spr.rotation); } } diff --git a/BloomFramework/src/Graphics/Texture.cpp b/BloomFramework/src/Graphics/Texture.cpp index f29b0b33..2b4314db 100644 --- a/BloomFramework/src/Graphics/Texture.cpp +++ b/BloomFramework/src/Graphics/Texture.cpp @@ -20,7 +20,7 @@ namespace bloom::graphics { } } - void Texture::render(std::optional srcRect, SDL_Rect destRect, SDL_RendererFlip flip) { + void Texture::render(std::optional srcRect, SDL_Rect destRect, double rotation, SDL_RendererFlip flip) { if (destRect.w <= 0) throw Exception("[Texture::render] destcRect.w is <= 0.\nIs that intentional?"); if (destRect.h <= 0) @@ -36,7 +36,7 @@ namespace bloom::graphics { //SDL_Rect renderQuad = { xPos, yPos, _textureWidth*_scale, _textureHeight*_scale }; //Render to screen - SDL_RenderCopyEx(m_renderer, m_texture, &srcRect.value(), &destRect, 0.0, nullptr, flip); + SDL_RenderCopyEx(m_renderer, m_texture, &srcRect.value(), &destRect, rotation, nullptr, flip); } else //Render to screen From a6ca91d4faa0c9500cf68ded36020968be1e468a Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 10 Nov 2018 16:06:37 +0800 Subject: [PATCH 52/88] Add Sprite Rotator system --- Test Bench/GameObjectTest/SceneRotateSystem.h | 5 ++++- .../GameObjectTest/SpriteRotatorSystem.h | 19 +++++++++++++++++++ Test Bench/Test Bench.vcxproj | 1 + Test Bench/Test Bench.vcxproj.filters | 3 +++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 Test Bench/GameObjectTest/SpriteRotatorSystem.h diff --git a/Test Bench/GameObjectTest/SceneRotateSystem.h b/Test Bench/GameObjectTest/SceneRotateSystem.h index ced5b9ba..ac59002b 100644 --- a/Test Bench/GameObjectTest/SceneRotateSystem.h +++ b/Test Bench/GameObjectTest/SceneRotateSystem.h @@ -7,7 +7,10 @@ class SceneRotateSystem : public bloom::systems::System { public: void update(std::optional deltaTime = std::nullopt) override { - auto adjustValue = 60.0 * (deltaTime.value() / 1000); + auto adjustValue = rotateSpeed * (deltaTime.value() / 1000); parentScene.adjustSceneRotation(adjustValue); } + +private: + double rotateSpeed = static_cast(rand() % 360); }; \ No newline at end of file diff --git a/Test Bench/GameObjectTest/SpriteRotatorSystem.h b/Test Bench/GameObjectTest/SpriteRotatorSystem.h new file mode 100644 index 00000000..70148d9a --- /dev/null +++ b/Test Bench/GameObjectTest/SpriteRotatorSystem.h @@ -0,0 +1,19 @@ +#pragma once +#include "Framework.h" + +class SpriteRotatorSystem : public bloom::systems::System { + using Sprite = bloom::components::Sprite; + using bloom::systems::System::DefaultSystem; + +public: + void update(std::optional deltaTime = std::nullopt) override { + m_registry.view().each( + [&](auto entity, Sprite & spr) { + auto adjustAmount = rotateSpeed * (deltaTime.value() / 1000); + spr.rotation = fmod(spr.rotation + adjustAmount, 360); + }); + } + +private: + double rotateSpeed = static_cast(rand() % 360); +}; \ No newline at end of file diff --git a/Test Bench/Test Bench.vcxproj b/Test Bench/Test Bench.vcxproj index ed417b14..e0f83e2e 100644 --- a/Test Bench/Test Bench.vcxproj +++ b/Test Bench/Test Bench.vcxproj @@ -196,6 +196,7 @@ + diff --git a/Test Bench/Test Bench.vcxproj.filters b/Test Bench/Test Bench.vcxproj.filters index 8c17b6c0..410a9a92 100644 --- a/Test Bench/Test Bench.vcxproj.filters +++ b/Test Bench/Test Bench.vcxproj.filters @@ -52,5 +52,8 @@ Header Files + + Header Files + \ No newline at end of file From 47b7b236bac043483eba3ccc6ca0aba222f0c3c7 Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Sat, 10 Nov 2018 12:19:36 +0300 Subject: [PATCH 53/88] Update sdl2-nuget packages (#20) Updated `sdl2.nuget` to 2.0.9 and `sdl2_image.nuget` and `sdl2_mixer.nuget` to 2.0.4 --- BloomFramework/BloomFramework.vcxproj | 24 ++++++++++++------------ BloomFramework/packages.config | 12 ++++++------ Test Bench/Test Bench.vcxproj | 24 ++++++++++++------------ Test Bench/packages.config | 12 ++++++------ 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index 6cc3f693..6aaed89a 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -197,26 +197,26 @@ - - - - - - + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - + + + + + + \ No newline at end of file diff --git a/BloomFramework/packages.config b/BloomFramework/packages.config index db3479ad..cee9291c 100644 --- a/BloomFramework/packages.config +++ b/BloomFramework/packages.config @@ -1,11 +1,11 @@  - - - - - - + + + + + + \ No newline at end of file diff --git a/Test Bench/Test Bench.vcxproj b/Test Bench/Test Bench.vcxproj index e0f83e2e..532d231d 100644 --- a/Test Bench/Test Bench.vcxproj +++ b/Test Bench/Test Bench.vcxproj @@ -203,26 +203,26 @@ - - - - - - + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - + + + + + + \ No newline at end of file diff --git a/Test Bench/packages.config b/Test Bench/packages.config index db3479ad..cee9291c 100644 --- a/Test Bench/packages.config +++ b/Test Bench/packages.config @@ -1,11 +1,11 @@  - - - - - - + + + + + + \ No newline at end of file From d018b03b7dabcef7c0014294ad15268c33f35f04 Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Tue, 13 Nov 2018 12:59:49 +0300 Subject: [PATCH 54/88] Some optimizations and improvements - [Components/Sprite, Graphics/Texture] rename `rotation` to `rotationAngle` - [Coord] merge `VerticalPosition` and `HorizontalPosition` to `Positions` - [Coord] move `CoordType` and `Positions` to `bloom` namespace - [Coord::Coord] add ctor for `SDL_Point` - [Scenes/Scene] fix and simplify comparison of types in `registerSystem` and `unregisterSystem` - [Scenes/Scene] make dtor as virtual - [Scenes/SceneManager] removed unnecessary `Scene` declaration - [Scenes/SceneManager::changeScene] make this function as template - [Systems/DefaultSystem] rename `System` to `DefaultSystem` and `DefaultSystem` to `System` - [TestScene] add dtor - [TestScene] disable `RandomPositionSystem` - [TestScene] add `unload` func - formatting --- BloomFramework/include/Components/Sprite.h | 2 +- BloomFramework/include/Coord.h | 31 +++++++++---------- BloomFramework/include/Game.h | 2 +- BloomFramework/include/Graphics/Texture.h | 2 +- BloomFramework/include/Scenes/Scene.h | 17 +++++----- BloomFramework/include/Scenes/SceneManager.h | 16 ++++++++-- .../include/Systems/DefaultSystem.h | 7 +++-- BloomFramework/include/Systems/RenderSystem.h | 11 ++++--- BloomFramework/src/Coord.cpp | 19 +++++++----- BloomFramework/src/Game.cpp | 3 +- BloomFramework/src/GameObject.cpp | 2 +- BloomFramework/src/Graphics/Texture.cpp | 4 +-- BloomFramework/src/Scenes/SceneManager.cpp | 7 ----- BloomFramework/src/Systems/DefaultSystem.cpp | 2 +- Test Bench/GameObjectTest/RandomizerSystem.h | 6 ++-- Test Bench/GameObjectTest/SceneRotateSystem.h | 6 ++-- .../GameObjectTest/SpriteRotatorSystem.h | 8 +++-- Test Bench/TestScene.h | 22 ++++++++++--- Test Bench/main.cpp | 1 + 19 files changed, 97 insertions(+), 71 deletions(-) diff --git a/BloomFramework/include/Components/Sprite.h b/BloomFramework/include/Components/Sprite.h index f3b00fd0..d91e1ed9 100644 --- a/BloomFramework/include/Components/Sprite.h +++ b/BloomFramework/include/Components/Sprite.h @@ -11,6 +11,6 @@ namespace bloom::components { TexturePtr texture; std::optional srcRect; - double rotation = 0.0; + double rotationAngle = 0.0; }; } \ No newline at end of file diff --git a/BloomFramework/include/Coord.h b/BloomFramework/include/Coord.h index 9165760d..8ef0fb29 100644 --- a/BloomFramework/include/Coord.h +++ b/BloomFramework/include/Coord.h @@ -1,26 +1,22 @@ #pragma once #include "stdIncludes.h" +namespace bloom { + enum CoordType { + absolute, + relative + }; -enum CoordType { - absolute, - relative -}; - -enum VerticalPosition { - top = 1, - middle = 2, - bottom = 4, -}; - -enum HorizontalPosition { - left = 8, - center = 16, - right = 32 -}; + enum Positions { + top = 1, + middle = 2, + bottom = 4, + left = 8, + center = 16, + right = 32 + }; -namespace bloom { struct BLOOMFRAMEWORK_API Coord { public: int x, y; @@ -29,6 +25,7 @@ namespace bloom { Coord(); Coord(const Coord & other) = default; Coord(int x, int y, CoordType type = absolute, int direction = top | left); + Coord(const SDL_Point & point); Coord getSDLPos(SDL_Renderer * targetRenderer, int width, int height); SDL_Point toSDLPoint(SDL_Renderer * targetRenderer); diff --git a/BloomFramework/include/Game.h b/BloomFramework/include/Game.h index 16c30b8e..13ee56db 100644 --- a/BloomFramework/include/Game.h +++ b/BloomFramework/include/Game.h @@ -43,7 +43,7 @@ namespace bloom { TextureStore textures = TextureStore(m_renderer); Timer timer; - + SceneManager sceneManager = SceneManager(*this); protected: diff --git a/BloomFramework/include/Graphics/Texture.h b/BloomFramework/include/Graphics/Texture.h index 2e6c7269..2a927f6b 100644 --- a/BloomFramework/include/Graphics/Texture.h +++ b/BloomFramework/include/Graphics/Texture.h @@ -9,7 +9,7 @@ namespace bloom::graphics { explicit Texture(SDL_Renderer *& targetRenderer, const std::filesystem::path & filePath, std::optional colorKey = std::nullopt); ~Texture(); - void render(std::optional srcRect, SDL_Rect destRect, double rotation = 0.0, SDL_RendererFlip flip = SDL_FLIP_NONE); + void render(std::optional srcRect, SDL_Rect destRect, double rotationAngle = 0.0, SDL_RendererFlip flip = SDL_FLIP_NONE); private: SDL_Texture * m_texture; diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 3f720db3..707a638b 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -9,12 +9,12 @@ namespace bloom { struct Coord; class BLOOMFRAMEWORK_API Scene { - using System = bloom::systems::System; - friend bloom::systems::DefaultSystem::DefaultSystem(bloom::Scene & sceneObject); - + using System = bloom::systems::DefaultSystem; + friend bloom::systems::System::System(bloom::Scene & sceneObject); public: Scene(SceneManager & sceneManager); + virtual ~Scene() = default; void update(double deltaTime); void draw(); @@ -54,7 +54,7 @@ namespace bloom { }; template void Scene::addGameObject(const std::string & tag, TArgs &&... initArgs) { - static_assert(std::is_base_of_v, "Type GO passed in is not a GameObject."); + static_assert(std::is_base_of_v, "Type GO passed in is not a GameObject based"); GO* obj = new GO(m_registry, m_gameInstance); obj->init(std::forward(initArgs)...); @@ -69,9 +69,9 @@ namespace bloom { // System stuff template size_t Scene::registerSystem() { - static_assert (std::is_base_of_v, "Type S passed in is not a System."); + static_assert (std::is_base_of_v, "Type S passed in is not a System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(S).name()) return true; return false; }); + [](auto & i) -> bool { return (std::strcmp(typeid(*i).name(), typeid(S).name()) == 0); }); v == m_systems.end()) { m_systems.emplace_back(std::unique_ptr(new S(*this))); @@ -82,10 +82,11 @@ namespace bloom { return (v - m_systems.begin()); } } + template void Scene::unregisterSystem() { - static_assert (std::is_base_of_v, "Type S passed in is not a System."); + static_assert (std::is_base_of_v, "Type S passed in is not a System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool {if (typeid(*i).name() == typeid(S).name()) return true; return false; }); + [](auto & i) -> bool { return (std::strcmp(typeid(*i).name(), typeid(S).name()) == 0); }); v != m_systems.end()) { m_systems.erase(v); diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index 577b7aa9..874f1629 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -4,7 +4,7 @@ #include "Scene.h" namespace bloom { - class Game; class Scene; + class Game; class BLOOMFRAMEWORK_API SceneManager { friend Scene::Scene(SceneManager & sceneManager); @@ -12,14 +12,24 @@ namespace bloom { public: SceneManager(Game& gameInstance); - void changeScene(std::shared_ptr newScene); + template void changeScene(std::shared_ptr newScene); void update(double deltaTime); void draw(); - + const SceneManager * thisPtr = this; private: std::shared_ptr m_currScene; Game & m_gameInstance; }; + + template + void SceneManager::changeScene(std::shared_ptr newScene) { + static_assert(std::is_base_of_v, "Type Scn passed in is not a Scene based"); + + if (m_currScene != nullptr) + m_currScene->unload(); + newScene->load(); + m_currScene = newScene; + } } \ No newline at end of file diff --git a/BloomFramework/include/Systems/DefaultSystem.h b/BloomFramework/include/Systems/DefaultSystem.h index 8959b8d1..7f23bb56 100644 --- a/BloomFramework/include/Systems/DefaultSystem.h +++ b/BloomFramework/include/Systems/DefaultSystem.h @@ -6,9 +6,10 @@ namespace bloom { class Scene; namespace systems { - class BLOOMFRAMEWORK_API DefaultSystem { + class BLOOMFRAMEWORK_API System { public: - DefaultSystem(bloom::Scene & sceneObject);; + System(bloom::Scene & sceneObject); + virtual ~System() = default; virtual void update(std::optional deltaTime = std::nullopt) = 0; @@ -17,6 +18,6 @@ namespace bloom { entt::DefaultRegistry & m_registry; }; - using System = DefaultSystem; + using DefaultSystem = System; } } \ No newline at end of file diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index d7a8add0..3c11f7b4 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -1,27 +1,28 @@ #pragma once +#include #include "stdIncludes.h" #include "Components/Components.h" #include "DefaultSystem.h" #include "Components/Components.h" -#include namespace bloom::systems { - class RenderSystem : public System { + class RenderSystem : public DefaultSystem { using Position = bloom::components::Position; using Size = bloom::components::Size; using Sprite = bloom::components::Sprite; using LayerGroup = bloom::components::LayerGroup; - using System::DefaultSystem; + using DefaultSystem::System; public: + ~RenderSystem() = default; void update(std::optional deltaTime = std::nullopt) override { std::vector> renderQueue{}; m_registry.view().each( [&](auto entity, Position & pos, Size& size, Sprite & spr) { - + if (size.w < 0) size.w = 0; if (size.h < 0) @@ -54,7 +55,7 @@ namespace bloom::systems { for (auto i : renderQueue) { auto & spr = std::get<0>(i); auto & destRect = std::get<1>(i); - spr.texture->render(spr.srcRect, destRect, spr.rotation); + spr.texture->render(spr.srcRect, destRect, spr.rotationAngle); } } diff --git a/BloomFramework/src/Coord.cpp b/BloomFramework/src/Coord.cpp index 4410eec6..94cb4dbb 100644 --- a/BloomFramework/src/Coord.cpp +++ b/BloomFramework/src/Coord.cpp @@ -4,10 +4,12 @@ namespace bloom { Coord::Coord() : x(0), y(0), relativeTo(middle | center) {} Coord::Coord(int x, int y, CoordType type, int direction) : x(x), y(y), relativeTo(direction) { - if (type == absolute) + if (type == absolute) this->relativeTo = (middle | center); } + Coord::Coord(const SDL_Point & point) : x(point.x), y(point.y), relativeTo(middle | center) {} + Coord Coord::getSDLPos(SDL_Renderer * targetRenderer, int width, int height) { int rendererWidth, rendererHeight; SDL_RenderGetLogicalSize(targetRenderer, &rendererWidth, &rendererHeight); @@ -19,28 +21,29 @@ namespace bloom { height = 0; // Get SDL style X position, factoring object width as well. - if ((relativeTo & left) == left) + if ((relativeTo & left) == left) result.x = x; - else if ((relativeTo & center) == center) + else if ((relativeTo & center) == center) result.x = rendererWidth / 2 - width / 2 + x; - else if ((relativeTo & right) == right) + else if ((relativeTo & right) == right) result.x = rendererWidth - width - x; - else + else result.x = x; // Get SDL style Y position, factoring object height as well. if ((relativeTo & top) == top) result.y = y; - else if ((relativeTo & middle) == middle) + else if ((relativeTo & middle) == middle) result.y = rendererHeight / 2 - height / 2 - y; - else if ((relativeTo & bottom) == bottom) + else if ((relativeTo & bottom) == bottom) result.y = rendererHeight - height - y; else result.y = y; return result; } - SDL_Point Coord::toSDLPoint(SDL_Renderer * targetRenderer){ + + SDL_Point Coord::toSDLPoint(SDL_Renderer * targetRenderer) { auto tmp = getSDLPos(targetRenderer, 0, 0); return SDL_Point{ tmp.x, tmp.y }; } diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index 8f8725ff..f21379cc 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -178,7 +178,8 @@ namespace bloom { SDL_Event Game::getEvent() { return m_event; } - SDL_Renderer * Game::getRenderer(){ + + SDL_Renderer * Game::getRenderer() { return m_renderer; } } \ No newline at end of file diff --git a/BloomFramework/src/GameObject.cpp b/BloomFramework/src/GameObject.cpp index 82240d38..ce96c02a 100644 --- a/BloomFramework/src/GameObject.cpp +++ b/BloomFramework/src/GameObject.cpp @@ -7,7 +7,7 @@ namespace bloom { } GameObject::~GameObject() { - if(m_registry.valid(m_entity)) + if (m_registry.valid(m_entity)) m_registry.destroy(m_entity); } diff --git a/BloomFramework/src/Graphics/Texture.cpp b/BloomFramework/src/Graphics/Texture.cpp index 2b4314db..a9163db7 100644 --- a/BloomFramework/src/Graphics/Texture.cpp +++ b/BloomFramework/src/Graphics/Texture.cpp @@ -20,7 +20,7 @@ namespace bloom::graphics { } } - void Texture::render(std::optional srcRect, SDL_Rect destRect, double rotation, SDL_RendererFlip flip) { + void Texture::render(std::optional srcRect, SDL_Rect destRect, double rotationAngle, SDL_RendererFlip flip) { if (destRect.w <= 0) throw Exception("[Texture::render] destcRect.w is <= 0.\nIs that intentional?"); if (destRect.h <= 0) @@ -36,7 +36,7 @@ namespace bloom::graphics { //SDL_Rect renderQuad = { xPos, yPos, _textureWidth*_scale, _textureHeight*_scale }; //Render to screen - SDL_RenderCopyEx(m_renderer, m_texture, &srcRect.value(), &destRect, rotation, nullptr, flip); + SDL_RenderCopyEx(m_renderer, m_texture, &srcRect.value(), &destRect, rotationAngle, nullptr, flip); } else //Render to screen diff --git a/BloomFramework/src/Scenes/SceneManager.cpp b/BloomFramework/src/Scenes/SceneManager.cpp index a1202d92..604680bb 100644 --- a/BloomFramework/src/Scenes/SceneManager.cpp +++ b/BloomFramework/src/Scenes/SceneManager.cpp @@ -5,13 +5,6 @@ namespace bloom { inline SceneManager::SceneManager(Game & gameInstance) : m_gameInstance(gameInstance) {} - void SceneManager::changeScene(std::shared_ptr newScene) { - if (m_currScene != nullptr) - m_currScene->unload(); - newScene->load(); - m_currScene = newScene; - } - void SceneManager::update(double deltaTime) { if (m_currScene != nullptr) m_currScene->update(deltaTime); diff --git a/BloomFramework/src/Systems/DefaultSystem.cpp b/BloomFramework/src/Systems/DefaultSystem.cpp index 84f5ab76..65da4b0e 100644 --- a/BloomFramework/src/Systems/DefaultSystem.cpp +++ b/BloomFramework/src/Systems/DefaultSystem.cpp @@ -2,5 +2,5 @@ #include "Scenes/Scene.h" namespace bloom::systems { - DefaultSystem::DefaultSystem(bloom::Scene & sceneObject) : parentScene(sceneObject), m_registry(sceneObject.m_registry) {} + System::System(bloom::Scene & sceneObject) : parentScene(sceneObject), m_registry(sceneObject.m_registry) {} } \ No newline at end of file diff --git a/Test Bench/GameObjectTest/RandomizerSystem.h b/Test Bench/GameObjectTest/RandomizerSystem.h index 5055265f..20384039 100644 --- a/Test Bench/GameObjectTest/RandomizerSystem.h +++ b/Test Bench/GameObjectTest/RandomizerSystem.h @@ -3,11 +3,13 @@ #include "Framework.h" #include "NoRandomComponent.h" -class RandomPositionSystem : public bloom::systems::System { +class RandomPositionSystem : public bloom::systems::DefaultSystem { using Position = bloom::components::Position; - using bloom::systems::System::DefaultSystem; + using bloom::systems::DefaultSystem::System; public: + ~RandomPositionSystem() = default; + void update(std::optional deltaTime = std::nullopt) override { m_registry.view().each( [this](auto entity, Position & pos) { diff --git a/Test Bench/GameObjectTest/SceneRotateSystem.h b/Test Bench/GameObjectTest/SceneRotateSystem.h index ac59002b..e83ff4c3 100644 --- a/Test Bench/GameObjectTest/SceneRotateSystem.h +++ b/Test Bench/GameObjectTest/SceneRotateSystem.h @@ -1,11 +1,13 @@ #pragma once #include "Framework.h" -class SceneRotateSystem : public bloom::systems::System { +class SceneRotateSystem : public bloom::systems::DefaultSystem { using Position = bloom::components::Position; - using bloom::systems::System::DefaultSystem; + using bloom::systems::DefaultSystem::System; public: + ~SceneRotateSystem() = default; + void update(std::optional deltaTime = std::nullopt) override { auto adjustValue = rotateSpeed * (deltaTime.value() / 1000); parentScene.adjustSceneRotation(adjustValue); diff --git a/Test Bench/GameObjectTest/SpriteRotatorSystem.h b/Test Bench/GameObjectTest/SpriteRotatorSystem.h index 70148d9a..8c35d355 100644 --- a/Test Bench/GameObjectTest/SpriteRotatorSystem.h +++ b/Test Bench/GameObjectTest/SpriteRotatorSystem.h @@ -1,16 +1,18 @@ #pragma once #include "Framework.h" -class SpriteRotatorSystem : public bloom::systems::System { +class SpriteRotatorSystem : public bloom::systems::DefaultSystem { using Sprite = bloom::components::Sprite; - using bloom::systems::System::DefaultSystem; + using bloom::systems::DefaultSystem::System; public: + ~SpriteRotatorSystem() = default; + void update(std::optional deltaTime = std::nullopt) override { m_registry.view().each( [&](auto entity, Sprite & spr) { auto adjustAmount = rotateSpeed * (deltaTime.value() / 1000); - spr.rotation = fmod(spr.rotation + adjustAmount, 360); + spr.rotationAngle = fmod(spr.rotationAngle + adjustAmount, 360); }); } diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index 63d6b539..f7c68354 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -7,9 +7,14 @@ class TestScene : public bloom::Scene { using RenderSystem = bloom::systems::RenderSystem; using Position = bloom::components::Position; using Size = bloom::components::Size; + public: using bloom::Scene::Scene; + ~TestScene() { + unload(); + } + void load() override { namespace fs = std::filesystem; fs::path workingDir = fs::path(getExePath()); @@ -17,14 +22,21 @@ class TestScene : public bloom::Scene { fs::path spriteSheetPath = workingDir / assetsDir / "OverworldTestSpritesheet.png"; fs::path testCharPath = workingDir / assetsDir / "TestChar.png"; - addGameObject("testSprite", Position( 10,10 ), Size( 128,128 ), spriteSheetPath, SDL_Rect{ 0,0,32,32 }); - addGameObject("testSprite2", Position(0, 0, relative), Size(128, 128), testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); - addGameObject("testGO", Position(50, 50, relative, (middle|right)), Size(256, 256), testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); + addGameObject("testSprite", Position(10, 10), Size(128, 128), spriteSheetPath, SDL_Rect{ 0, 0, 32, 32 }); + addGameObject("testSprite2", Position(0, 0, bloom::relative), Size(128, 128), testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); + addGameObject("testGO", Position(50, 50, bloom::relative, (bloom::middle | bloom::right)), Size(256, 256), testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); - registerSystem(); + //registerSystem(); registerSystem(); registerSystem(); // Do barrel rolls!!! } - void unload() override {} + void unload() override { + destroyGameObject("testSprite"); + destroyGameObject("testSprite2"); + destroyGameObject("testGO"); + + unregisterSystem(); + unregisterSystem(); + } }; \ No newline at end of file diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index 4eb22f68..632aae2a 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -69,6 +69,7 @@ int main() { if (framedelay > frametime) game->delay(framedelay - frametime); } + game->destroy(); Game::exit(); return 0; From 947454051e821ceaa7d7fc648afa9a7496db8f91 Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Tue, 13 Nov 2018 22:38:16 +0300 Subject: [PATCH 55/88] Format code and use `BLOOMFRAMEWORK_API` in class declarations --- BloomFramework/include/Scenes/Scene.h | 7 +++---- BloomFramework/include/Scenes/SceneManager.h | 2 +- BloomFramework/src/Scenes/Scene.cpp | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 707a638b..598a1458 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -5,8 +5,8 @@ #include "GameObject.h" namespace bloom { - class SceneManager; - struct Coord; + class BLOOMFRAMEWORK_API SceneManager; + struct BLOOMFRAMEWORK_API Coord; class BLOOMFRAMEWORK_API Scene { using System = bloom::systems::DefaultSystem; @@ -95,5 +95,4 @@ namespace bloom { std::clog << "Can't unregister system that isn't registered." << std::endl; } } -} - +} \ No newline at end of file diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index 874f1629..c465f761 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -4,7 +4,7 @@ #include "Scene.h" namespace bloom { - class Game; + class BLOOMFRAMEWORK_API Game; class BLOOMFRAMEWORK_API SceneManager { friend Scene::Scene(SceneManager & sceneManager); diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index ba2e22e6..0092cf60 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -29,6 +29,7 @@ namespace bloom { void Scene::destroyGameObject(const std::string & tag) { m_gameObjects.erase(tag); } + void Scene::setSceneRotation(double angle) { m_sceneRotateAngle = fmod(angle, 360.0); } @@ -44,6 +45,5 @@ namespace bloom { void Scene::setSceneRotationCenter(SDL_Point center) { m_sceneRotateCenter = center; } - } From 1f39145b4e08f25d86d11bd0af412ef0e4cf2fb4 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Thu, 15 Nov 2018 18:02:08 +0800 Subject: [PATCH 56/88] Allow `System`s to control public variables of each other Test Scene now demonstrates this. --- BloomFramework/include/Scenes/Scene.h | 23 ++++++++++++++++- BloomFramework/src/Scenes/Scene.cpp | 4 +++ Test Bench/GameObjectTest/RandomizerSystem.h | 18 +++++++------ Test Bench/GameObjectTest/SceneRotateSystem.h | 19 +++++++++++--- .../GameObjectTest/SpriteRotatorSystem.h | 25 ++++++++++++++----- Test Bench/TestScene.h | 7 +++++- 6 files changed, 78 insertions(+), 18 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 598a1458..c7902fe4 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -3,6 +3,7 @@ #include "stdIncludes.h" #include "Systems/DefaultSystem.h" #include "GameObject.h" +#include "Exception.h" namespace bloom { class BLOOMFRAMEWORK_API SceneManager; @@ -34,10 +35,14 @@ namespace bloom { template void unregisterSystem(); + + template + std::shared_ptr getSystemPtr(); // Rotation stuff void setSceneRotation(double angle); void adjustSceneRotation(double adjustment); + double getSceneRotation(); void setSceneRotationCenter(Coord center); void setSceneRotationCenter(SDL_Point center); @@ -45,7 +50,7 @@ namespace bloom { SceneManager & m_sceneManager; Game & m_gameInstance; entt::DefaultRegistry m_registry; - std::vector> m_systems; + std::vector> m_systems; std::unordered_map> m_gameObjects; SDL_Texture * m_sceneTexture; @@ -95,4 +100,20 @@ namespace bloom { std::clog << "Can't unregister system that isn't registered." << std::endl; } } + + template + std::shared_ptr Scene::getSystemPtr() + { + static_assert (std::is_base_of_v, "Type S passed in is not a System based"); + if (auto v = std::find_if(m_systems.begin(), m_systems.end(), + [](auto & i) -> bool { return (std::strcmp(typeid(*i).name(), typeid(S).name()) == 0); }); + v != m_systems.end()) + { + return std::dynamic_pointer_cast(*v); + } + else { + throw Exception("[Scene getSystemPtr] Unable to get System, it is not registered."); + } + } + } \ No newline at end of file diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index 0092cf60..697090d0 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -38,6 +38,10 @@ namespace bloom { m_sceneRotateAngle = fmod((m_sceneRotateAngle + adjustment), 360.0); } + double Scene::getSceneRotation(){ + return m_sceneRotateAngle; + } + void Scene::setSceneRotationCenter(Coord center) { m_sceneRotateCenter = center.toSDLPoint(m_gameInstance.getRenderer()); } diff --git a/Test Bench/GameObjectTest/RandomizerSystem.h b/Test Bench/GameObjectTest/RandomizerSystem.h index 20384039..3db2c859 100644 --- a/Test Bench/GameObjectTest/RandomizerSystem.h +++ b/Test Bench/GameObjectTest/RandomizerSystem.h @@ -11,12 +11,16 @@ class RandomPositionSystem : public bloom::systems::DefaultSystem { ~RandomPositionSystem() = default; void update(std::optional deltaTime = std::nullopt) override { - m_registry.view().each( - [this](auto entity, Position & pos) { - if (!m_registry.has(entity)) { - pos.x = rand() % 672; - pos.y = rand() % 472; - } - }); + if (enabled) { + m_registry.view().each( + [this](auto entity, Position & pos) { + if (!m_registry.has(entity)) { + pos.x = rand() % 672; + pos.y = rand() % 472; + } + }); + } } + + bool enabled = false; }; \ No newline at end of file diff --git a/Test Bench/GameObjectTest/SceneRotateSystem.h b/Test Bench/GameObjectTest/SceneRotateSystem.h index e83ff4c3..5e3bff7c 100644 --- a/Test Bench/GameObjectTest/SceneRotateSystem.h +++ b/Test Bench/GameObjectTest/SceneRotateSystem.h @@ -1,5 +1,6 @@ #pragma once #include "Framework.h" +#include "RandomizerSystem.h" class SceneRotateSystem : public bloom::systems::DefaultSystem { using Position = bloom::components::Position; @@ -9,10 +10,22 @@ class SceneRotateSystem : public bloom::systems::DefaultSystem { ~SceneRotateSystem() = default; void update(std::optional deltaTime = std::nullopt) override { - auto adjustValue = rotateSpeed * (deltaTime.value() / 1000); - parentScene.adjustSceneRotation(adjustValue); + if (currentRotate != rotateAmount) { + m_currentAngle += rotateSpeed * (deltaTime.value() / 1000); + currentRotate = static_cast(m_currentAngle / 360.0); + if (currentRotate == rotateAmount) { + m_currentAngle = 0.0; + parentScene.getSystemPtr()->enabled = true; + } + parentScene.setSceneRotation(m_currentAngle); + } } -private: double rotateSpeed = static_cast(rand() % 360); + int rotateAmount = 0; + int currentRotate = 0; + +private: + double m_currentAngle = 0.0; + }; \ No newline at end of file diff --git a/Test Bench/GameObjectTest/SpriteRotatorSystem.h b/Test Bench/GameObjectTest/SpriteRotatorSystem.h index 8c35d355..0dd51346 100644 --- a/Test Bench/GameObjectTest/SpriteRotatorSystem.h +++ b/Test Bench/GameObjectTest/SpriteRotatorSystem.h @@ -1,5 +1,6 @@ #pragma once #include "Framework.h" +#include "SceneRotateSystem.h" class SpriteRotatorSystem : public bloom::systems::DefaultSystem { using Sprite = bloom::components::Sprite; @@ -9,13 +10,25 @@ class SpriteRotatorSystem : public bloom::systems::DefaultSystem { ~SpriteRotatorSystem() = default; void update(std::optional deltaTime = std::nullopt) override { - m_registry.view().each( - [&](auto entity, Sprite & spr) { - auto adjustAmount = rotateSpeed * (deltaTime.value() / 1000); - spr.rotationAngle = fmod(spr.rotationAngle + adjustAmount, 360); - }); + if (currentRotate != rotateAmount) { + m_currentAngle += rotateSpeed * (deltaTime.value() / 1000); + currentRotate = static_cast(m_currentAngle / 360.0); + currentRotate = static_cast(m_currentAngle / 360.0); + if (currentRotate == rotateAmount) { + m_currentAngle = 0.0; + parentScene.getSystemPtr()->rotateAmount = 5; + } + m_registry.view().each( + [&](auto entity, Sprite & spr) { + spr.rotationAngle = fmod(m_currentAngle, 360); + }); + } } -private: double rotateSpeed = static_cast(rand() % 360); + int rotateAmount = 5; + int currentRotate = 0; + +private: + double m_currentAngle = 0.0; }; \ No newline at end of file diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index f7c68354..ea9208f0 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -2,6 +2,8 @@ #include "Scenes/Scene.h" #include "GameObjectTest/TestGameObject.h" #include "GameObjectTest/SceneRotateSystem.h" +#include "GameObjectTest/SpriteRotatorSystem.h" +#include "GameObjectTest/RandomizerSystem.h" class TestScene : public bloom::Scene { using RenderSystem = bloom::systems::RenderSystem; @@ -26,9 +28,10 @@ class TestScene : public bloom::Scene { addGameObject("testSprite2", Position(0, 0, bloom::relative), Size(128, 128), testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); addGameObject("testGO", Position(50, 50, bloom::relative, (bloom::middle | bloom::right)), Size(256, 256), testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); - //registerSystem(); + registerSystem(); // Still wonky because of Coord change. registerSystem(); registerSystem(); // Do barrel rolls!!! + registerSystem(); } void unload() override { @@ -38,5 +41,7 @@ class TestScene : public bloom::Scene { unregisterSystem(); unregisterSystem(); + unregisterSystem(); + unregisterSystem(); } }; \ No newline at end of file From e7461755ab45d54b60b0eb77a41f8a0407362161 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Thu, 15 Nov 2018 18:21:14 +0800 Subject: [PATCH 57/88] Fix emplacing a unique ptr instead of a shared ptr --- BloomFramework/include/Scenes/Scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index c7902fe4..bcc6470e 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -79,7 +79,7 @@ namespace bloom { [](auto & i) -> bool { return (std::strcmp(typeid(*i).name(), typeid(S).name()) == 0); }); v == m_systems.end()) { - m_systems.emplace_back(std::unique_ptr(new S(*this))); + m_systems.emplace_back(std::make_shared(*this)); return (m_systems.size() - 1); } else { From 4e1176fc2f4031e4f7b7b29a81280e0d730c59a3 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 16 Nov 2018 19:35:13 +0800 Subject: [PATCH 58/88] Allow enabling/disabling any `System` This is slightly better than implementing a check from within the `System::update()` function. --- BloomFramework/include/Systems/DefaultSystem.h | 1 + BloomFramework/src/Scenes/Scene.cpp | 5 +++-- Test Bench/GameObjectTest/RandomizerSystem.h | 18 +++++++----------- Test Bench/TestScene.h | 2 ++ 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/BloomFramework/include/Systems/DefaultSystem.h b/BloomFramework/include/Systems/DefaultSystem.h index 7f23bb56..02c4ce4a 100644 --- a/BloomFramework/include/Systems/DefaultSystem.h +++ b/BloomFramework/include/Systems/DefaultSystem.h @@ -13,6 +13,7 @@ namespace bloom { virtual void update(std::optional deltaTime = std::nullopt) = 0; + bool enabled = true; protected: bloom::Scene & parentScene; entt::DefaultRegistry & m_registry; diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index 697090d0..0a4d2cb4 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -19,7 +19,8 @@ namespace bloom { SDL_SetRenderTarget(m_gameInstance.getRenderer(), m_sceneTexture); SDL_RenderClear(m_gameInstance.getRenderer()); for (auto & sys : m_systems) - sys->update(deltaTime); + if (sys->enabled) + sys->update(deltaTime); } void Scene::draw() { @@ -38,7 +39,7 @@ namespace bloom { m_sceneRotateAngle = fmod((m_sceneRotateAngle + adjustment), 360.0); } - double Scene::getSceneRotation(){ + double Scene::getSceneRotation() { return m_sceneRotateAngle; } diff --git a/Test Bench/GameObjectTest/RandomizerSystem.h b/Test Bench/GameObjectTest/RandomizerSystem.h index 3db2c859..20384039 100644 --- a/Test Bench/GameObjectTest/RandomizerSystem.h +++ b/Test Bench/GameObjectTest/RandomizerSystem.h @@ -11,16 +11,12 @@ class RandomPositionSystem : public bloom::systems::DefaultSystem { ~RandomPositionSystem() = default; void update(std::optional deltaTime = std::nullopt) override { - if (enabled) { - m_registry.view().each( - [this](auto entity, Position & pos) { - if (!m_registry.has(entity)) { - pos.x = rand() % 672; - pos.y = rand() % 472; - } - }); - } + m_registry.view().each( + [this](auto entity, Position & pos) { + if (!m_registry.has(entity)) { + pos.x = rand() % 672; + pos.y = rand() % 472; + } + }); } - - bool enabled = false; }; \ No newline at end of file diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index ea9208f0..de15888e 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -32,6 +32,8 @@ class TestScene : public bloom::Scene { registerSystem(); registerSystem(); // Do barrel rolls!!! registerSystem(); + + getSystemPtr()->enabled = false; // We want to start this after the rotations. } void unload() override { From d7b7d8a292eb5f7a096c8e1bb71f09dba43eedd2 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 16 Nov 2018 19:45:17 +0800 Subject: [PATCH 59/88] Let `registerSystem()` return a shared_ptr of System instead of index --- BloomFramework/include/Scenes/Scene.h | 9 ++++----- Test Bench/TestScene.h | 4 +--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index bcc6470e..3d0c8d01 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -31,7 +31,7 @@ namespace bloom { // System stuff template - size_t registerSystem(); + std::shared_ptr registerSystem(); template void unregisterSystem(); @@ -73,18 +73,17 @@ namespace bloom { } // System stuff - template size_t Scene::registerSystem() { + template std::shared_ptr Scene::registerSystem() { static_assert (std::is_base_of_v, "Type S passed in is not a System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), [](auto & i) -> bool { return (std::strcmp(typeid(*i).name(), typeid(S).name()) == 0); }); v == m_systems.end()) { - m_systems.emplace_back(std::make_shared(*this)); - return (m_systems.size() - 1); + return std::dynamic_pointer_cast(m_systems.emplace_back(std::make_shared(*this))); } else { std::clog << "This system is already registered." << std::endl; - return (v - m_systems.begin()); + return std::dynamic_pointer_cast(*v); } } diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index de15888e..4f905766 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -28,12 +28,10 @@ class TestScene : public bloom::Scene { addGameObject("testSprite2", Position(0, 0, bloom::relative), Size(128, 128), testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); addGameObject("testGO", Position(50, 50, bloom::relative, (bloom::middle | bloom::right)), Size(256, 256), testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); - registerSystem(); // Still wonky because of Coord change. + registerSystem()->enabled = false; // Still wonky because of Coord change. We also don't want to start it immediately. registerSystem(); registerSystem(); // Do barrel rolls!!! registerSystem(); - - getSystemPtr()->enabled = false; // We want to start this after the rotations. } void unload() override { From b04c48583f96a1557faa569908197dd6249f7fda Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sun, 25 Nov 2018 23:40:36 +0800 Subject: [PATCH 60/88] Merge all transform related components --- BloomFramework/BloomFramework.vcxproj | 5 ++- BloomFramework/BloomFramework.vcxproj.filters | 15 ++++----- .../include/Components/Components.h | 7 ++-- BloomFramework/include/Components/Position.h | 6 ---- BloomFramework/include/Components/Size.h | 10 ------ BloomFramework/include/Components/Sprite.h | 1 - BloomFramework/include/Components/Transform.h | 18 ++++++++++ BloomFramework/include/GameObject.h | 2 +- BloomFramework/include/Systems/RenderSystem.h | 33 ++++++++++--------- BloomFramework/src/GameObject.cpp | 1 - Test Bench/GameObjectTest/RandomizerSystem.h | 10 +++--- .../GameObjectTest/SpriteRotatorSystem.h | 8 ++--- Test Bench/GameObjectTest/TestGameObject.h | 10 +++--- Test Bench/TestScene.h | 6 ++-- Test Bench/main.cpp | 1 - 15 files changed, 65 insertions(+), 68 deletions(-) delete mode 100644 BloomFramework/include/Components/Position.h delete mode 100644 BloomFramework/include/Components/Size.h create mode 100644 BloomFramework/include/Components/Transform.h diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index 6aaed89a..7b595b53 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -163,12 +163,11 @@ + + - - - diff --git a/BloomFramework/BloomFramework.vcxproj.filters b/BloomFramework/BloomFramework.vcxproj.filters index d691f411..47012101 100644 --- a/BloomFramework/BloomFramework.vcxproj.filters +++ b/BloomFramework/BloomFramework.vcxproj.filters @@ -86,15 +86,6 @@ Header Files\Components - - Header Files\Components - - - Header Files\Components - - - Header Files\Components - Header Files\Systems @@ -122,6 +113,12 @@ Header Files\Components + + Header Files\Components + + + Header Files\Components + diff --git a/BloomFramework/include/Components/Components.h b/BloomFramework/include/Components/Components.h index 8c5d5471..e60e5092 100644 --- a/BloomFramework/include/Components/Components.h +++ b/BloomFramework/include/Components/Components.h @@ -1,6 +1,5 @@ #pragma once -#include "Position.h" -#include "Size.h" -#include "Sprite.h" -#include "LayerGroup.h" \ No newline at end of file +#include "Transform.h" +#include "LayerGroup.h" +#include "Sprite.h" \ No newline at end of file diff --git a/BloomFramework/include/Components/Position.h b/BloomFramework/include/Components/Position.h deleted file mode 100644 index 52af4234..00000000 --- a/BloomFramework/include/Components/Position.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once -#include "Coord.h" - -namespace bloom::components { - using Position = bloom::Coord; -} \ No newline at end of file diff --git a/BloomFramework/include/Components/Size.h b/BloomFramework/include/Components/Size.h deleted file mode 100644 index f2a62673..00000000 --- a/BloomFramework/include/Components/Size.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -namespace bloom::components { - struct Size { - Size(const Size & other) = default; - Size(int w = 1, int h = 1) : w(w), h(h) {} - - int w, h; - }; -} \ No newline at end of file diff --git a/BloomFramework/include/Components/Sprite.h b/BloomFramework/include/Components/Sprite.h index d91e1ed9..a02fdbee 100644 --- a/BloomFramework/include/Components/Sprite.h +++ b/BloomFramework/include/Components/Sprite.h @@ -11,6 +11,5 @@ namespace bloom::components { TexturePtr texture; std::optional srcRect; - double rotationAngle = 0.0; }; } \ No newline at end of file diff --git a/BloomFramework/include/Components/Transform.h b/BloomFramework/include/Components/Transform.h new file mode 100644 index 00000000..f8f3782d --- /dev/null +++ b/BloomFramework/include/Components/Transform.h @@ -0,0 +1,18 @@ +#pragma once + +#include "Coord.h" + +namespace bloom::components { + using Position = bloom::Coord; + struct Size { + int w, h; + }; + + struct Transform { + Position position; + + double rotation; + + Size size; + }; +} \ No newline at end of file diff --git a/BloomFramework/include/GameObject.h b/BloomFramework/include/GameObject.h index 6f936b74..8feb698e 100644 --- a/BloomFramework/include/GameObject.h +++ b/BloomFramework/include/GameObject.h @@ -16,7 +16,7 @@ namespace bloom { * The destructor will automatically destroy the entity from the registry when GameObject gets out of scope. */ class BLOOMFRAMEWORK_API GameObject { - using Position = bloom::components::Position; + using Transform = bloom::components::Transform; public: GameObject(entt::DefaultRegistry & registry, Game & gameInstance); diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 3c11f7b4..7d0680c8 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -8,8 +8,8 @@ namespace bloom::systems { class RenderSystem : public DefaultSystem { - using Position = bloom::components::Position; - using Size = bloom::components::Size; + using Transform = bloom::components::Transform; + using Rotation = double; using Sprite = bloom::components::Sprite; using LayerGroup = bloom::components::LayerGroup; using DefaultSystem::System; @@ -18,22 +18,22 @@ namespace bloom::systems { ~RenderSystem() = default; void update(std::optional deltaTime = std::nullopt) override { - std::vector> renderQueue{}; + std::vector> renderQueue{}; - m_registry.view().each( - [&](auto entity, Position & pos, Size& size, Sprite & spr) { + m_registry.view().each( + [&](auto entity, Transform & trans, Sprite & spr) { - if (size.w < 0) - size.w = 0; - if (size.h < 0) - size.h = 0; + if (trans.size.w < 0) + trans.size.w = 0; + if (trans.size.h < 0) + trans.size.h = 0; - Coord actualPos = pos.getSDLPos(parentScene.getGameInstance().getRenderer(), size.w, size.h); + Coord actualPos = trans.position.getSDLPos(parentScene.getGameInstance().getRenderer(), trans.size.w, trans.size.h); SDL_Rect destRect{ static_cast(actualPos.x), static_cast(actualPos.y), - static_cast(size.w), - static_cast(size.h) + static_cast(trans.size.w), + static_cast(trans.size.h) }; LayerGroup layerNo; @@ -43,19 +43,20 @@ namespace bloom::systems { layerNo = 0; // Place sprites into queue for sorting later. - renderQueue.emplace_back(std::make_tuple(spr, destRect, layerNo)); + renderQueue.emplace_back(std::make_tuple(spr, trans.rotation, destRect, layerNo)); }); // Sort the sprites based on priority, higher number means rendered later. Same layer may fight std::sort(renderQueue.begin(), renderQueue.end(), [](const auto& lhs, const auto& rhs) { - return std::get<2>(lhs) < std::get<2>(rhs); + return std::get<3>(lhs) < std::get<3>(rhs); }); // Render for (auto i : renderQueue) { auto & spr = std::get<0>(i); - auto & destRect = std::get<1>(i); - spr.texture->render(spr.srcRect, destRect, spr.rotationAngle); + auto & rot = std::get<1>(i); + auto & destRect = std::get<2>(i); + spr.texture->render(spr.srcRect, destRect, rot); } } diff --git a/BloomFramework/src/GameObject.cpp b/BloomFramework/src/GameObject.cpp index ce96c02a..e8c29c00 100644 --- a/BloomFramework/src/GameObject.cpp +++ b/BloomFramework/src/GameObject.cpp @@ -3,7 +3,6 @@ namespace bloom { GameObject::GameObject(entt::DefaultRegistry & registry, Game & gameInstance) : m_registry(registry), m_gameInstance(gameInstance) { m_entity = m_registry.create(); - m_registry.assign(m_entity, 0, 0); } GameObject::~GameObject() { diff --git a/Test Bench/GameObjectTest/RandomizerSystem.h b/Test Bench/GameObjectTest/RandomizerSystem.h index 20384039..d44bea62 100644 --- a/Test Bench/GameObjectTest/RandomizerSystem.h +++ b/Test Bench/GameObjectTest/RandomizerSystem.h @@ -4,18 +4,18 @@ #include "NoRandomComponent.h" class RandomPositionSystem : public bloom::systems::DefaultSystem { - using Position = bloom::components::Position; + using Transform = bloom::components::Transform; using bloom::systems::DefaultSystem::System; public: ~RandomPositionSystem() = default; void update(std::optional deltaTime = std::nullopt) override { - m_registry.view().each( - [this](auto entity, Position & pos) { + m_registry.view().each( + [this](auto entity, Transform & trans) { if (!m_registry.has(entity)) { - pos.x = rand() % 672; - pos.y = rand() % 472; + trans.position.x = rand() % 672; + trans.position.y = rand() % 472; } }); } diff --git a/Test Bench/GameObjectTest/SpriteRotatorSystem.h b/Test Bench/GameObjectTest/SpriteRotatorSystem.h index 0dd51346..f307c784 100644 --- a/Test Bench/GameObjectTest/SpriteRotatorSystem.h +++ b/Test Bench/GameObjectTest/SpriteRotatorSystem.h @@ -3,7 +3,7 @@ #include "SceneRotateSystem.h" class SpriteRotatorSystem : public bloom::systems::DefaultSystem { - using Sprite = bloom::components::Sprite; + using Transform = bloom::components::Transform; using bloom::systems::DefaultSystem::System; public: @@ -18,9 +18,9 @@ class SpriteRotatorSystem : public bloom::systems::DefaultSystem { m_currentAngle = 0.0; parentScene.getSystemPtr()->rotateAmount = 5; } - m_registry.view().each( - [&](auto entity, Sprite & spr) { - spr.rotationAngle = fmod(m_currentAngle, 360); + m_registry.view().each( + [&](auto entity, Transform & trans) { + trans.rotation = fmod(m_currentAngle, 360); }); } } diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index 8e98ac17..65fbf9dc 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -4,18 +4,20 @@ #include "NoRandomComponent.h" class TestChar : public bloom::GameObject { - using Position = bloom::components::Position; + using Transform = bloom::components::Transform; + using Position = bloom::Coord; using Size = bloom::components::Size; - using Sprite = bloom::components::Sprite; using LayerGroup = bloom::components::LayerGroup; + using Sprite = bloom::components::Sprite; using bloom::GameObject::GameObject; public: void init() override {} void init(Position pos, Size size, const std::filesystem::path texturePath, std::optional srcRect = std::nullopt, std::optional priority = std::nullopt) { - m_registry.replace(m_entity, pos); - m_registry.assign(m_entity, size); + + Transform trans = { pos, 0.0f, size }; + m_registry.assign(m_entity, trans); auto tmp = m_gameInstance.textures.load(texturePath); m_registry.assign(m_entity, tmp, srcRect); diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index 4f905766..14347a5c 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -24,9 +24,9 @@ class TestScene : public bloom::Scene { fs::path spriteSheetPath = workingDir / assetsDir / "OverworldTestSpritesheet.png"; fs::path testCharPath = workingDir / assetsDir / "TestChar.png"; - addGameObject("testSprite", Position(10, 10), Size(128, 128), spriteSheetPath, SDL_Rect{ 0, 0, 32, 32 }); - addGameObject("testSprite2", Position(0, 0, bloom::relative), Size(128, 128), testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); - addGameObject("testGO", Position(50, 50, bloom::relative, (bloom::middle | bloom::right)), Size(256, 256), testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); + addGameObject("testSprite", Position(10, 10), Size{ 128, 128 }, spriteSheetPath, SDL_Rect{ 0, 0, 32, 32 }); + addGameObject("testSprite2", Position(0, 0, bloom::relative), Size{ 128, 128 }, testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); + addGameObject("testGO", Position(50, 50, bloom::relative, (bloom::middle | bloom::right)), Size{ 256, 256 }, testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); registerSystem()->enabled = false; // Still wonky because of Coord change. We also don't want to start it immediately. registerSystem(); diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index 632aae2a..c702a203 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -8,7 +8,6 @@ #include "TestScene.h" using namespace bloom; -using bloom::components::Position; Game* game = nullptr; From f36b742120125aa50588c94a3a0f6239b7dcc169 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Mon, 26 Nov 2018 14:55:40 +0800 Subject: [PATCH 61/88] Add Tag component Uses `entt::label` behind the scenes. Using the `_hs` user defined literal(provided by `entt::hashed_string`) will make it simple to create a label. --- BloomFramework/BloomFramework.vcxproj | 1 + BloomFramework/BloomFramework.vcxproj.filters | 3 +++ BloomFramework/include/Components/Components.h | 3 ++- BloomFramework/include/Components/Tag.h | 9 +++++++++ Test Bench/GameObjectTest/TestGameObject.h | 9 +++++++++ 5 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 BloomFramework/include/Components/Tag.h diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index 7b595b53..1ba010c3 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -164,6 +164,7 @@ + diff --git a/BloomFramework/BloomFramework.vcxproj.filters b/BloomFramework/BloomFramework.vcxproj.filters index 47012101..1a4358d1 100644 --- a/BloomFramework/BloomFramework.vcxproj.filters +++ b/BloomFramework/BloomFramework.vcxproj.filters @@ -119,6 +119,9 @@ Header Files\Components + + Header Files\Components + diff --git a/BloomFramework/include/Components/Components.h b/BloomFramework/include/Components/Components.h index e60e5092..4d922739 100644 --- a/BloomFramework/include/Components/Components.h +++ b/BloomFramework/include/Components/Components.h @@ -2,4 +2,5 @@ #include "Transform.h" #include "LayerGroup.h" -#include "Sprite.h" \ No newline at end of file +#include "Sprite.h" +#include "Tag.h" \ No newline at end of file diff --git a/BloomFramework/include/Components/Tag.h b/BloomFramework/include/Components/Tag.h new file mode 100644 index 00000000..e7cfccce --- /dev/null +++ b/BloomFramework/include/Components/Tag.h @@ -0,0 +1,9 @@ +#pragma once +#include +#include "entt/entt.hpp" + +namespace bloom::components { + template + using Label = entt::label; + +} diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index 65fbf9dc..c188ff2c 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -3,12 +3,17 @@ #include "Framework.h" #include "NoRandomComponent.h" +//using namespace entt; + class TestChar : public bloom::GameObject { using Transform = bloom::components::Transform; using Position = bloom::Coord; using Size = bloom::components::Size; using LayerGroup = bloom::components::LayerGroup; using Sprite = bloom::components::Sprite; + template + using Label = bloom::components::Label; + using bloom::GameObject::GameObject; public: @@ -23,6 +28,10 @@ class TestChar : public bloom::GameObject { if (priority != std::nullopt) m_registry.assign(m_entity, priority.value()); + + + m_registry.assign>(m_entity); + } void disableRandomPos() { From d41de93cc46185f9dd1a60ed7c89893f8a80860a Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Fri, 21 Dec 2018 10:22:24 +0300 Subject: [PATCH 62/88] Simplify type comparison in Scene's Systems --- BloomFramework/include/Scenes/Scene.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 3d0c8d01..a4889c1a 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -76,7 +76,7 @@ namespace bloom { template std::shared_ptr Scene::registerSystem() { static_assert (std::is_base_of_v, "Type S passed in is not a System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool { return (std::strcmp(typeid(*i).name(), typeid(S).name()) == 0); }); + [](auto & i) -> bool { return typeid(*i) == typeid(S); }); v == m_systems.end()) { return std::dynamic_pointer_cast(m_systems.emplace_back(std::make_shared(*this))); @@ -90,7 +90,7 @@ namespace bloom { template void Scene::unregisterSystem() { static_assert (std::is_base_of_v, "Type S passed in is not a System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool { return (std::strcmp(typeid(*i).name(), typeid(S).name()) == 0); }); + [](auto & i) -> bool { return typeid(*i) == typeid(S); }); v != m_systems.end()) { m_systems.erase(v); @@ -105,7 +105,7 @@ namespace bloom { { static_assert (std::is_base_of_v, "Type S passed in is not a System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), - [](auto & i) -> bool { return (std::strcmp(typeid(*i).name(), typeid(S).name()) == 0); }); + [](auto & i) -> bool { return typeid(*i) == typeid(S); }); v != m_systems.end()) { return std::dynamic_pointer_cast(*v); From d96e026eec165d05c73b662e83f5b3465e47bf71 Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Thu, 3 Jan 2019 22:10:05 +0300 Subject: [PATCH 63/88] [RenderSystem.h] Small fixes and simplifications - Use std::list instead of std::vector - Remove useless casts - Simplify LayerNo initialization - Use stable_sort instead of sort - Use structured bindings for tuples --- BloomFramework/include/Systems/RenderSystem.h | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 7d0680c8..4fd5651e 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -18,10 +18,10 @@ namespace bloom::systems { ~RenderSystem() = default; void update(std::optional deltaTime = std::nullopt) override { - std::vector> renderQueue{}; + std::list> renderQueue; m_registry.view().each( - [&](auto entity, Transform & trans, Sprite & spr) { + [&](auto entity, Transform& trans, Sprite& spr) { if (trans.size.w < 0) trans.size.w = 0; @@ -30,37 +30,29 @@ namespace bloom::systems { Coord actualPos = trans.position.getSDLPos(parentScene.getGameInstance().getRenderer(), trans.size.w, trans.size.h); SDL_Rect destRect{ - static_cast(actualPos.x), - static_cast(actualPos.y), - static_cast(trans.size.w), - static_cast(trans.size.h) + actualPos.x, + actualPos.y, + trans.size.w, + trans.size.h }; - LayerGroup layerNo; - if (m_registry.has(entity)) - layerNo = m_registry.get(entity); - else - layerNo = 0; + LayerGroup layerNo = (m_registry.has(entity) ? m_registry.get(entity) : 0); // Place sprites into queue for sorting later. renderQueue.emplace_back(std::make_tuple(spr, trans.rotation, destRect, layerNo)); }); // Sort the sprites based on priority, higher number means rendered later. Same layer may fight - std::sort(renderQueue.begin(), renderQueue.end(), [](const auto& lhs, const auto& rhs) { + std::stable_sort(renderQueue.begin(), renderQueue.end(), [](const auto& lhs, const auto& rhs) { return std::get<3>(lhs) < std::get<3>(rhs); }); // Render - for (auto i : renderQueue) { - auto & spr = std::get<0>(i); - auto & rot = std::get<1>(i); - auto & destRect = std::get<2>(i); + for (auto& [spr, rot, destRect, lg] : renderQueue) spr.texture->render(spr.srcRect, destRect, rot); - } } private: - SDL_Renderer * renderer; + SDL_Renderer* renderer; }; } \ No newline at end of file From 2531653efdff712e53d6e8fe6a7472e4edf27309 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 16 Jan 2019 22:27:45 +0800 Subject: [PATCH 64/88] Remove unload function The class dtor would take care of it. --- BloomFramework/include/Scenes/Scene.h | 1 - Test Bench/TestScene.h | 14 -------------- 2 files changed, 15 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index a4889c1a..8cfa34bb 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -20,7 +20,6 @@ namespace bloom { void update(double deltaTime); void draw(); virtual void load() = 0; - virtual void unload() = 0; Game & getGameInstance() { return m_gameInstance; } //Game Object stuff diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index 692f4929..0b3fa70a 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -39,18 +39,4 @@ class TestScene : public bloom::Scene { registerSystem(); registerSystem(); } - - void unload() override { - destroyGameObject("testSprite"); - destroyGameObject("testSprite2"); - destroyGameObject("testGO"); - destroyGameObject("testAnimatedSprite"); - - unregisterSystem(); - unregisterSystem(); - unregisterSystem(); - unregisterSystem(); - unregisterSystem(); - unregisterSystem(); - } }; \ No newline at end of file From 87c9ed4df5c50ad8a49351e073fb15c658916af6 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 16 Jan 2019 22:32:20 +0800 Subject: [PATCH 65/88] [Scene] Fix memory leak during destruction --- BloomFramework/include/Scenes/Scene.h | 7 +------ BloomFramework/src/Scenes/Scene.cpp | 4 ++++ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 8cfa34bb..63cdab71 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -15,7 +15,7 @@ namespace bloom { public: Scene(SceneManager & sceneManager); - virtual ~Scene() = default; + ~Scene(); void update(double deltaTime); void draw(); @@ -64,11 +64,6 @@ namespace bloom { obj->init(std::forward(initArgs)...); m_gameObjects.emplace(tag, std::unique_ptr(obj)); - - //auto & tmp = m_gameObjects[tag]; - //GO* derived = dynamic_cast(tmp.get()); - ////if (derived != nullptr) // we just already emplaced object, nullptr will never be returned - // derived->init(std::forward(initArgs)...); } // System stuff diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index 0a4d2cb4..962459b4 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -15,6 +15,10 @@ namespace bloom { SDL_SetTextureBlendMode(m_sceneTexture, SDL_BLENDMODE_BLEND); } + Scene::~Scene() { + SDL_DestroyTexture(m_sceneTexture); + } + void Scene::update(double deltaTime) { SDL_SetRenderTarget(m_gameInstance.getRenderer(), m_sceneTexture); SDL_RenderClear(m_gameInstance.getRenderer()); From 27a00cafa60fb626847fd3ec7b4b49ea7898edc7 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 16 Jan 2019 22:38:04 +0800 Subject: [PATCH 66/88] Fix some grammar --- BloomFramework/include/Scenes/Scene.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 63cdab71..55defce5 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -58,7 +58,7 @@ namespace bloom { }; template void Scene::addGameObject(const std::string & tag, TArgs &&... initArgs) { - static_assert(std::is_base_of_v, "Type GO passed in is not a GameObject based"); + static_assert(std::is_base_of_v, "Type GO passed in is not GameObject based"); GO* obj = new GO(m_registry, m_gameInstance); obj->init(std::forward(initArgs)...); @@ -68,7 +68,7 @@ namespace bloom { // System stuff template std::shared_ptr Scene::registerSystem() { - static_assert (std::is_base_of_v, "Type S passed in is not a System based"); + static_assert (std::is_base_of_v, "Type S passed in is not System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), [](auto & i) -> bool { return typeid(*i) == typeid(S); }); v == m_systems.end()) @@ -82,7 +82,7 @@ namespace bloom { } template void Scene::unregisterSystem() { - static_assert (std::is_base_of_v, "Type S passed in is not a System based"); + static_assert (std::is_base_of_v, "Type S passed in is not System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), [](auto & i) -> bool { return typeid(*i) == typeid(S); }); v != m_systems.end()) @@ -97,7 +97,7 @@ namespace bloom { template std::shared_ptr Scene::getSystemPtr() { - static_assert (std::is_base_of_v, "Type S passed in is not a System based"); + static_assert (std::is_base_of_v, "Type S passed in is not System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), [](auto & i) -> bool { return typeid(*i) == typeid(S); }); v != m_systems.end()) From 58774f6e15f05eb36e8e139614d665d59a0020f1 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 18 Jan 2019 23:18:35 +0800 Subject: [PATCH 67/88] [Scene] Add functions to unregister all GameObjects/Systems Also fix a build error in which an attempts to use `unload()` was made. --- BloomFramework/include/Scenes/Scene.h | 6 +++++- BloomFramework/include/Scenes/SceneManager.h | 4 +--- BloomFramework/src/Scenes/Scene.cpp | 8 ++++++++ Test Bench/TestScene.h | 4 ---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 55defce5..10573ddf 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -8,7 +8,7 @@ namespace bloom { class BLOOMFRAMEWORK_API SceneManager; struct BLOOMFRAMEWORK_API Coord; - + class BLOOMFRAMEWORK_API Scene { using System = bloom::systems::DefaultSystem; friend bloom::systems::System::System(bloom::Scene & sceneObject); @@ -28,12 +28,16 @@ namespace bloom { void destroyGameObject(const std::string & tag); + void destroyAllGameObjects(); + // System stuff template std::shared_ptr registerSystem(); template void unregisterSystem(); + + void unregisterAllSystems(); template std::shared_ptr getSystemPtr(); diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index c465f761..01e45a7f 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -25,10 +25,8 @@ namespace bloom { template void SceneManager::changeScene(std::shared_ptr newScene) { - static_assert(std::is_base_of_v, "Type Scn passed in is not a Scene based"); + static_assert(std::is_base_of_v, "Type Scn passed in is not Scene based"); - if (m_currScene != nullptr) - m_currScene->unload(); newScene->load(); m_currScene = newScene; } diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index 962459b4..58d28eee 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -35,6 +35,14 @@ namespace bloom { m_gameObjects.erase(tag); } + void Scene::destroyAllGameObjects() { + m_gameObjects.clear(); + } + + void Scene::unregisterAllSystems() { + m_systems.clear(); + } + void Scene::setSceneRotation(double angle) { m_sceneRotateAngle = fmod(angle, 360.0); } diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index 0b3fa70a..2d9f2154 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -16,10 +16,6 @@ class TestScene : public bloom::Scene { public: using bloom::Scene::Scene; - ~TestScene() { - unload(); - } - void load() override { namespace fs = std::filesystem; fs::path workingDir = fs::path(getExePath()); From 4e06c1ddea04d9c7a261a7c7e9a1b91405266759 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 18 Jan 2019 23:26:43 +0800 Subject: [PATCH 68/88] [Scene] Add start and restart functions These functions will also set `m_sceneLoaded` to `true` --- BloomFramework/include/Scenes/Scene.h | 7 +++++++ BloomFramework/src/Scenes/Scene.cpp | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 10573ddf..d0568d08 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -19,7 +19,10 @@ namespace bloom { void update(double deltaTime); void draw(); + void start(); + void restart(); virtual void load() = 0; + Game & getGameInstance() { return m_gameInstance; } //Game Object stuff @@ -49,6 +52,8 @@ namespace bloom { void setSceneRotationCenter(Coord center); void setSceneRotationCenter(SDL_Point center); + bool isLoaded() { return m_sceneLoaded; } + protected: SceneManager & m_sceneManager; Game & m_gameInstance; @@ -59,6 +64,8 @@ namespace bloom { double m_sceneRotateAngle = 0.0; SDL_Point m_sceneRotateCenter; + + bool m_sceneLoaded = false; }; template void Scene::addGameObject(const std::string & tag, TArgs &&... initArgs) { diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index 58d28eee..255375bc 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -31,6 +31,18 @@ namespace bloom { SDL_RenderCopyEx(m_gameInstance.getRenderer(), m_sceneTexture, nullptr, nullptr, m_sceneRotateAngle, &m_sceneRotateCenter, SDL_FLIP_NONE); } + void Scene::start() { + load(); + m_sceneLoaded = true; + } + + void Scene::restart() { + unregisterAllSystems(); + destroyAllGameObjects(); + load(); + m_sceneLoaded = true; + } + void Scene::destroyGameObject(const std::string & tag) { m_gameObjects.erase(tag); } From a5824e83e78e3d9a536112f3ab5b52dd0f33350a Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 18 Jan 2019 23:32:56 +0800 Subject: [PATCH 69/88] [SceneManager] Don't execute `Scene::load` if already loaded This change allows `Scene`s to be swapped out while retaining their state. (Something like suspend) Of course something would need to store the Scene or it'll just simply unload. --- BloomFramework/include/Scenes/SceneManager.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index 01e45a7f..f0540bb2 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -29,5 +29,8 @@ namespace bloom { newScene->load(); m_currScene = newScene; + + if (!m_currScene->isLoaded()) + m_currScene->start(); } } \ No newline at end of file From 8b022e517a96c0f3c28118093957044b5c1fd791 Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Sun, 20 Jan 2019 00:39:42 +0300 Subject: [PATCH 70/88] [RenderQueue] Use `std::list::sort` instead of `std::stable_sort` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit as it's stable and doesnэt use extra memory --- BloomFramework/include/Systems/RenderSystem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 4fd5651e..d88cbadc 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -43,7 +43,7 @@ namespace bloom::systems { }); // Sort the sprites based on priority, higher number means rendered later. Same layer may fight - std::stable_sort(renderQueue.begin(), renderQueue.end(), [](const auto& lhs, const auto& rhs) { + renderQueue.sort([](const auto& lhs, const auto& rhs) { return std::get<3>(lhs) < std::get<3>(rhs); }); From 88c4f94ce747f9df86d41ec0460fb4a484b07d3e Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Sun, 20 Jan 2019 01:34:52 +0300 Subject: [PATCH 71/88] Use size_t as entity type --- BloomFramework/include/GameObject.h | 8 ++++---- BloomFramework/include/Scenes/Scene.h | 2 +- BloomFramework/include/Systems/DefaultSystem.h | 2 +- BloomFramework/src/GameObject.cpp | 4 ++-- Test Bench/GameObjectTest/TestGameObject.h | 9 ++++++--- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/BloomFramework/include/GameObject.h b/BloomFramework/include/GameObject.h index 8feb698e..94c33c61 100644 --- a/BloomFramework/include/GameObject.h +++ b/BloomFramework/include/GameObject.h @@ -19,16 +19,16 @@ namespace bloom { using Transform = bloom::components::Transform; public: - GameObject(entt::DefaultRegistry & registry, Game & gameInstance); + GameObject(entt::Registry & registry, Game & gameInstance); ~GameObject(); virtual void init() = 0; - uint32_t getEntityID(); + size_t getEntityID(); protected: - entt::DefaultRegistry & m_registry; + entt::Registry & m_registry; Game & m_gameInstance; - entt::DefaultRegistry::entity_type m_entity; + entt::Registry::entity_type m_entity; }; } \ No newline at end of file diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index d0568d08..619b9839 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -57,7 +57,7 @@ namespace bloom { protected: SceneManager & m_sceneManager; Game & m_gameInstance; - entt::DefaultRegistry m_registry; + entt::Registry m_registry; std::vector> m_systems; std::unordered_map> m_gameObjects; SDL_Texture * m_sceneTexture; diff --git a/BloomFramework/include/Systems/DefaultSystem.h b/BloomFramework/include/Systems/DefaultSystem.h index 02c4ce4a..c07cf4c5 100644 --- a/BloomFramework/include/Systems/DefaultSystem.h +++ b/BloomFramework/include/Systems/DefaultSystem.h @@ -16,7 +16,7 @@ namespace bloom { bool enabled = true; protected: bloom::Scene & parentScene; - entt::DefaultRegistry & m_registry; + entt::Registry & m_registry; }; using DefaultSystem = System; diff --git a/BloomFramework/src/GameObject.cpp b/BloomFramework/src/GameObject.cpp index e8c29c00..d0c46bfe 100644 --- a/BloomFramework/src/GameObject.cpp +++ b/BloomFramework/src/GameObject.cpp @@ -1,7 +1,7 @@ #include "GameObject.h" namespace bloom { - GameObject::GameObject(entt::DefaultRegistry & registry, Game & gameInstance) : m_registry(registry), m_gameInstance(gameInstance) { + GameObject::GameObject(entt::Registry & registry, Game & gameInstance) : m_registry(registry), m_gameInstance(gameInstance) { m_entity = m_registry.create(); } @@ -10,7 +10,7 @@ namespace bloom { m_registry.destroy(m_entity); } - uint32_t GameObject::getEntityID() { + size_t GameObject::getEntityID() { return m_entity; } } \ No newline at end of file diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index 28826eeb..aecab788 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -11,7 +11,7 @@ class TestChar : public bloom::GameObject { using Size = bloom::components::Size; using LayerGroup = bloom::components::LayerGroup; using Sprite = bloom::components::Sprite; - template + template using Label = bloom::components::Label; using bloom::GameObject::GameObject; @@ -27,9 +27,12 @@ class TestChar : public bloom::GameObject { m_registry.assign(m_entity, tmp, srcRect); if (priority != std::nullopt) - m_registry.assign(m_entity, priority.value()); + m_registry.assign(m_entity, priority.value_or(0)); - m_registry.assign>(m_entity); +#pragma warning(push) +#pragma warning(disable: 4307) + m_registry.assign("TestObject"_hs)>>(m_entity); +#pragma warning(pop) } void disableRandomPos() { From 9f8025b5c9865f034f97e018d9c4302301ce9f3a Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Sun, 20 Jan 2019 01:35:20 +0300 Subject: [PATCH 72/88] Use optional::value_or instead of optional::value --- Test Bench/GameObjectTest/SceneRotateSystem.h | 2 +- Test Bench/GameObjectTest/SpriteRotatorSystem.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Test Bench/GameObjectTest/SceneRotateSystem.h b/Test Bench/GameObjectTest/SceneRotateSystem.h index 5e3bff7c..b4c6dad7 100644 --- a/Test Bench/GameObjectTest/SceneRotateSystem.h +++ b/Test Bench/GameObjectTest/SceneRotateSystem.h @@ -11,7 +11,7 @@ class SceneRotateSystem : public bloom::systems::DefaultSystem { void update(std::optional deltaTime = std::nullopt) override { if (currentRotate != rotateAmount) { - m_currentAngle += rotateSpeed * (deltaTime.value() / 1000); + m_currentAngle += rotateSpeed * (deltaTime.value_or(0.0) / 1000); currentRotate = static_cast(m_currentAngle / 360.0); if (currentRotate == rotateAmount) { m_currentAngle = 0.0; diff --git a/Test Bench/GameObjectTest/SpriteRotatorSystem.h b/Test Bench/GameObjectTest/SpriteRotatorSystem.h index f307c784..4fff40b6 100644 --- a/Test Bench/GameObjectTest/SpriteRotatorSystem.h +++ b/Test Bench/GameObjectTest/SpriteRotatorSystem.h @@ -11,7 +11,7 @@ class SpriteRotatorSystem : public bloom::systems::DefaultSystem { void update(std::optional deltaTime = std::nullopt) override { if (currentRotate != rotateAmount) { - m_currentAngle += rotateSpeed * (deltaTime.value() / 1000); + m_currentAngle += rotateSpeed * (deltaTime.value_or(0.0) / 1000); currentRotate = static_cast(m_currentAngle / 360.0); currentRotate = static_cast(m_currentAngle / 360.0); if (currentRotate == rotateAmount) { From 5861b67b8b03c8f1bfbcfbc56ff3609ad347423b Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Sun, 20 Jan 2019 02:59:45 +0300 Subject: [PATCH 73/88] Never use slow `std::list`, never --- BloomFramework/include/Systems/RenderSystem.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index d88cbadc..4b93a1fb 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -18,9 +18,11 @@ namespace bloom::systems { ~RenderSystem() = default; void update(std::optional deltaTime = std::nullopt) override { - std::list> renderQueue; + std::vector> renderQueue; + auto view = m_registry.view(); + renderQueue.reserve(view.size()); - m_registry.view().each( + view.each( [&](auto entity, Transform& trans, Sprite& spr) { if (trans.size.w < 0) @@ -43,9 +45,11 @@ namespace bloom::systems { }); // Sort the sprites based on priority, higher number means rendered later. Same layer may fight - renderQueue.sort([](const auto& lhs, const auto& rhs) { - return std::get<3>(lhs) < std::get<3>(rhs); - }); + std::stable_sort(renderQueue.begin(), renderQueue.end(), + [](const auto& lhs, const auto& rhs) { + return std::get<3>(lhs) < std::get<3>(rhs); + } + ); // Render for (auto& [spr, rot, destRect, lg] : renderQueue) From c802ab46098278e0db864e15e23276d6da6cc604 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 23 Jan 2019 23:53:21 +0800 Subject: [PATCH 74/88] Optimize LayerGroup sorting Don't sort the `renderQueue` every frame. Instead, sort the whole GO list on every new `GameObject`. This should provide the same effect, while improving performance. --- BloomFramework/include/Scenes/Scene.h | 3 +++ BloomFramework/include/Systems/RenderSystem.h | 23 +++---------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 619b9839..0b1a52c9 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -4,6 +4,7 @@ #include "Systems/DefaultSystem.h" #include "GameObject.h" #include "Exception.h" +#include "Components/LayerGroup.h" namespace bloom { class BLOOMFRAMEWORK_API SceneManager; @@ -75,6 +76,8 @@ namespace bloom { obj->init(std::forward(initArgs)...); m_gameObjects.emplace(tag, std::unique_ptr(obj)); + + m_registry.sort([](auto& lhs, auto& rhs) {return lhs < rhs; }); } // System stuff diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 4b93a1fb..8768a85b 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -18,11 +18,7 @@ namespace bloom::systems { ~RenderSystem() = default; void update(std::optional deltaTime = std::nullopt) override { - std::vector> renderQueue; - auto view = m_registry.view(); - renderQueue.reserve(view.size()); - - view.each( + m_registry.view().each( [&](auto entity, Transform& trans, Sprite& spr) { if (trans.size.w < 0) @@ -38,22 +34,9 @@ namespace bloom::systems { trans.size.h }; - LayerGroup layerNo = (m_registry.has(entity) ? m_registry.get(entity) : 0); - - // Place sprites into queue for sorting later. - renderQueue.emplace_back(std::make_tuple(spr, trans.rotation, destRect, layerNo)); + // Draw sprite to scene texture + spr.texture->render(spr.srcRect, destRect, trans.rotation); }); - - // Sort the sprites based on priority, higher number means rendered later. Same layer may fight - std::stable_sort(renderQueue.begin(), renderQueue.end(), - [](const auto& lhs, const auto& rhs) { - return std::get<3>(lhs) < std::get<3>(rhs); - } - ); - - // Render - for (auto& [spr, rot, destRect, lg] : renderQueue) - spr.texture->render(spr.srcRect, destRect, rot); } private: From cd8e310c41f7f881c82e1f85985c04b27f124bdc Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 25 Jan 2019 21:41:57 +0800 Subject: [PATCH 75/88] [TestChar] Always assign a `LayerGroup` component I'm not quite clear on how the registry sorting works, so I'm playing safe here. --- Test Bench/GameObjectTest/TestGameObject.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index aecab788..548c4386 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -26,8 +26,7 @@ class TestChar : public bloom::GameObject { auto tmp = m_gameInstance.textures.load(texturePath); m_registry.assign(m_entity, tmp, srcRect); - if (priority != std::nullopt) - m_registry.assign(m_entity, priority.value_or(0)); + m_registry.assign(m_entity, priority.value_or(0)); #pragma warning(push) #pragma warning(disable: 4307) From d10a4d832334609f1ea9554961140b14e2d1db1e Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Fri, 25 Jan 2019 17:12:53 +0300 Subject: [PATCH 76/88] Bring back std::stable_sort:) --- BloomFramework/BloomFramework.vcxproj | 1 + BloomFramework/BloomFramework.vcxproj.filters | 3 ++ BloomFramework/include/Scenes/Scene.h | 3 +- BloomFramework/include/StdStableSort.h | 38 +++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 BloomFramework/include/StdStableSort.h diff --git a/BloomFramework/BloomFramework.vcxproj b/BloomFramework/BloomFramework.vcxproj index ce89fc9d..b88db8eb 100644 --- a/BloomFramework/BloomFramework.vcxproj +++ b/BloomFramework/BloomFramework.vcxproj @@ -191,6 +191,7 @@ + diff --git a/BloomFramework/BloomFramework.vcxproj.filters b/BloomFramework/BloomFramework.vcxproj.filters index 065b5ad9..282e3358 100644 --- a/BloomFramework/BloomFramework.vcxproj.filters +++ b/BloomFramework/BloomFramework.vcxproj.filters @@ -212,6 +212,9 @@ Header Files\Components + + Header Files + diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 0b1a52c9..0530a497 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -5,6 +5,7 @@ #include "GameObject.h" #include "Exception.h" #include "Components/LayerGroup.h" +#include "StdStableSort.h" namespace bloom { class BLOOMFRAMEWORK_API SceneManager; @@ -77,7 +78,7 @@ namespace bloom { m_gameObjects.emplace(tag, std::unique_ptr(obj)); - m_registry.sort([](auto& lhs, auto& rhs) {return lhs < rhs; }); + m_registry.sort, misc::StdStableSort>(std::less{}); } // System stuff diff --git a/BloomFramework/include/StdStableSort.h b/BloomFramework/include/StdStableSort.h new file mode 100644 index 00000000..c9584388 --- /dev/null +++ b/BloomFramework/include/StdStableSort.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include + +namespace bloom::misc { + // Keep docs from entity ;) + + /** + * @brief Function object to wrap `std::stable_sort` in a class type. + * + * Unfortunately, `std::stable_sort` cannot be passed as template argument to a class + * template or a function template.
+ * This class fills the gap by wrapping some flavors of `std::stable_sort` in a + * function object. + */ + struct StdStableSort final { + /** + * @brief Sorts the elements in a range. + * + * Sorts the elements in a range using the given binary comparison function. + * The order of equivalent elements is guaranteed to be preserved. + * + * @tparam It Type of random access iterator. + * @tparam Compare Type of comparison function object. + * @tparam Args Types of arguments to forward to the sort function. + * @param first An iterator to the first element of the range to sort. + * @param last An iterator past the last element of the range to sort. + * @param compare A valid comparison function object. + * @param args Arguments to forward to the sort function, if any. + */ + template, typename... Args> + void operator()(It first, It last, Compare compare = Compare{}, Args &&... args) const { + std::stable_sort(std::forward(args)..., std::move(first), std::move(last), std::move(compare)); + } + }; +} \ No newline at end of file From acd2a7b74e32e4b7f13216a402effebfcf601d06 Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Fri, 25 Jan 2019 17:16:44 +0300 Subject: [PATCH 77/88] Revert "Use size_t as entity type" This reverts commit 88c4f94ce747f9df86d41ec0460fb4a484b07d3e. --- BloomFramework/include/GameObject.h | 8 ++++---- BloomFramework/include/Scenes/Scene.h | 2 +- BloomFramework/include/Systems/DefaultSystem.h | 2 +- BloomFramework/src/GameObject.cpp | 4 ++-- Test Bench/GameObjectTest/TestGameObject.h | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/BloomFramework/include/GameObject.h b/BloomFramework/include/GameObject.h index 94c33c61..8feb698e 100644 --- a/BloomFramework/include/GameObject.h +++ b/BloomFramework/include/GameObject.h @@ -19,16 +19,16 @@ namespace bloom { using Transform = bloom::components::Transform; public: - GameObject(entt::Registry & registry, Game & gameInstance); + GameObject(entt::DefaultRegistry & registry, Game & gameInstance); ~GameObject(); virtual void init() = 0; - size_t getEntityID(); + uint32_t getEntityID(); protected: - entt::Registry & m_registry; + entt::DefaultRegistry & m_registry; Game & m_gameInstance; - entt::Registry::entity_type m_entity; + entt::DefaultRegistry::entity_type m_entity; }; } \ No newline at end of file diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 0530a497..2312d727 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -59,7 +59,7 @@ namespace bloom { protected: SceneManager & m_sceneManager; Game & m_gameInstance; - entt::Registry m_registry; + entt::DefaultRegistry m_registry; std::vector> m_systems; std::unordered_map> m_gameObjects; SDL_Texture * m_sceneTexture; diff --git a/BloomFramework/include/Systems/DefaultSystem.h b/BloomFramework/include/Systems/DefaultSystem.h index c07cf4c5..02c4ce4a 100644 --- a/BloomFramework/include/Systems/DefaultSystem.h +++ b/BloomFramework/include/Systems/DefaultSystem.h @@ -16,7 +16,7 @@ namespace bloom { bool enabled = true; protected: bloom::Scene & parentScene; - entt::Registry & m_registry; + entt::DefaultRegistry & m_registry; }; using DefaultSystem = System; diff --git a/BloomFramework/src/GameObject.cpp b/BloomFramework/src/GameObject.cpp index d0c46bfe..e8c29c00 100644 --- a/BloomFramework/src/GameObject.cpp +++ b/BloomFramework/src/GameObject.cpp @@ -1,7 +1,7 @@ #include "GameObject.h" namespace bloom { - GameObject::GameObject(entt::Registry & registry, Game & gameInstance) : m_registry(registry), m_gameInstance(gameInstance) { + GameObject::GameObject(entt::DefaultRegistry & registry, Game & gameInstance) : m_registry(registry), m_gameInstance(gameInstance) { m_entity = m_registry.create(); } @@ -10,7 +10,7 @@ namespace bloom { m_registry.destroy(m_entity); } - size_t GameObject::getEntityID() { + uint32_t GameObject::getEntityID() { return m_entity; } } \ No newline at end of file diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index 548c4386..c3986b94 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -11,7 +11,7 @@ class TestChar : public bloom::GameObject { using Size = bloom::components::Size; using LayerGroup = bloom::components::LayerGroup; using Sprite = bloom::components::Sprite; - template + template using Label = bloom::components::Label; using bloom::GameObject::GameObject; @@ -30,7 +30,7 @@ class TestChar : public bloom::GameObject { #pragma warning(push) #pragma warning(disable: 4307) - m_registry.assign("TestObject"_hs)>>(m_entity); + m_registry.assign>(m_entity); #pragma warning(pop) } From dbd1e1349f4a0adab42319ed5c4738d4ed5969ff Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Tue, 29 Jan 2019 21:28:59 +0800 Subject: [PATCH 78/88] Remove pure virtual init function --- BloomFramework/include/GameObject.h | 2 +- Test Bench/GameObjectTest/TestAnimatedGameObject.h | 2 -- Test Bench/GameObjectTest/TestGameObject.h | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/BloomFramework/include/GameObject.h b/BloomFramework/include/GameObject.h index 8feb698e..8ea0124b 100644 --- a/BloomFramework/include/GameObject.h +++ b/BloomFramework/include/GameObject.h @@ -22,7 +22,7 @@ namespace bloom { GameObject(entt::DefaultRegistry & registry, Game & gameInstance); ~GameObject(); - virtual void init() = 0; + // Implement an init() function pls... uint32_t getEntityID(); diff --git a/Test Bench/GameObjectTest/TestAnimatedGameObject.h b/Test Bench/GameObjectTest/TestAnimatedGameObject.h index 8ead0fa9..d00d2afb 100644 --- a/Test Bench/GameObjectTest/TestAnimatedGameObject.h +++ b/Test Bench/GameObjectTest/TestAnimatedGameObject.h @@ -14,8 +14,6 @@ class TestAnimChar : public bloom::GameObject { using bloom::GameObject::GameObject; public: - void init() override {} - void init(const std::filesystem::path texturePath = "Assets/TestChar.png") { Transform trans = { Position(0,0,bloom::relative), 0.0f, Size{256, 256} }; m_registry.assign(m_entity, trans); diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index c3986b94..aad4986d 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -17,8 +17,6 @@ class TestChar : public bloom::GameObject { using bloom::GameObject::GameObject; public: - void init() override {} - void init(Position pos, Size size, const std::filesystem::path texturePath, std::optional srcRect = std::nullopt, std::optional priority = std::nullopt) { Transform trans = { pos, 0.0f, size }; From dccd92e89920dbf577803288710404985ebd1327 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Tue, 29 Jan 2019 21:38:34 +0800 Subject: [PATCH 79/88] Add check to ensure init function exists This doesn't check whether the arguments provided are valid though --- BloomFramework/include/Scenes/Scene.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 2312d727..6581150c 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -7,6 +7,30 @@ #include "Components/LayerGroup.h" #include "StdStableSort.h" +template +class hasInit +{ + typedef char one; + typedef long two; + + //using C++11 decltype - but it works with + //typeof or __typeof__ on GCC compiler + template + static one test(decltype(&C::init)); + + template + static two test(...); + + +public: + static constexpr bool check() + { + return (sizeof(test(0)) == sizeof(char)); + + } +}; + + namespace bloom { class BLOOMFRAMEWORK_API SceneManager; struct BLOOMFRAMEWORK_API Coord; @@ -74,6 +98,7 @@ namespace bloom { static_assert(std::is_base_of_v, "Type GO passed in is not GameObject based"); GO* obj = new GO(m_registry, m_gameInstance); + static_assert(hasInit::check(), "Type GO passed in does not have valid init function."); obj->init(std::forward(initArgs)...); m_gameObjects.emplace(tag, std::unique_ptr(obj)); From 2250ada6ed0d8efafb811727a6b702fbe5d2462a Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Sat, 2 Feb 2019 01:33:05 +0300 Subject: [PATCH 80/88] NoInit v3 --- BloomFramework/include/Scenes/Scene.h | 37 ++++--------------- .../GameObjectTest/TestAnimatedGameObject.h | 2 +- Test Bench/GameObjectTest/TestGameObject.h | 4 +- Test Bench/TestScene.h | 8 ++-- 4 files changed, 15 insertions(+), 36 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 6581150c..08c83137 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -7,30 +7,6 @@ #include "Components/LayerGroup.h" #include "StdStableSort.h" -template -class hasInit -{ - typedef char one; - typedef long two; - - //using C++11 decltype - but it works with - //typeof or __typeof__ on GCC compiler - template - static one test(decltype(&C::init)); - - template - static two test(...); - - -public: - static constexpr bool check() - { - return (sizeof(test(0)) == sizeof(char)); - - } -}; - - namespace bloom { class BLOOMFRAMEWORK_API SceneManager; struct BLOOMFRAMEWORK_API Coord; @@ -52,8 +28,8 @@ namespace bloom { Game & getGameInstance() { return m_gameInstance; } //Game Object stuff - template - void addGameObject(const std::string & tag, TArgs &&... initArgs); + template + void addGameObject(const std::string & tag, InitFunc init, TArgs &&... initArgs); void destroyGameObject(const std::string & tag); @@ -94,12 +70,15 @@ namespace bloom { bool m_sceneLoaded = false; }; - template void Scene::addGameObject(const std::string & tag, TArgs &&... initArgs) { + template + void Scene::addGameObject(const std::string & tag, InitFunc init, TArgs &&... initArgs) { static_assert(std::is_base_of_v, "Type GO passed in is not GameObject based"); GO* obj = new GO(m_registry, m_gameInstance); - static_assert(hasInit::check(), "Type GO passed in does not have valid init function."); - obj->init(std::forward(initArgs)...); + if constexpr (std::is_member_function_pointer_v) + (obj->*init)(std::forward(initArgs)...); + else + init(obj, std::forward(initArgs)...); // std::mem_fn m_gameObjects.emplace(tag, std::unique_ptr(obj)); diff --git a/Test Bench/GameObjectTest/TestAnimatedGameObject.h b/Test Bench/GameObjectTest/TestAnimatedGameObject.h index d00d2afb..5fc24f01 100644 --- a/Test Bench/GameObjectTest/TestAnimatedGameObject.h +++ b/Test Bench/GameObjectTest/TestAnimatedGameObject.h @@ -14,7 +14,7 @@ class TestAnimChar : public bloom::GameObject { using bloom::GameObject::GameObject; public: - void init(const std::filesystem::path texturePath = "Assets/TestChar.png") { + void init(const std::filesystem::path& texturePath) { Transform trans = { Position(0,0,bloom::relative), 0.0f, Size{256, 256} }; m_registry.assign(m_entity, trans); diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index aad4986d..e41c7c7a 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -17,14 +17,14 @@ class TestChar : public bloom::GameObject { using bloom::GameObject::GameObject; public: - void init(Position pos, Size size, const std::filesystem::path texturePath, std::optional srcRect = std::nullopt, std::optional priority = std::nullopt) { + void init(Position pos, Size size, const std::filesystem::path& texturePath, std::optional srcRect, uint32_t priority) { Transform trans = { pos, 0.0f, size }; m_registry.assign(m_entity, trans); auto tmp = m_gameInstance.textures.load(texturePath); m_registry.assign(m_entity, tmp, srcRect); - m_registry.assign(m_entity, priority.value_or(0)); + m_registry.assign(m_entity, priority); #pragma warning(push) #pragma warning(disable: 4307) diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index 2d9f2154..ec1f204e 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -23,10 +23,10 @@ class TestScene : public bloom::Scene { fs::path spriteSheetPath = workingDir / assetsDir / "OverworldTestSpritesheet.png"; fs::path testCharPath = workingDir / assetsDir / "TestChar.png"; - addGameObject("testSprite", Position(10, 10), Size{ 128, 128 }, spriteSheetPath, SDL_Rect{ 0, 0, 32, 32 }); - addGameObject("testSprite2", Position(0, 0, bloom::relative), Size{ 128, 128 }, testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); - addGameObject("testGO", Position(50, 50, bloom::relative, (bloom::middle | bloom::right)), Size{ 256, 256 }, testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); - addGameObject("testAnimatedSprite", testCharPath); + addGameObject("testSprite", &TestChar::init, Position(10, 10), Size{ 128, 128 }, spriteSheetPath, SDL_Rect{ 0, 0, 32, 32 }, 0); + addGameObject("testSprite2", std::mem_fn(&TestChar::init), Position(0, 0, bloom::relative), Size{ 128, 128 }, testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); + addGameObject("testGO", &TestChar::init, Position(50, 50, bloom::relative, (bloom::middle | bloom::right)), Size{ 256, 256 }, testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); + addGameObject("testAnimatedSprite", &TestAnimChar::init, testCharPath); registerSystem()->enabled = false; // Still wonky because of Coord change. We also don't want to start it immediately. registerSystem(); From e41456a207d80cb17e4752aebf5ddee82710b9d4 Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Thu, 7 Feb 2019 17:22:09 +0300 Subject: [PATCH 81/88] Test lambda support. DON'T MERGE THIS! --- BloomFramework/include/GameObject.h | 1 - Test Bench/TestScene.h | 16 +++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/BloomFramework/include/GameObject.h b/BloomFramework/include/GameObject.h index 8ea0124b..7de789ae 100644 --- a/BloomFramework/include/GameObject.h +++ b/BloomFramework/include/GameObject.h @@ -26,7 +26,6 @@ namespace bloom { uint32_t getEntityID(); - protected: entt::DefaultRegistry & m_registry; Game & m_gameInstance; entt::DefaultRegistry::entity_type m_entity; diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index ec1f204e..371a707d 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -23,7 +23,21 @@ class TestScene : public bloom::Scene { fs::path spriteSheetPath = workingDir / assetsDir / "OverworldTestSpritesheet.png"; fs::path testCharPath = workingDir / assetsDir / "TestChar.png"; - addGameObject("testSprite", &TestChar::init, Position(10, 10), Size{ 128, 128 }, spriteSheetPath, SDL_Rect{ 0, 0, 32, 32 }, 0); + auto init = [](TestChar * ptr, Position pos, Size size, const std::filesystem::path & texturePath, std::optional srcRect = std::nullopt, uint32_t priority = 0) { + bloom::components::Transform trans = { pos, 0.0f, size }; + ptr->m_registry.assign(ptr->m_entity, trans); + auto tmp = ptr->m_gameInstance.textures.load(texturePath); + ptr->m_registry.assign(ptr->m_entity, tmp, srcRect); + + ptr->m_registry.assign(ptr->m_entity, priority); + +#pragma warning(push) +#pragma warning(disable: 4307) + ptr->m_registry.assign>(ptr->m_entity); +#pragma warning(pop) + }; + + addGameObject("testSprite", init, Position(10, 10), Size{ 128, 128 }, spriteSheetPath, SDL_Rect{ 0, 0, 32, 32 }); addGameObject("testSprite2", std::mem_fn(&TestChar::init), Position(0, 0, bloom::relative), Size{ 128, 128 }, testCharPath, SDL_Rect{ 0, 0, 32, 32 }, 2); addGameObject("testGO", &TestChar::init, Position(50, 50, bloom::relative, (bloom::middle | bloom::right)), Size{ 256, 256 }, testCharPath, SDL_Rect{ 64, 96, 32, 32 }, 3); addGameObject("testAnimatedSprite", &TestAnimChar::init, testCharPath); From d1d4b9d394c05f13496ad632585b61d626cb3d94 Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Fri, 8 Feb 2019 00:11:53 +0300 Subject: [PATCH 82/88] Update GameObject's names and types --- BloomFramework/include/GameObject.h | 20 +++++-------------- BloomFramework/src/GameObject.cpp | 16 +++++++-------- .../GameObjectTest/TestAnimatedGameObject.h | 14 ++++++------- Test Bench/GameObjectTest/TestGameObject.h | 16 +++++++-------- Test Bench/TestScene.h | 10 +++++----- 5 files changed, 32 insertions(+), 44 deletions(-) diff --git a/BloomFramework/include/GameObject.h b/BloomFramework/include/GameObject.h index 7de789ae..30459c51 100644 --- a/BloomFramework/include/GameObject.h +++ b/BloomFramework/include/GameObject.h @@ -9,25 +9,15 @@ namespace bloom { * This class is used to make a sort of prefab object. * * This class by default will create an entity with the registry provided. - * The entity will be assigned with bloom::Position since it is expected that an entity would have position. - * - * Use the init() function to assign/replace/reset any Components required. * * The destructor will automatically destroy the entity from the registry when GameObject gets out of scope. */ - class BLOOMFRAMEWORK_API GameObject { - using Transform = bloom::components::Transform; + struct BLOOMFRAMEWORK_API GameObject { + entt::DefaultRegistry& registry; + Game& gameInstance; + const entt::DefaultRegistry::entity_type entity; - public: - GameObject(entt::DefaultRegistry & registry, Game & gameInstance); + GameObject(entt::DefaultRegistry& registry, Game& gameInstance); ~GameObject(); - - // Implement an init() function pls... - - uint32_t getEntityID(); - - entt::DefaultRegistry & m_registry; - Game & m_gameInstance; - entt::DefaultRegistry::entity_type m_entity; }; } \ No newline at end of file diff --git a/BloomFramework/src/GameObject.cpp b/BloomFramework/src/GameObject.cpp index e8c29c00..12898e0c 100644 --- a/BloomFramework/src/GameObject.cpp +++ b/BloomFramework/src/GameObject.cpp @@ -1,16 +1,14 @@ #include "GameObject.h" namespace bloom { - GameObject::GameObject(entt::DefaultRegistry & registry, Game & gameInstance) : m_registry(registry), m_gameInstance(gameInstance) { - m_entity = m_registry.create(); - } + GameObject::GameObject(entt::DefaultRegistry& registry, Game& gameInstance) : + registry(registry), + gameInstance(gameInstance), + entity(registry.create()) + {} GameObject::~GameObject() { - if (m_registry.valid(m_entity)) - m_registry.destroy(m_entity); - } - - uint32_t GameObject::getEntityID() { - return m_entity; + if (registry.valid(entity)) + registry.destroy(entity); } } \ No newline at end of file diff --git a/Test Bench/GameObjectTest/TestAnimatedGameObject.h b/Test Bench/GameObjectTest/TestAnimatedGameObject.h index 5fc24f01..2aa74804 100644 --- a/Test Bench/GameObjectTest/TestAnimatedGameObject.h +++ b/Test Bench/GameObjectTest/TestAnimatedGameObject.h @@ -11,16 +11,16 @@ class TestAnimChar : public bloom::GameObject { using Animation = bloom::components::Animation; using AnimationSet = bloom::components::AnimationSet; using Transform = bloom::components::Transform; - using bloom::GameObject::GameObject; + using GameObject::GameObject; public: void init(const std::filesystem::path& texturePath) { Transform trans = { Position(0,0,bloom::relative), 0.0f, Size{256, 256} }; - m_registry.assign(m_entity, trans); + registry.assign(entity, trans); - auto tmp = m_gameInstance.textures.load(texturePath); + auto tmp = gameInstance.textures.load(texturePath); - m_registry.assign(m_entity, tmp, SDL_Rect{ 0,32,32,32 }); + registry.assign(entity, tmp, SDL_Rect{ 0,32,32,32 }); // Seriously not the best way to initialize object animation. @@ -68,8 +68,8 @@ class TestAnimChar : public bloom::GameObject { animSet.add("left", left); animSet.add("right", right); - m_registry.assign(m_entity, animSet); - m_registry.assign(m_entity, up); - m_registry.assign(m_entity); + registry.assign(entity, animSet); + registry.assign(entity, up); + registry.assign(entity); } }; \ No newline at end of file diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index e41c7c7a..d8ff3c81 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -14,29 +14,29 @@ class TestChar : public bloom::GameObject { template using Label = bloom::components::Label; - using bloom::GameObject::GameObject; + using GameObject::GameObject; public: void init(Position pos, Size size, const std::filesystem::path& texturePath, std::optional srcRect, uint32_t priority) { Transform trans = { pos, 0.0f, size }; - m_registry.assign(m_entity, trans); - auto tmp = m_gameInstance.textures.load(texturePath); - m_registry.assign(m_entity, tmp, srcRect); + registry.assign(entity, trans); + auto tmp = gameInstance.textures.load(texturePath); + registry.assign(entity, tmp, srcRect); - m_registry.assign(m_entity, priority); + registry.assign(entity, priority); #pragma warning(push) #pragma warning(disable: 4307) - m_registry.assign>(m_entity); + registry.assign>(entity); #pragma warning(pop) } void disableRandomPos() { - m_registry.assign(m_entity); + registry.assign(entity); } void enableRandomPos() { - m_registry.reset(m_entity); + registry.reset(entity); } }; \ No newline at end of file diff --git a/Test Bench/TestScene.h b/Test Bench/TestScene.h index 371a707d..13ab93f8 100644 --- a/Test Bench/TestScene.h +++ b/Test Bench/TestScene.h @@ -25,15 +25,15 @@ class TestScene : public bloom::Scene { auto init = [](TestChar * ptr, Position pos, Size size, const std::filesystem::path & texturePath, std::optional srcRect = std::nullopt, uint32_t priority = 0) { bloom::components::Transform trans = { pos, 0.0f, size }; - ptr->m_registry.assign(ptr->m_entity, trans); - auto tmp = ptr->m_gameInstance.textures.load(texturePath); - ptr->m_registry.assign(ptr->m_entity, tmp, srcRect); + ptr->registry.assign(ptr->entity, trans); + auto tmp = ptr->gameInstance.textures.load(texturePath); + ptr->registry.assign(ptr->entity, tmp, srcRect); - ptr->m_registry.assign(ptr->m_entity, priority); + ptr->registry.assign(ptr->entity, priority); #pragma warning(push) #pragma warning(disable: 4307) - ptr->m_registry.assign>(ptr->m_entity); + ptr->registry.assign>(ptr->entity); #pragma warning(pop) }; From 6d31d8ae4fabf0136234d4656c17fa70e2d846cd Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Fri, 8 Feb 2019 00:12:45 +0300 Subject: [PATCH 83/88] Disable dat fckin' console spam --- BloomFramework/src/Game.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index aeb44cbf..3a363311 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -124,9 +124,9 @@ namespace bloom { } void Game::update() { - double dt = timer.lap(); - sceneManager.update(dt); - std::clog << "Delta Time: " << dt << "ms" << std::endl; + //double dt = timer.lap(); + sceneManager.update(timer.lap()); + //std::clog << "Delta Time: " << dt << "ms" << std::endl; } void Game::clear() { From 87d186ac1920387ba863c146395692f5db40b110 Mon Sep 17 00:00:00 2001 From: Anatoly Pitikin Date: Wed, 13 Feb 2019 21:53:16 +0300 Subject: [PATCH 84/88] Use more template power --- BloomFramework/include/Scenes/Scene.h | 24 +++++++++++--------- BloomFramework/include/Scenes/SceneManager.h | 7 +++--- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/BloomFramework/include/Scenes/Scene.h b/BloomFramework/include/Scenes/Scene.h index 08c83137..adbe2901 100644 --- a/BloomFramework/include/Scenes/Scene.h +++ b/BloomFramework/include/Scenes/Scene.h @@ -28,7 +28,7 @@ namespace bloom { Game & getGameInstance() { return m_gameInstance; } //Game Object stuff - template + template>, typename... TArgs> void addGameObject(const std::string & tag, InitFunc init, TArgs &&... initArgs); void destroyGameObject(const std::string & tag); @@ -36,15 +36,15 @@ namespace bloom { void destroyAllGameObjects(); // System stuff - template + template>> std::shared_ptr registerSystem(); - template + template>> void unregisterSystem(); void unregisterAllSystems(); - template + template>> std::shared_ptr getSystemPtr(); // Rotation stuff @@ -70,7 +70,7 @@ namespace bloom { bool m_sceneLoaded = false; }; - template + template void Scene::addGameObject(const std::string & tag, InitFunc init, TArgs &&... initArgs) { static_assert(std::is_base_of_v, "Type GO passed in is not GameObject based"); @@ -86,8 +86,9 @@ namespace bloom { } // System stuff - template std::shared_ptr Scene::registerSystem() { - static_assert (std::is_base_of_v, "Type S passed in is not System based"); + template + std::shared_ptr Scene::registerSystem() { + //static_assert (std::is_base_of_v, "Type S passed in is not System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), [](auto & i) -> bool { return typeid(*i) == typeid(S); }); v == m_systems.end()) @@ -100,8 +101,9 @@ namespace bloom { } } - template void Scene::unregisterSystem() { - static_assert (std::is_base_of_v, "Type S passed in is not System based"); + template + void Scene::unregisterSystem() { + //static_assert (std::is_base_of_v, "Type S passed in is not System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), [](auto & i) -> bool { return typeid(*i) == typeid(S); }); v != m_systems.end()) @@ -113,10 +115,10 @@ namespace bloom { } } - template + template std::shared_ptr Scene::getSystemPtr() { - static_assert (std::is_base_of_v, "Type S passed in is not System based"); + //static_assert (std::is_base_of_v, "Type S passed in is not System based"); if (auto v = std::find_if(m_systems.begin(), m_systems.end(), [](auto & i) -> bool { return typeid(*i) == typeid(S); }); v != m_systems.end()) diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index f0540bb2..7e018b94 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -12,7 +12,8 @@ namespace bloom { public: SceneManager(Game& gameInstance); - template void changeScene(std::shared_ptr newScene); + template>> + void changeScene(std::shared_ptr newScene); void update(double deltaTime); void draw(); @@ -23,9 +24,9 @@ namespace bloom { Game & m_gameInstance; }; - template + template void SceneManager::changeScene(std::shared_ptr newScene) { - static_assert(std::is_base_of_v, "Type Scn passed in is not Scene based"); + //static_assert(std::is_base_of_v, "Type Scn passed in is not Scene based"); newScene->load(); m_currScene = newScene; From dd9c49f6b79d04a8f937cb9e9f70e37f212ddbd1 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 27 Mar 2019 19:19:07 +0800 Subject: [PATCH 85/88] [SceneManager] Remove unused thisPtr --- BloomFramework/include/Scenes/SceneManager.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/BloomFramework/include/Scenes/SceneManager.h b/BloomFramework/include/Scenes/SceneManager.h index 7e018b94..aaffbd7a 100644 --- a/BloomFramework/include/Scenes/SceneManager.h +++ b/BloomFramework/include/Scenes/SceneManager.h @@ -17,8 +17,6 @@ namespace bloom { void update(double deltaTime); void draw(); - const SceneManager * thisPtr = this; - private: std::shared_ptr m_currScene; Game & m_gameInstance; From d8c5dc188737b2fa64b5ab3cd846553e8d534b58 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 27 Mar 2019 19:31:46 +0800 Subject: [PATCH 86/88] Fix CodeFactor issues --- BloomFramework/include/Systems/RenderSystem.h | 1 - Test Bench/GameObjectTest/SceneRotateSystem.h | 1 - Test Bench/GameObjectTest/TestGameObject.h | 3 +-- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/BloomFramework/include/Systems/RenderSystem.h b/BloomFramework/include/Systems/RenderSystem.h index 8768a85b..536c30a1 100644 --- a/BloomFramework/include/Systems/RenderSystem.h +++ b/BloomFramework/include/Systems/RenderSystem.h @@ -20,7 +20,6 @@ namespace bloom::systems { void update(std::optional deltaTime = std::nullopt) override { m_registry.view().each( [&](auto entity, Transform& trans, Sprite& spr) { - if (trans.size.w < 0) trans.size.w = 0; if (trans.size.h < 0) diff --git a/Test Bench/GameObjectTest/SceneRotateSystem.h b/Test Bench/GameObjectTest/SceneRotateSystem.h index b4c6dad7..c03a1558 100644 --- a/Test Bench/GameObjectTest/SceneRotateSystem.h +++ b/Test Bench/GameObjectTest/SceneRotateSystem.h @@ -27,5 +27,4 @@ class SceneRotateSystem : public bloom::systems::DefaultSystem { private: double m_currentAngle = 0.0; - }; \ No newline at end of file diff --git a/Test Bench/GameObjectTest/TestGameObject.h b/Test Bench/GameObjectTest/TestGameObject.h index d8ff3c81..cca1c57e 100644 --- a/Test Bench/GameObjectTest/TestGameObject.h +++ b/Test Bench/GameObjectTest/TestGameObject.h @@ -17,8 +17,7 @@ class TestChar : public bloom::GameObject { using GameObject::GameObject; public: - void init(Position pos, Size size, const std::filesystem::path& texturePath, std::optional srcRect, uint32_t priority) { - + void init(Position pos, Size size, const std::filesystem::path& texturePath, std::optional srcRect, uint32_t priority) { Transform trans = { pos, 0.0f, size }; registry.assign(entity, trans); auto tmp = gameInstance.textures.load(texturePath); From 92591858670fef01b8aa9fa58877ac916ea1ee52 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Wed, 27 Mar 2019 19:34:19 +0800 Subject: [PATCH 87/88] [MISC] Reduce volume for background music Protect eardrums and reduce scares XD. --- Test Bench/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test Bench/main.cpp b/Test Bench/main.cpp index a123c173..16f5393b 100644 --- a/Test Bench/main.cpp +++ b/Test Bench/main.cpp @@ -27,7 +27,7 @@ inline int rstep(int n) { void test_player(const std::filesystem::path& musicPath, const std::filesystem::path& soundsPath) { //MusicTrack track1{ musicPath / L"music_007.mp3" }; - + music.queue.setVolume(15.0); music.push(musicPath / L"music_001.mp3"); music.push(musicPath / L"music_002.mp3"); music.push(musicPath / L"music_003.mp3"); From 787cecbaee6b4db9664b1b9826311b35ca729623 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 30 Mar 2019 19:55:41 +0800 Subject: [PATCH 88/88] [Scene] Scene textures should be transparent `SDL_RenderClear()` caused the texture to be the set render color and it'll blend onto whatever that is underneath the scene. (Didn't happen with all colors, but still a problem. --- BloomFramework/src/Game.cpp | 5 +---- BloomFramework/src/Scenes/Scene.cpp | 3 ++- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/BloomFramework/src/Game.cpp b/BloomFramework/src/Game.cpp index 4c00c451..8158b854 100644 --- a/BloomFramework/src/Game.cpp +++ b/BloomFramework/src/Game.cpp @@ -130,7 +130,7 @@ namespace bloom { } void Game::clear() { - SDL_SetRenderTarget(m_renderer, NULL); + SDL_SetRenderDrawColor(m_renderer, m_color.r, m_color.g, m_color.b, m_color.a); SDL_RenderClear(m_renderer); } @@ -139,7 +139,6 @@ namespace bloom { } void Game::render() { - SDL_SetRenderTarget(m_renderer, NULL); sceneManager.draw(); SDL_RenderPresent(m_renderer); } @@ -166,12 +165,10 @@ namespace bloom { void Game::setColor(const SDL_Color & color) { m_color = color; - SDL_SetRenderDrawColor(m_renderer, m_color.r, m_color.g, m_color.b, m_color.a); } void Game::setColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a) { m_color = { r, g, b, a }; - SDL_SetRenderDrawColor(m_renderer, m_color.r, m_color.g, m_color.b, m_color.a); } SDL_Color Game::getColor() { diff --git a/BloomFramework/src/Scenes/Scene.cpp b/BloomFramework/src/Scenes/Scene.cpp index 47377302..9a9e2169 100644 --- a/BloomFramework/src/Scenes/Scene.cpp +++ b/BloomFramework/src/Scenes/Scene.cpp @@ -11,7 +11,7 @@ namespace bloom { m_sceneTexture = SDL_CreateTexture(m_gameInstance.getRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, m_gameInstance.getScreenWidth(), m_gameInstance.getScreenHeight()); - + SDL_SetTextureBlendMode(m_sceneTexture, SDL_BLENDMODE_BLEND); } @@ -21,6 +21,7 @@ namespace bloom { void Scene::update(double deltaTime) { SDL_SetRenderTarget(m_gameInstance.getRenderer(), m_sceneTexture); + SDL_SetRenderDrawColor(m_gameInstance.getRenderer(), 0, 0, 0, 0); SDL_RenderClear(m_gameInstance.getRenderer()); for (auto & sys : m_systems) if (sys->enabled)