diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..5bcb98fd --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 79b3c948..403c040a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 74171f9e..727c6fd7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,20 +4,20 @@ project(Engine) set(CMAKE_CXX_STANDARD 20) include_directories( - include lib/myxmlpp/include - include/Engine + include + include/Core include/Exceptions - include/Engine/component - include/Engine/component/default - include/Engine/component/default/drawables - include/Engine/component/default/colliders - include/Engine/entity - include/Engine/config - include/Engine/scene - include/Engine/settings - include/Engine/Utilities - include/Engine/Utilities/Types + include/Core/component + include/Core/component/builtins + include/Core/component/builtins/drawables + include/Core/component/builtins/colliders + include/Core/entity + include/Config + include/Core/scene + include/Core/settings + include/Utilities + include/Utilities/types ) add_subdirectory(lib/myxmlpp) @@ -25,10 +25,12 @@ set_target_properties(myxmlpp PROPERTIES POSITION_INDEPENDENT_CODE ON) file(GLOB_RECURSE SRC src/*.cpp) file(GLOB_RECURSE ICL include/*.hpp) +file(GLOB_RECURSE ICL_HEADERS include/Polymorph/*.hpp) add_library(PolymorphEngine ${SRC} ${ICL} + ${ICL_HEADERS} ) target_link_libraries(PolymorphEngine myxmlpp dl) target_link_options(PolymorphEngine PUBLIC "-Wl,--no-undefined") diff --git a/SampleProject/test_main.cpp b/SampleProject/test_main.cpp index c163e271..ebc0cc47 100644 --- a/SampleProject/test_main.cpp +++ b/SampleProject/test_main.cpp @@ -5,8 +5,8 @@ ** test_main.cpp */ -#include "../include/Engine/Engine.hpp" -#include "ConfigurationException.hpp" +#include +#include int main() { diff --git a/include/Engine/component/factory/ComponentInitializer.hpp b/include/ComponentsFactory/AComponentInitializer.hpp similarity index 85% rename from include/Engine/component/factory/ComponentInitializer.hpp rename to include/ComponentsFactory/AComponentInitializer.hpp index b6e51446..4e067386 100644 --- a/include/Engine/component/factory/ComponentInitializer.hpp +++ b/include/ComponentsFactory/AComponentInitializer.hpp @@ -5,8 +5,8 @@ ** header for IComponentInitializer.c */ -#ifndef ENGINE_COMPONENTINITIALIZER_HPP -#define ENGINE_COMPONENTINITIALIZER_HPP +#ifndef ENGINE_ACOMPONENTINITIALIZER_HPP +#define ENGINE_ACOMPONENTINITIALIZER_HPP #include #include @@ -23,7 +23,7 @@ namespace Polymorph ///////////////////////////////// Constructors ///////////////////////////////// public: - AComponentInitializer(const std::string &type, Config::XmlComponent &data, Entity &entity); + AComponentInitializer(std::string type, Config::XmlComponent &data, Entity &entity); ///////////////////////////--------------------------/////////////////////////// @@ -64,4 +64,4 @@ namespace Polymorph } -#endif //ENGINE_COMPONENTINITIALIZER_HPP +#endif //ENGINE_ACOMPONENTINITIALIZER_HPP diff --git a/include/Engine/component/factory/ComponentFactory.hpp b/include/ComponentsFactory/ComponentFactory.hpp similarity index 70% rename from include/Engine/component/factory/ComponentFactory.hpp rename to include/ComponentsFactory/ComponentFactory.hpp index 51bfa897..05991932 100644 --- a/include/Engine/component/factory/ComponentFactory.hpp +++ b/include/ComponentsFactory/ComponentFactory.hpp @@ -11,21 +11,23 @@ #ifndef ENGINE_COMPONENTFACTORY_HPP #define ENGINE_COMPONENTFACTORY_HPP -#include "factory/ComponentInitializer.hpp" #include #include + #include #include #include // @COMPONENTS: (add components include here) -#include "factory/initializers/TransformInitializer.hpp" -#include "factory/initializers/SpriteRendererInitializer.hpp" -#include "factory/initializers/TextRendererInitializer.hpp" - +#include "ComponentsFactory/initializers/TransformInitializer.hpp" +#include "ComponentsFactory/initializers/SpriteRendererInitializer.hpp" +#include "ComponentsFactory/initializers/TextRendererInitializer.hpp" +#include "ComponentsFactory/initializers/ColliderCircle2dInitializer.hpp" +#include "ComponentsFactory/initializers/ColliderRect2dInitializer.hpp" namespace Polymorph { + class AComponentInitializer; class ComponentFactory { public: @@ -42,7 +44,7 @@ namespace Polymorph ///////////////////////////////// Properties /////////////////////////////////// private: - static inline std::map> _buildables = { @@ -50,6 +52,8 @@ namespace Polymorph // @TRANSFORM: { {"Transform", [](Config::XmlComponent &data, Entity &entity) -> Initializer{ return Initializer(new TransformInitializer(data, entity));}}, + {"ColliderCircle2d", [](Config::XmlComponent &data, Entity &entity) -> Initializer{ return Initializer(new ColliderCircle2dInitializer(data, entity));}}, + {"ColliderRect2d", [](Config::XmlComponent &data, Entity &entity) -> Initializer{ return Initializer(new ColliderRect2dInitializer(data, entity));}}, {"SpriteRenderer", [](Config::XmlComponent &data, Entity &entity) -> Initializer{ return Initializer(new SpriteRendererInitializer(data, entity));}}, {"TextRenderer", [](Config::XmlComponent &data, Entity &entity) -> Initializer{ return Initializer(new TextRendererInitializer(data, entity));}}, }, diff --git a/include/ComponentsFactory/initializers/ColliderCircle2dInitializer.hpp b/include/ComponentsFactory/initializers/ColliderCircle2dInitializer.hpp new file mode 100644 index 00000000..3d18bb83 --- /dev/null +++ b/include/ComponentsFactory/initializers/ColliderCircle2dInitializer.hpp @@ -0,0 +1,39 @@ +/* +** EPITECH PROJECT, 2020 +** ColliderCircle2dInitializer.hpp +** File description: +** header for ColliderCircle2dInitializer.c +*/ + +#ifndef ENGINE_COLLIDERCIRCLE2DINITIALIZER_HPP +#define ENGINE_COLLIDERCIRCLE2DINITIALIZER_HPP + +#include "ComponentsFactory/AComponentInitializer.hpp" + +namespace Polymorph +{ + class ColliderCircle2dInitializer : public AComponentInitializer + { +///////////////////////////////// Constructors ///////////////////////////////// + + public: + ColliderCircle2dInitializer(Config::XmlComponent &data, Entity &entity); + +///////////////////////////--------------------------/////////////////////////// + + + +////////////////////////////////// Methods ///////////////////////////////////// + + public: + std::shared_ptr &build() final; + + void reference() final {}; + +///////////////////////////--------------------------/////////////////////////// + + }; +} + + +#endif //ENGINE_COLLIDERCIRCLE2DINITIALIZER_HPP diff --git a/include/ComponentsFactory/initializers/ColliderRect2dInitializer.hpp b/include/ComponentsFactory/initializers/ColliderRect2dInitializer.hpp new file mode 100644 index 00000000..f9a1a637 --- /dev/null +++ b/include/ComponentsFactory/initializers/ColliderRect2dInitializer.hpp @@ -0,0 +1,38 @@ +/* +** EPITECH PROJECT, 2020 +** ColliderRect2dInitializer.hpp +** File description: +** header for ColliderRect2dInitializer.c +*/ + +#ifndef ENGINE_COLLIDERRECT2DINITIALIZER_HPP +#define ENGINE_COLLIDERRECT2DINITIALIZER_HPP + +#include "ComponentsFactory/AComponentInitializer.hpp" + +namespace Polymorph +{ + class ColliderRect2dInitializer : public AComponentInitializer + { +///////////////////////////////// Constructors ///////////////////////////////// + + public: + ColliderRect2dInitializer(Config::XmlComponent &data, Entity &entity); + +///////////////////////////--------------------------/////////////////////////// + + + +////////////////////////////////// Methods ///////////////////////////////////// + + public: + std::shared_ptr &build() final; + + void reference() final {}; + +///////////////////////////--------------------------/////////////////////////// + + }; +} + +#endif //ENGINE_COLLIDERRECT2DINITIALIZER_HPP diff --git a/include/Engine/component/factory/initializers/SpriteRendererInitializer.hpp b/include/ComponentsFactory/initializers/SpriteRendererInitializer.hpp similarity index 94% rename from include/Engine/component/factory/initializers/SpriteRendererInitializer.hpp rename to include/ComponentsFactory/initializers/SpriteRendererInitializer.hpp index 3221f955..d8b2fd84 100644 --- a/include/Engine/component/factory/initializers/SpriteRendererInitializer.hpp +++ b/include/ComponentsFactory/initializers/SpriteRendererInitializer.hpp @@ -8,7 +8,7 @@ #ifndef ENGINE_SPRITERENDERERINITIALIZER_HPP #define ENGINE_SPRITERENDERERINITIALIZER_HPP -#include "factory/ComponentInitializer.hpp" +#include "ComponentsFactory/AComponentInitializer.hpp" namespace Polymorph { @@ -29,6 +29,7 @@ namespace Polymorph std::shared_ptr &build() final; void reference() final; + ///////////////////////////--------------------------/////////////////////////// }; diff --git a/include/Engine/component/factory/initializers/TextRendererInitializer.hpp b/include/ComponentsFactory/initializers/TextRendererInitializer.hpp similarity index 94% rename from include/Engine/component/factory/initializers/TextRendererInitializer.hpp rename to include/ComponentsFactory/initializers/TextRendererInitializer.hpp index 1c6110df..9514b01a 100644 --- a/include/Engine/component/factory/initializers/TextRendererInitializer.hpp +++ b/include/ComponentsFactory/initializers/TextRendererInitializer.hpp @@ -8,7 +8,7 @@ #ifndef ENGINE_TEXTRENDERERINITIALIZER_HPP #define ENGINE_TEXTRENDERERINITIALIZER_HPP -#include "factory/ComponentInitializer.hpp" +#include "ComponentsFactory/AComponentInitializer.hpp" namespace Polymorph { diff --git a/include/Engine/component/factory/initializers/TransformInitializer.hpp b/include/ComponentsFactory/initializers/TransformInitializer.hpp similarity index 94% rename from include/Engine/component/factory/initializers/TransformInitializer.hpp rename to include/ComponentsFactory/initializers/TransformInitializer.hpp index 04fafe92..345fe006 100644 --- a/include/Engine/component/factory/initializers/TransformInitializer.hpp +++ b/include/ComponentsFactory/initializers/TransformInitializer.hpp @@ -8,7 +8,7 @@ #ifndef ENGINE_TRANSFORMINITIALIZER_HPP #define ENGINE_TRANSFORMINITIALIZER_HPP -#include "factory/ComponentInitializer.hpp" +#include "ComponentsFactory/AComponentInitializer.hpp" namespace Polymorph { diff --git a/include/Engine/config/XmlComponent.hpp b/include/Config/XmlComponent.hpp similarity index 72% rename from include/Engine/config/XmlComponent.hpp rename to include/Config/XmlComponent.hpp index 1bde9b29..aa2f0bb9 100644 --- a/include/Engine/config/XmlComponent.hpp +++ b/include/Config/XmlComponent.hpp @@ -8,25 +8,28 @@ #ifndef ENGINE_XMLCOMPONENT_HPP #define ENGINE_XMLCOMPONENT_HPP +#include #include #include #include #include #include "safe_ptr.hpp" + #include "SceneManager.hpp" #include "Log/Logger.hpp" #include "Entity.hpp" -#include "Scene.hpp" #include "ConfigurationException.hpp" namespace Polymorph { - class Scene; class Rect; class Vector2; class Vector3; class Entity; + class SpriteModule; + class TextModule; + namespace Config { using XmlNode = myxmlpp::Node; @@ -97,51 +100,51 @@ namespace Polymorph /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, GameObject &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, GameObject &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, Vector3 &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, Vector3 &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, Vector2 &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, Vector2 &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, Rect &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, Rect &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, int &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, int &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, float &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, float &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, bool &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, bool &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, std::string &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, std::string &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, Sprite &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, safe_ptr &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - void setProperty(std::string propertyName, Text &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, safe_ptr &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertyList */ - void setProperty(std::string propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertyList */ @@ -153,19 +156,19 @@ namespace Polymorph /** * @ingroup SetPropertyList */ - void setProperty(std::string propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertyList */ - void setProperty(std::string propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertyList */ - void setProperty(std::string propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertyList */ - void setProperty(std::string propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); /** @@ -178,7 +181,7 @@ namespace Polymorph template void setProperty(std::string propertyName, T &toSet, Logger::severity level = Logger::DEBUG) { - std::shared_ptr property = _findProperty(propertyName, level); + std::shared_ptr property = _findProperty(std::move(propertyName), level); if (property == nullptr) return; @@ -194,11 +197,11 @@ namespace Polymorph * @warning propertyName as to be the exact same as the literal property name in the component ! */ template - void setProperty(std::string propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG) + void setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG) { auto propNode = _findProperty(propertyName, level); auto i = 0; - + if (propNode == nullptr) return; @@ -206,13 +209,9 @@ namespace Polymorph try { toSet.emplace_back(element); } catch (...) { - if (level != Logger::MAJOR) - Logger::log("Property List of Templates named '" + - propertyName + "': Element nb "+std::to_string(i)+" has no value", - level); - else - throw ConfigurationException("Property List of Templates named '" + - propertyName + "': Element nb "+std::to_string(i)+" has no value", Logger::MAJOR); + Logger::log("Property List of Templates named '" + + propertyName + "': Element nb "+std::to_string(i)+" has no value", + level); } ++i; } @@ -226,7 +225,7 @@ namespace Polymorph * @warning propertyName as to be the exact same as the literal property name in the component ! */ template - void setProperty(std::string propertyName, safe_ptr &toSet, Logger::severity level = Logger::DEBUG) + void setProperty(const std::string& propertyName, safe_ptr &toSet, Logger::severity level = Logger::DEBUG) { auto refProp = _findProperty(propertyName, level); @@ -259,7 +258,8 @@ namespace Polymorph * @warning propertyName as to be the exact same as the literal property name in the component ! */ template - void setProperty(std::string propertyName, std::vector> &toSet, Logger::severity level = Logger::DEBUG) { + void setProperty(const std::string& propertyName, std::vector> &toSet, Logger::severity level = Logger::DEBUG) + { auto refProp = _findProperty(propertyName, level); auto i = 0; @@ -269,7 +269,7 @@ namespace Polymorph for (auto &elem : *refProp) { try { auto id = refProp->findAttribute("id")->getValue(); - auto gameObject = SceneManager::Current->findById(id); + auto gameObject = SceneManager::findById(id); auto comp = gameObject->getComponent(); if (!comp) @@ -291,11 +291,11 @@ namespace Polymorph * @param toSet the GameObject Reference List to set * @warning propertyName as to be the exact same as the literal property name in the component ! */ - void setProperty(std::string propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); + void setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level = Logger::DEBUG); + + - - //////////////////////------------STATICS-----------------///////////////////////// /** @@ -318,43 +318,43 @@ namespace Polymorph /** * @ingroup SetPropertySimple */ - static void setProperty(std::string propertyName, GameObject &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, GameObject &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - static void setProperty(std::string propertyName, Vector3 &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, Vector3 &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - static void setProperty(std::string propertyName, Vector2 &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, Vector2 &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - static void setProperty(std::string propertyName, Rect &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, Rect &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - static void setProperty(std::string propertyName, int &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, int &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - static void setProperty(std::string propertyName, float &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, float &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - static void setProperty(std::string propertyName, bool &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, bool &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertySimple */ - static void setProperty(std::string propertyName, std::string &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, std::string &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + + - - /** * @ingroup SetPropertyList */ - static void setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertyList */ @@ -366,21 +366,21 @@ namespace Polymorph /** * @ingroup SetPropertyList */ - static void setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertyList */ - static void setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertyList */ - static void setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** * @ingroup SetPropertyList */ - static void setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); - static void setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static void setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); /** @@ -393,7 +393,7 @@ namespace Polymorph template static void setProperty(std::string propertyName, T &toSet, std::shared_ptr &data, Logger::severity level = Logger::DEBUG) { - std::shared_ptr property = _findProperty(propertyName, data, level); + std::shared_ptr property = _findProperty(std::move(propertyName), data, level); if (property == nullptr) return; @@ -432,8 +432,12 @@ namespace Polymorph * @param name the value of the attribute called 'name' in the property node to find * @return the node found (nullptr if not found) */ - std::shared_ptr _findProperty(std::string name, Logger::severity level = Logger::DEBUG); - static std::shared_ptr _findProperty(std::string name, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + std::shared_ptr _findProperty(const std::string& name, Logger::severity level = Logger::DEBUG); + static std::shared_ptr _findProperty(const std::string& name, std::shared_ptr &data, Logger::severity level = Logger::DEBUG); + static bool _setPropertyFromAttr(const std::string& name, int &toSet, myxmlpp::Node &data, Logger::severity level = Logger::DEBUG); + static bool _setPropertyFromAttr(const std::string& name, float &toSet, myxmlpp::Node &data, Logger::severity level = Logger::DEBUG); + static bool _setPropertyFromAttr(const std::string& name, bool &toSet, myxmlpp::Node &data, Logger::severity level = Logger::DEBUG); + static bool _setPropertyFromAttr(const std::string& name, std::string &toSet, myxmlpp::Node &data, Logger::severity level = Logger::DEBUG); //////////////////////--------------------------///////////////////////// }; diff --git a/include/Engine/config/XmlEntity.hpp b/include/Config/XmlEntity.hpp similarity index 95% rename from include/Engine/config/XmlEntity.hpp rename to include/Config/XmlEntity.hpp index 35dd1d92..b782b18f 100644 --- a/include/Engine/config/XmlEntity.hpp +++ b/include/Config/XmlEntity.hpp @@ -9,7 +9,7 @@ #define ENGINE_XMLENTITY_HPP #include -#include "XmlComponent.hpp" +#include namespace Polymorph { @@ -17,7 +17,8 @@ namespace Polymorph class Entity; namespace Config { - + class XmlComponent; + using XmlNode = myxmlpp::Node; class XmlEntity { ////////////////////// CONSTRUCTORS/DESTRUCTORS ///////////////////////// diff --git a/include/Engine/config/XmlScene.hpp b/include/Config/XmlScene.hpp similarity index 94% rename from include/Engine/config/XmlScene.hpp rename to include/Config/XmlScene.hpp index 10644591..89458839 100644 --- a/include/Engine/config/XmlScene.hpp +++ b/include/Config/XmlScene.hpp @@ -10,7 +10,7 @@ #include #include -#include "Node.hpp" +#include namespace Polymorph @@ -21,7 +21,7 @@ namespace Polymorph namespace Config { class XmlEntity; - class XmlScene + class XmlScene { ////////////////////// CONSTRUCTORS/DESTRUCTORS ///////////////////////// public: @@ -49,7 +49,7 @@ namespace Polymorph public: std::string getId(); std::string getName(); - bool isFirst(); + bool isFirst() const; std::vector> getEntities(); private: diff --git a/include/Engine/Engine.hpp b/include/Core/Engine.hpp similarity index 88% rename from include/Engine/Engine.hpp rename to include/Core/Engine.hpp index 6d7f56bb..17569ed0 100644 --- a/include/Engine/Engine.hpp +++ b/include/Core/Engine.hpp @@ -13,20 +13,21 @@ #include #include #include -#include "PhysicsSettings.hpp" -#include "AudioSettings.hpp" -#include "VideoSettings.hpp" + +#include "safe_ptr.hpp" #include "Time.hpp" -#include "DynamicLoader/DynamicLoader.hpp" -#include "GraphicalAPI/GraphicalAPI.hpp" -#include "ScriptingAPI/ScriptingApi.hpp" namespace Polymorph { namespace Config{class XmlEntity;class XmlComponent;} + namespace Settings{class VideoSettings; class AudioSettings; class PhysicsSettings;} class DisplayModule; class Scene; + class Time; + class GraphicalAPI; + class ScriptingApi; + using ExitCode = int; /** @@ -56,7 +57,7 @@ namespace Polymorph std::vector _layers; std::vector _execOrder; - + static inline bool _exit = false; static inline ExitCode _exitCode = 0; @@ -69,11 +70,11 @@ namespace Polymorph std::unique_ptr _physicsSettings; std::unique_ptr _audioSettings; std::shared_ptr _videoSettings; - Display _display; - + safe_ptr _display; + std::unique_ptr _graphicalApi; std::unique_ptr _scriptingApi; - + //////////////////////--------------------------///////////////////////// @@ -91,27 +92,27 @@ namespace Polymorph * @details Runs the game. */ int run(); - + /** * Loads a script factory from the filepath to an shared library ('.so') * @param scriptFactoryPath the path to the shared library * @warning the path must be relative to the executable */ - void loadScriptingAPI(std::string scriptFactoryPath); - + void loadScriptingAPI(const std::string& scriptFactoryPath); + /** * Loads a graphical api from the filepath to an shared library ('.so') * @param graphicalLibPath the path to the shared library * @warning the path must be relative to the executable */ - void loadGraphicalAPI(std::string graphicalLibPath); - + void loadGraphicalAPI(const std::string& graphicalLibPath); + /** * Loads the game configuration and inits all gameObjects/Components/Scenes */ void loadEngine(); - + static void exit(ExitCode code); std::string getProjectPath(); @@ -120,7 +121,7 @@ namespace Polymorph std::vector getDefaultConfigs(); - Config::XmlComponent &getDefaultConfig(std::string type); + Config::XmlComponent &getDefaultConfig(const std::string& type); @@ -136,7 +137,7 @@ namespace Polymorph * @param id the name of the scene to find * @return the required scene */ - std::shared_ptr findSceneById(std::string id); + std::shared_ptr findSceneById(const std::string& id); /** * Add the provided scene to the engine's scenes list @@ -180,7 +181,16 @@ namespace Polymorph * @details Inits the debug settings of the engine */ void _initDebugSettings(); + + /** + * @details Inits the game prefabs + */ + void _initPrefabs(); + /** + * @details Inits the components default configs + */ + void _initTemplates(); /** * @details Inits the game data */ diff --git a/include/Engine/component/default/Colliders/Collider2d.hpp b/include/Core/component/base/ACollider2d.hpp similarity index 62% rename from include/Engine/component/default/Colliders/Collider2d.hpp rename to include/Core/component/base/ACollider2d.hpp index b3a4d878..1e4ed27f 100644 --- a/include/Engine/component/default/Colliders/Collider2d.hpp +++ b/include/Core/component/base/ACollider2d.hpp @@ -5,29 +5,29 @@ ** header for Collider2d.c */ -#ifndef ENGINE_COLLIDER2D_HPP -#define ENGINE_COLLIDER2D_HPP +#ifndef ENGINE_ACOLLIDER2D_HPP +#define ENGINE_ACOLLIDER2D_HPP -#include "Component.hpp" +#include "Core/component/base/Component.hpp" namespace Polymorph { - class Collider2dComponent; - using Collider2dBase = std::shared_ptr; - using Collider2d = safe_ptr; - + class ACollider2dComponent; + using Collider2dBase = std::shared_ptr; + using Collider2d = safe_ptr; + /** * @class Collider2dComponent * @details An abstract component that is used to make new collider shapes (box, circle ...) * @warning Do not try to use this as a component ! (AddComponent) */ - class Collider2dComponent : public Component + class ACollider2dComponent : public Component { - public: + ///////////////////////////////// Constructors ///////////////////////////////// public: - Collider2dComponent(Entity &gameObject, std::string &type); - ~Collider2dComponent(); + ACollider2dComponent(Entity &gameObject, std::string type); + ~ACollider2dComponent(); ///////////////////////////--------------------------/////////////////////////// @@ -35,22 +35,22 @@ ///////////////////////////////// Properties /////////////////////////////////// public: - Vector2 offset; + Vector2 offset = {0, 0}; private: /** * @property all colliders encountered at runtime */ std::map _encountered; - + /** * @property the iterator where is placed the instance of the collider */ - std::vector::iterator _colliderIdx; - + std::vector::iterator _colliderIdx; + /** * @property all colliders instantiated in the game */ - static inline std::vector _allColliders = {}; + static inline std::vector _allColliders = {}; ///////////////////////////--------------------------/////////////////////////// @@ -62,18 +62,18 @@ * @param collider the collider with the collision is checked * @return true if collision occurs */ - virtual bool checkCollision(Collider2dComponent &collider) = 0; + virtual bool checkCollision(ACollider2dComponent &collider) = 0; void update() override; /** * @details BroadCasting collision event functions */ - void _checkCollisionToBroadCast(Collider2dComponent &collider); + void _checkCollisionToBroadCast(ACollider2dComponent &collider); - void _broadCastCollisionStay(Collider2dComponent &collider); - void _broadCastCollisionEnter(Collider2dComponent &collider); - void _broadCastCollisionExit(Collider2dComponent &collider); + void _broadCastCollisionStay(ACollider2dComponent &collider); + void _broadCastCollisionEnter(ACollider2dComponent &collider); + void _broadCastCollisionExit(ACollider2dComponent &collider); ///////////////////////////--------------------------/////////////////////////// }; @@ -81,4 +81,4 @@ } -#endif //ENGINE_COLLIDER2D_HPP +#endif //ENGINE_ACOLLIDER2D_HPP diff --git a/include/Engine/component/default/drawables/ADrawableComponent.hpp b/include/Core/component/base/ADrawableComponent.hpp similarity index 98% rename from include/Engine/component/default/drawables/ADrawableComponent.hpp rename to include/Core/component/base/ADrawableComponent.hpp index dfe7530c..ec39555d 100644 --- a/include/Engine/component/default/drawables/ADrawableComponent.hpp +++ b/include/Core/component/base/ADrawableComponent.hpp @@ -8,7 +8,7 @@ #ifndef ENGINE_ADRAWABLECOMPONENT_HPP #define ENGINE_ADRAWABLECOMPONENT_HPP -#include "Component.hpp" +#include "component/base/Component.hpp" namespace Polymorph { diff --git a/include/Engine/component/Component.hpp b/include/Core/component/base/Component.hpp similarity index 91% rename from include/Engine/component/Component.hpp rename to include/Core/component/base/Component.hpp index eebbf01e..278b8821 100644 --- a/include/Engine/component/Component.hpp +++ b/include/Core/component/base/Component.hpp @@ -9,10 +9,8 @@ #define ENGINE_COMPONENT_HPP #include "IComponent.hpp" -#include "Entity.hpp" #include "safe_ptr.hpp" - namespace Polymorph { // COMPONENT TYPES @@ -111,10 +109,7 @@ namespace Polymorph * @returns A safe pointer to the component 'T' */ template - safe_ptr getComponent() - { - return gameObject.getComponent(); - } + safe_ptr getComponent(); /** * @details Looks for a component by type in parent's @@ -144,10 +139,7 @@ namespace Polymorph * @returns A safe pointer to the component 'T' */ template - safe_ptr addComponent() - { - return gameObject.addComponent(); - } + safe_ptr addComponent(); /** * @details Checks if a component of type 'T' exist in the entity @@ -156,10 +148,7 @@ namespace Polymorph * @returns True if the component exist */ template - bool componentExist() - { - return gameObject.componentExist(); - } + bool componentExist(); /** * @details Deletes the component of type 'T' from the entity @@ -168,10 +157,7 @@ namespace Polymorph * @returns True if the component existed and was deleted successfully */ template - bool deleteComponent() - { - return gameObject.deleteComponent(); - } + bool deleteComponent(); ///////////////////////////--------------------------/////////////////////////// diff --git a/include/Core/component/base/Component_templated.hpp b/include/Core/component/base/Component_templated.hpp new file mode 100644 index 00000000..c791032f --- /dev/null +++ b/include/Core/component/base/Component_templated.hpp @@ -0,0 +1,96 @@ +/* +** EPITECH PROJECT, 2020 +** Component_templated.hpp +** File description: +** header for Component_templated.c +*/ + +#ifndef ENGINE_COMPONENT_TEMPLATED_HPP +#define ENGINE_COMPONENT_TEMPLATED_HPP + +#include "safe_ptr.hpp" +#include "Component.hpp" +#include "Entity.hpp" +#include "component/builtins/TransformComponent.hpp" + +namespace Polymorph +{ + + template + safe_ptr Component::getComponent() + { + return gameObject.getComponent(); + } + + /** + * @details Looks for a component by type in parent's + * @tparam T: The 'T' type of the component to look for. + * @warning The type 'T' must inherit from the Component class to be fetched + * @returns A safe pointer to the component 'T' + */ + template + safe_ptr Component::getComponentInParent() + { + if (!!transform.parent()) + return transform.parent()->gameObject.getComponent(); + } + + /** + * @details Looks for a component by type in children + * @tparam T: The 'T' type of the component to look for. + * @warning Using depth first search ! + * @warning The type 'T' must inherit from the Component class to be fetched + * @returns A safe pointer to the component 'T' + */ + template + safe_ptr Component::getComponentInChildren() + { + for (auto &child: transform) + { + auto c = child->getComponent(); + if (!!c) + return c; + } + } + + /** + * @details Adds a component to the entity + * @tparam T: The 'T' type of the component to add. + * @warning Does nothing if the component is already added + * @warning The type 'T' must have an initializer in the component factory to be added this way + * @warning The type 'T' must inherit from the Component class to be added + * @returns A safe pointer to the component 'T' + */ + template + safe_ptr Component::addComponent() + { + return gameObject.addComponent(); + } + + /** + * @details Checks if a component of type 'T' exist in the entity + * @tparam T: The 'T' type of the component to check for. + * @warning The type 'T' must inherit from the Component class to be checked + * @returns True if the component exist + */ + template + bool Component::componentExist() + { + return gameObject.componentExist(); + } + + /** + * @details Deletes the component of type 'T' from the entity + * @tparam T: The 'T' type of the component to delete. + * @warning The type 'T' must inherit from the Component class to be deleted + * @returns True if the component existed and was deleted successfully + */ + template + bool Component::deleteComponent() + { + return gameObject.deleteComponent(); + } + +} + +#endif //ENGINE_COMPONENT_TEMPLATED_HPP diff --git a/include/Engine/component/IComponent.hpp b/include/Core/component/base/IComponent.hpp similarity index 87% rename from include/Engine/component/IComponent.hpp rename to include/Core/component/base/IComponent.hpp index 17f3728f..80dab28e 100644 --- a/include/Engine/component/IComponent.hpp +++ b/include/Core/component/base/IComponent.hpp @@ -5,8 +5,7 @@ ** header for IComponent.c */ -#ifndef ENGINE_ICOMPONENT_HPP -#define ENGINE_ICOMPONENT_HPP +#pragma once #include @@ -30,5 +29,3 @@ namespace Polymorph }; } - -#endif //ENGINE_ICOMPONENT_HPP diff --git a/include/Engine/component/default/TransformComponent.hpp b/include/Core/component/builtins/TransformComponent.hpp similarity index 96% rename from include/Engine/component/default/TransformComponent.hpp rename to include/Core/component/builtins/TransformComponent.hpp index d110c82b..87756c5a 100644 --- a/include/Engine/component/default/TransformComponent.hpp +++ b/include/Core/component/builtins/TransformComponent.hpp @@ -9,7 +9,7 @@ #define ENGINE_TRANSFORMCOMPONENT_HPP #include -#include "Component.hpp" +#include "component/base/Component.hpp" #include "safe_ptr.hpp" #include "Vector.hpp" @@ -113,11 +113,11 @@ namespace Polymorph void setPosition(const Vector3 &position); - void setPositionX(const float posX); + void setPositionX(float posX); - void setPositionY(const float posY); + void setPositionY(float posY); - void setPositionZ(const float posZ); + void setPositionZ(float posZ); void move(const Vector3 &delta); diff --git a/include/Core/component/builtins/colliders/ColliderCircle2d.hpp b/include/Core/component/builtins/colliders/ColliderCircle2d.hpp new file mode 100644 index 00000000..05974f18 --- /dev/null +++ b/include/Core/component/builtins/colliders/ColliderCircle2d.hpp @@ -0,0 +1,45 @@ +/* +** EPITECH PROJECT, 2020 +** Collider2d.hpp +** File description: +** header for Collider2d.c +*/ + +#ifndef ENGINE_COLLIDER2CIRCLE_HPP +#define ENGINE_COLLIDER2CIRCLE_HPP + +#include "component/base/ACollider2d.hpp" + +namespace Polymorph + { + + class ColliderCircle2dComponent : public ACollider2dComponent + { + +///////////////////////////////// Constructors ///////////////////////////////// + + public: + explicit ColliderCircle2dComponent(Entity &entity); + +///////////////////////////--------------------------/////////////////////////// + +///////////////////////////////// Properties /////////////////////////////////// + + public: + float radius = 0.0f; + +///////////////////////////--------------------------/////////////////////////// + + + +////////////////////////////////// Methods ///////////////////////////////////// + + private: + bool checkCollision(ACollider2dComponent &other) override; + +///////////////////////////--------------------------/////////////////////////// + + }; + } + +#endif //ENGINE_COLLIDER2CIRCLE_HPP diff --git a/include/Engine/component/default/Colliders/ColliderRect2d.hpp b/include/Core/component/builtins/colliders/ColliderRect2d.hpp similarity index 56% rename from include/Engine/component/default/Colliders/ColliderRect2d.hpp rename to include/Core/component/builtins/colliders/ColliderRect2d.hpp index 816dd1fe..fd0c8c2e 100644 --- a/include/Engine/component/default/Colliders/ColliderRect2d.hpp +++ b/include/Core/component/builtins/colliders/ColliderRect2d.hpp @@ -8,17 +8,25 @@ #ifndef ENGINE_COLLIDER2RECT_HPP #define ENGINE_COLLIDER2RECT_HPP -#include "Collider2d.hpp" +#include "component/base/ACollider2d.hpp" namespace Polymorph { - class ColliderRect2dComponent : public Collider2dComponent { + class ColliderRect2dComponent : public ACollider2dComponent + { + +///////////////////////////////// Constructors ///////////////////////////////// + + public: + explicit ColliderRect2dComponent(Entity &entity); + +///////////////////////////--------------------------/////////////////////////// ///////////////////////////////// Properties /////////////////////////////////// public: - Vector2 size; + Vector2 size = {0, 0}; ///////////////////////////--------------------------/////////////////////////// @@ -27,7 +35,7 @@ namespace Polymorph ////////////////////////////////// Methods ///////////////////////////////////// private: - bool checkCollision(Collider2dComponent &other) override; + bool checkCollision(ACollider2dComponent &other) override; ///////////////////////////--------------------------/////////////////////////// diff --git a/include/Engine/component/default/drawables/SpriteRendererComponent.hpp b/include/Core/component/builtins/drawables/SpriteRendererComponent.hpp similarity index 89% rename from include/Engine/component/default/drawables/SpriteRendererComponent.hpp rename to include/Core/component/builtins/drawables/SpriteRendererComponent.hpp index 86c826ce..6b286043 100644 --- a/include/Engine/component/default/drawables/SpriteRendererComponent.hpp +++ b/include/Core/component/builtins/drawables/SpriteRendererComponent.hpp @@ -9,12 +9,12 @@ #define ENGINE_SPRITERENDERERCOMPONENT_HPP -#include "ADrawableComponent.hpp" +#include "component/base/ADrawableComponent.hpp" namespace Polymorph { class SpriteModule; - + using Sprite = safe_ptr; class SpriteRendererComponent; using SpriteRenderer = safe_ptr; using SpriteRendererBase = std::shared_ptr; diff --git a/include/Engine/component/default/drawables/TextRendererComponent.hpp b/include/Core/component/builtins/drawables/TextRendererComponent.hpp similarity index 86% rename from include/Engine/component/default/drawables/TextRendererComponent.hpp rename to include/Core/component/builtins/drawables/TextRendererComponent.hpp index be7ecd20..a3f59db2 100644 --- a/include/Engine/component/default/drawables/TextRendererComponent.hpp +++ b/include/Core/component/builtins/drawables/TextRendererComponent.hpp @@ -8,12 +8,12 @@ #ifndef ENGINE_TEXTRENDERERCOMPONENT_HPP #define ENGINE_TEXTRENDERERCOMPONENT_HPP -#include "Component.hpp" -#include "ADrawableComponent.hpp" -#include "GraphicalAPI/GraphicalAPI.hpp" +#include "component/base/ADrawableComponent.hpp" namespace Polymorph { + class TextModule; + using Text = safe_ptr; class TextRendererComponent; using TextRenderer = safe_ptr; using TextRendererBase = std::shared_ptr; diff --git a/include/Engine/entity/Entity.hpp b/include/Core/entity/Entity.hpp similarity index 98% rename from include/Engine/entity/Entity.hpp rename to include/Core/entity/Entity.hpp index 4a10dede..c4026830 100644 --- a/include/Engine/entity/Entity.hpp +++ b/include/Core/entity/Entity.hpp @@ -14,10 +14,6 @@ #include #include "safe_ptr.hpp" -#include "factory/ComponentInitializer.hpp" -#include "Engine.hpp" -#include "Log/Logger.hpp" -#include "factory/ComponentFactory.hpp" namespace Polymorph { diff --git a/include/Core/entity/Entity_templated.hpp b/include/Core/entity/Entity_templated.hpp new file mode 100644 index 00000000..b8df1a34 --- /dev/null +++ b/include/Core/entity/Entity_templated.hpp @@ -0,0 +1,111 @@ +/* +** EPITECH PROJECT, 2020 +** Entity_templated.hpp +** File description: +** header for Entity_templated.c +*/ + +#ifndef ENGINE_ENTITY_TEMPLATED_HPP +#define ENGINE_ENTITY_TEMPLATED_HPP + +#include +#include +#include + +#include "safe_ptr.hpp" +#include "Engine.hpp" + +#include "ComponentsFactory/ComponentFactory.hpp" +#include "ScriptingAPI/ScriptingApi.hpp" +#include "Log/Logger.hpp" +#include "Entity.hpp" +#include "component/base/Component.hpp" +#include "XmlComponent.hpp" + +namespace Polymorph +{ + + template + safe_ptr Entity::getComponent() + { + for (auto &ci: _components) { + for (auto &c: ci.second) { + auto toAdd = std::dynamic_pointer_cast((*c).get()); + if (toAdd != nullptr) { + return safe_ptr(toAdd); + } + } + } + return safe_ptr(nullptr); + } + + template + std::vector> Entity::getComponents() + { + std::vector> toReturn; + + for (auto &ci: _components) { + for (auto &c: ci.second) { + auto toAdd = std::dynamic_pointer_cast((*c).get()); + if (toAdd != nullptr) { + toReturn.push_back(safe_ptr(toAdd)); + } + } + } + + return toReturn; + } + + template + safe_ptr Entity::addComponent() + { + std::shared_ptr component(new T(*this)); + + std::string t = component->getType(); + component.reset(); + if (componentExist(t)) + return safe_ptr(nullptr); + //TODO: maybe throw/Log ? + Config::XmlComponent &config = _game.getDefaultConfig(t); + + std::shared_ptr c = ComponentFactory::create(t, config, *this); + if (c == nullptr) + c = ScriptingApi::create(t, config, *this); + + if (c == nullptr) { + Logger::log("Unknown component to add at runtime: '" + t + + "'\n\t(this error maybe occurs because you need to add an initializer for the component in the factory)", + Logger::MINOR); + return safe_ptr(nullptr); + } + + if (config.getType() != "Empty") { + c->build(); + c->reference(); + } + _components[c->getType()].push_back(c); + (**c)->onAwake(); + (**c)->setAsAwaked(); + if ((**c)->enabled) + { + (**c)->start(); + (**c)->setAsStarted(); + } + return safe_ptr(std::dynamic_pointer_cast((*c).get())); + } + + template + bool Entity::componentExist() + { + for (auto &ci: _components) { + for (auto &c: ci.second) + { + if (std::dynamic_pointer_cast((*c).get() ) != nullptr) + return true; + } + } + return false; + } +} + +#endif //ENGINE_ENTITY_TEMPLATED_HPP diff --git a/include/Engine/scene/Scene.hpp b/include/Core/scene/Scene.hpp similarity index 99% rename from include/Engine/scene/Scene.hpp rename to include/Core/scene/Scene.hpp index 9b8ccf3e..23b28b13 100644 --- a/include/Engine/scene/Scene.hpp +++ b/include/Core/scene/Scene.hpp @@ -13,9 +13,9 @@ #include #include #include -#include "factory/ComponentInitializer.hpp" + +#include #include "safe_ptr.hpp" -#include "Node.hpp" namespace Polymorph diff --git a/include/Engine/scene/SceneManager.hpp b/include/Core/scene/SceneManager.hpp similarity index 100% rename from include/Engine/scene/SceneManager.hpp rename to include/Core/scene/SceneManager.hpp diff --git a/include/Engine/settings/AudioSettings.hpp b/include/Core/settings/AudioSettings.hpp similarity index 89% rename from include/Engine/settings/AudioSettings.hpp rename to include/Core/settings/AudioSettings.hpp index 8ed4ffbe..323e46a6 100644 --- a/include/Engine/settings/AudioSettings.hpp +++ b/include/Core/settings/AudioSettings.hpp @@ -8,7 +8,7 @@ #ifndef ENGINE_AUDIOSETTINGS_HPP #define ENGINE_AUDIOSETTINGS_HPP -#include "myxmlpp.hpp" +#include namespace Polymorph::Settings { using XmlNode = myxmlpp::Node; @@ -22,7 +22,7 @@ namespace Polymorph::Settings { * node from the configuration file * @param node The AudioSettings node */ - AudioSettings(const std::shared_ptr &node); + explicit AudioSettings(const std::shared_ptr &node); ///////////////////////////--------------------------/////////////////////////// @@ -51,19 +51,19 @@ namespace Polymorph::Settings { * Get the master volume as a percentage * @return The master volume */ - int getMasterVolume(); + int getMasterVolume() const; /** * Get the music volume as a percentage * @return The music volume */ - int getMusicVolume(); + int getMusicVolume() const; /** * Get the sfx volume as a percentage * @return The sfx volume */ - int getSfxVolume(); + int getSfxVolume() const; void setMasterVolume(int vol); diff --git a/include/Engine/settings/PhysicsSettings.hpp b/include/Core/settings/PhysicsSettings.hpp similarity index 97% rename from include/Engine/settings/PhysicsSettings.hpp rename to include/Core/settings/PhysicsSettings.hpp index 89f72f0b..4b4b8f25 100644 --- a/include/Engine/settings/PhysicsSettings.hpp +++ b/include/Core/settings/PhysicsSettings.hpp @@ -8,8 +8,8 @@ #ifndef ENGINE_PHYSICSSETTINGS_HPP #define ENGINE_PHYSICSSETTINGS_HPP -#include "myxmlpp.hpp" -#include "Vector.hpp" +#include +#include "types/Vector.hpp" namespace Polymorph::Settings { diff --git a/include/Engine/settings/VideoSettings.hpp b/include/Core/settings/VideoSettings.hpp similarity index 93% rename from include/Engine/settings/VideoSettings.hpp rename to include/Core/settings/VideoSettings.hpp index c34054e5..a2069598 100644 --- a/include/Engine/settings/VideoSettings.hpp +++ b/include/Core/settings/VideoSettings.hpp @@ -8,18 +8,18 @@ #ifndef ENGINE_VIDEOSETTINGS_HPP #define ENGINE_VIDEOSETTINGS_HPP -#include "myxmlpp.hpp" -#include "Vector.hpp" +#include +#include "types/Vector.hpp" namespace Polymorph::Settings { using XmlNode = myxmlpp::Node; - + class VideoSettings { ///////////////////////////////// Constructors ///////////////////////////////// public: - VideoSettings(const std::shared_ptr &node); + explicit VideoSettings(const std::shared_ptr &node); ///////////////////////////--------------------------/////////////////////////// diff --git a/include/DynamicLoader/DynamicLoader.hpp b/include/DynamicLoader/DynamicLoader.hpp index 2c84012e..cc5f364c 100644 --- a/include/DynamicLoader/DynamicLoader.hpp +++ b/include/DynamicLoader/DynamicLoader.hpp @@ -20,25 +20,25 @@ class DynamicLibLoader protected: void *_handler = nullptr; - - + + public: /** * @details Close the previous opened library (if one is open) and opens the one passed as parameter - * @param libPath + * @param libPath */ - void loadHandler(std::string libPath); - + void loadHandler(const std::string& libPath); + protected: template static T loadSymbol(std::string name) { auto handler = API::getHandler(); - + if (handler == nullptr) return nullptr; - + void *symbol = dlsym(handler, name.c_str()); if (symbol == nullptr) diff --git a/include/Engine/component/default/Colliders/ColliderCircle2d.hpp b/include/Engine/component/default/Colliders/ColliderCircle2d.hpp deleted file mode 100644 index 424e5aa1..00000000 --- a/include/Engine/component/default/Colliders/ColliderCircle2d.hpp +++ /dev/null @@ -1,39 +0,0 @@ -/* -** EPITECH PROJECT, 2020 -** ColliderCircle2dComponent.hpp -** File description: -** header for ColliderCircle2dComponent.c -*/ - -#ifndef ENGINE_COLLIDERCIRCLE2D_HPP -#define ENGINE_COLLIDERCIRCLE2D_HPP - -#include "Collider2d.hpp" - -namespace Polymorph -{ - - class ColliderCircle2dComponent : public Collider2dComponent { - -///////////////////////////////// Properties /////////////////////////////////// - - public: - float radius; - -///////////////////////////--------------------------/////////////////////////// - - - -////////////////////////////////// Methods ///////////////////////////////////// - - private: - bool checkCollision(Collider2dComponent &other) override; - -///////////////////////////--------------------------/////////////////////////// - - - }; - -} - -#endif //ENGINE_COLLIDERCIRCLE2D_HPP diff --git a/include/Engine/entity/Entity_templated.hpp b/include/Engine/entity/Entity_templated.hpp deleted file mode 100644 index 285e9b59..00000000 --- a/include/Engine/entity/Entity_templated.hpp +++ /dev/null @@ -1,109 +0,0 @@ -/* -** EPITECH PROJECT, 2020 -** Entity_templated.hpp -** File description: -** header for Entity_templated.c -*/ - -#ifndef ENGINE_ENTITY_TEMPLATED_HPP -#define ENGINE_ENTITY_TEMPLATED_HPP - -#include -#include -#include - -#include "safe_ptr.hpp" -#include "factory/ComponentInitializer.hpp" -#include "Engine.hpp" -#include "Log/Logger.hpp" -#include "factory/ComponentFactory.hpp" -#include "Entity.hpp" -#include "Component.hpp" -#include "XmlComponent.hpp" -#include "interfaces/ICollider2dHandler.hpp" -#include "ScriptingAPI/ScriptingApi.hpp" - - -template -Polymorph::safe_ptr Polymorph::Entity::getComponent() -{ - for (auto &ci: _components) { - for (auto &c: ci.second) { - auto toAdd = std::dynamic_pointer_cast((*c).get()); - if (toAdd != nullptr) { - return safe_ptr(toAdd); - } - } - } - return safe_ptr(nullptr); -} - -template -std::vector> Polymorph::Entity::getComponents() -{ - std::vector> toReturn; - - for (auto &ci: _components) { - for (auto &c: ci.second) { - auto toAdd = std::dynamic_pointer_cast((*c).get()); - if (toAdd != nullptr) { - toReturn.push_back(safe_ptr(toAdd)); - } - } - } - - return toReturn; -} - -template -Polymorph::safe_ptr Polymorph::Entity::addComponent() -{ - std::shared_ptr component(new T(*this)); - - std::string t = component->getType(); - component.reset(); - if (componentExist(t)) - return safe_ptr(); - //TODO: maybe throw/Log ? - Config::XmlComponent &config = _game.getDefaultConfig(t); - - std::shared_ptr c = ComponentFactory::create(t, config, *this); - if (c == nullptr) - c = ScriptingApi::create(t, config, *this); - - if (c == nullptr) { - Logger::log("Unknown component to add at runtime: '" + t + - "'\n\t(this error maybe occurs because you need to add an initializer for the component in the factory)", - Logger::MINOR); - return safe_ptr(nullptr); - } - - if (config.getType() != "Empty") { - c->build(); - c->reference(); - } - _components[c->getType()].push_back(c); - (**c)->onAwake(); - (**c)->setAsAwaked(); - if ((**c)->enabled) - { - (**c)->start(); - (**c)->setAsStarted(); - } - return safe_ptr(std::dynamic_pointer_cast((*c).get())); -} - -template -bool Polymorph::Entity::componentExist() -{ - for (auto &ci: _components) { - for (auto &c: ci.second) - { - if (std::dynamic_pointer_cast((*c).get() ) != nullptr) - return true; - } - } - return false; -} - -#endif //ENGINE_ENTITY_TEMPLATED_HPP diff --git a/include/Engine/component/interfaces/ICollider2dHandler.hpp b/include/Events/ICollider2dHandler.hpp similarity index 51% rename from include/Engine/component/interfaces/ICollider2dHandler.hpp rename to include/Events/ICollider2dHandler.hpp index e7d900d2..90ead365 100644 --- a/include/Engine/component/interfaces/ICollider2dHandler.hpp +++ b/include/Events/ICollider2dHandler.hpp @@ -8,19 +8,17 @@ #ifndef ENGINE_ICOLLIDER2DHANDLER_HPP #define ENGINE_ICOLLIDER2DHANDLER_HPP -#include "default/Colliders/Collider2d.hpp" - namespace Polymorph { - class Collider2dComponent; - - + class ACollider2dComponent; + + class ICollider2dHandler { public: - virtual void onCollisionEnter(Collider2dComponent &collider) = 0; - virtual void onCollisionExit(Collider2dComponent &collider) = 0; - virtual void onCollisionStay(Collider2dComponent &collider) = 0; + virtual void onCollisionEnter(ACollider2dComponent &collider) = 0; + virtual void onCollisionExit(ACollider2dComponent &collider) = 0; + virtual void onCollisionStay(ACollider2dComponent &collider) = 0; }; } diff --git a/include/Engine/component/interfaces/IDragHandler.hpp b/include/Events/IDragHandler.hpp similarity index 100% rename from include/Engine/component/interfaces/IDragHandler.hpp rename to include/Events/IDragHandler.hpp diff --git a/include/Engine/component/interfaces/IDropHandler.hpp b/include/Events/IDropHandler.hpp similarity index 100% rename from include/Engine/component/interfaces/IDropHandler.hpp rename to include/Events/IDropHandler.hpp diff --git a/include/Engine/component/interfaces/IPointerClickHandler.hpp b/include/Events/IPointerClickHandler.hpp similarity index 100% rename from include/Engine/component/interfaces/IPointerClickHandler.hpp rename to include/Events/IPointerClickHandler.hpp diff --git a/include/Engine/component/interfaces/IPointerHandler.hpp b/include/Events/IPointerHandler.hpp similarity index 100% rename from include/Engine/component/interfaces/IPointerHandler.hpp rename to include/Events/IPointerHandler.hpp diff --git a/include/Exceptions/ConfigurationException.hpp b/include/Exceptions/ConfigurationException.hpp index 91e1da7f..f62a361a 100644 --- a/include/Exceptions/ConfigurationException.hpp +++ b/include/Exceptions/ConfigurationException.hpp @@ -17,7 +17,7 @@ class ConfigurationException : public ExceptionLogger ///////////////////////////////// Constructors ///////////////////////////////// public: - explicit ConfigurationException(std::string message, Logger::severity level = Logger::severity::MAJOR); + explicit ConfigurationException(const std::string& message, Logger::severity level = Logger::severity::MAJOR); ///////////////////////////--------------------------/////////////////////////// diff --git a/include/Exceptions/GraphicalException.hpp b/include/Exceptions/GraphicalException.hpp index 218a1520..e5fbbaec 100644 --- a/include/Exceptions/GraphicalException.hpp +++ b/include/Exceptions/GraphicalException.hpp @@ -15,7 +15,7 @@ class GraphicalException : public ExceptionLogger { ///////////////////////////////// Constructors ///////////////////////////////// public: - explicit GraphicalException(std::string apiMessage, Logger::severity level = Logger::MAJOR); + explicit GraphicalException(const std::string& apiMessage, Logger::severity level = Logger::MAJOR); ///////////////////////////--------------------------/////////////////////////// }; diff --git a/include/GraphicalAPI/GraphicalAPI.hpp b/include/GraphicalAPI/GraphicalAPI.hpp index 22889679..4e57f19f 100644 --- a/include/GraphicalAPI/GraphicalAPI.hpp +++ b/include/GraphicalAPI/GraphicalAPI.hpp @@ -8,14 +8,20 @@ #pragma once +#include #include "safe_ptr.hpp" #include "DynamicLoader/DynamicLoader.hpp" -#include "GraphicalAPI/SpriteModule.hpp" -#include "GraphicalAPI/TextModule.hpp" -#include "GraphicalAPI/DisplayModule.hpp" + +namespace arcade{class ISpriteModule; class ITextModule; class IDisplayModule;} namespace Polymorph { + namespace Settings{class VideoSettings;} + class SpriteModule; + class TextModule; + class DisplayModule; + + using Sprite = safe_ptr; using SpriteBase = std::shared_ptr; @@ -86,7 +92,7 @@ namespace Polymorph static void reloadAPI(std::string newHandler); static void *getHandler(); - static std::string getHandlerPath() const; + static std::string getHandlerPath(); private: static void _unloadModules(); diff --git a/include/GraphicalAPI/Input.hpp b/include/GraphicalAPI/Input.hpp index 36ae9a73..7a224385 100644 --- a/include/GraphicalAPI/Input.hpp +++ b/include/GraphicalAPI/Input.hpp @@ -8,8 +8,7 @@ #pragma once -#include "GraphicalAPI.hpp" - +#include "GraphicalAPI/arcade/IDisplayModule.hpp" namespace Polymorph { diff --git a/include/GraphicalAPI/ArcadeInterfaces/IAudioModule.hpp b/include/GraphicalAPI/arcade/IAudioModule.hpp similarity index 99% rename from include/GraphicalAPI/ArcadeInterfaces/IAudioModule.hpp rename to include/GraphicalAPI/arcade/IAudioModule.hpp index 3ace7bd4..0344d838 100644 --- a/include/GraphicalAPI/ArcadeInterfaces/IAudioModule.hpp +++ b/include/GraphicalAPI/arcade/IAudioModule.hpp @@ -36,5 +36,5 @@ namespace arcade // Must set the volume virtual void setVolume() = 0; - } + }; } \ No newline at end of file diff --git a/include/GraphicalAPI/ArcadeInterfaces/IDisplayModule.hpp b/include/GraphicalAPI/arcade/IDisplayModule.hpp similarity index 100% rename from include/GraphicalAPI/ArcadeInterfaces/IDisplayModule.hpp rename to include/GraphicalAPI/arcade/IDisplayModule.hpp diff --git a/include/GraphicalAPI/ArcadeInterfaces/ISpriteModule.hpp b/include/GraphicalAPI/arcade/ISpriteModule.hpp similarity index 100% rename from include/GraphicalAPI/ArcadeInterfaces/ISpriteModule.hpp rename to include/GraphicalAPI/arcade/ISpriteModule.hpp diff --git a/include/GraphicalAPI/ArcadeInterfaces/ITextModule.hpp b/include/GraphicalAPI/arcade/ITextModule.hpp similarity index 100% rename from include/GraphicalAPI/ArcadeInterfaces/ITextModule.hpp rename to include/GraphicalAPI/arcade/ITextModule.hpp diff --git a/include/GraphicalAPI/DisplayModule.hpp b/include/GraphicalAPI/modules/DisplayModule.hpp similarity index 87% rename from include/GraphicalAPI/DisplayModule.hpp rename to include/GraphicalAPI/modules/DisplayModule.hpp index 78590324..7a0397d4 100644 --- a/include/GraphicalAPI/DisplayModule.hpp +++ b/include/GraphicalAPI/modules/DisplayModule.hpp @@ -13,24 +13,27 @@ #include #include -#include "ArcadeInterfaces/IDisplayModule.hpp" #include "Vector.hpp" +//TODO: find a way to not have multiples definitions of interfaces +#include "GraphicalAPI/arcade/IDisplayModule.hpp" + +namespace arcade{class IDisplayModule;} namespace Polymorph { namespace Settings{class VideoSettings;} class SpriteModule; class TextModule; class GraphicalAPI; - + class DisplayModule { ///////////////////////////////// Constructors ///////////////////////////////// public: - DisplayModule(const std::shared_ptr &settings, std::string title); + DisplayModule(std::shared_ptr settings, std::string title); ~DisplayModule(); - + ///////////////////////////--------------------------/////////////////////////// @@ -54,7 +57,7 @@ namespace Polymorph void close(); bool isOpen(); void fetchEvents(); - + void setResolution(Vector2 newResolution); bool isKeyPressed(arcade::KeyCode code); Vector2 getResolution(); @@ -65,7 +68,7 @@ namespace Polymorph void draw(SpriteModule &sprite); void draw(TextModule &sprite); - + private: void _loadModule(); diff --git a/include/GraphicalAPI/SpriteModule.hpp b/include/GraphicalAPI/modules/SpriteModule.hpp similarity index 89% rename from include/GraphicalAPI/SpriteModule.hpp rename to include/GraphicalAPI/modules/SpriteModule.hpp index 712d9b64..5d59fbf8 100644 --- a/include/GraphicalAPI/SpriteModule.hpp +++ b/include/GraphicalAPI/modules/SpriteModule.hpp @@ -12,14 +12,16 @@ #include #include -#include "ArcadeInterfaces/ISpriteModule.hpp" -#include "Vector.hpp" +#include #include "Rect.hpp" #include "Color.hpp" +namespace arcade{class ISpriteModule;} namespace Polymorph { + class Vector2; class GraphicalAPI; + class SpriteModule { @@ -38,7 +40,7 @@ namespace Polymorph std::string _filePath; Rect _crop = {-1, -1, -1, -1}; Color _color {0, 0, 0}; - + arcade::ISpriteModule *_spriteModule = nullptr; static inline std::vector _sprites; @@ -49,10 +51,10 @@ namespace Polymorph ////////////////////////////////// Methods ///////////////////////////////////// public: arcade::ISpriteModule *getSprite(); - void setSprite(std::string newFilePath); + void setSprite(const std::string& newFilePath); void setPosition(Vector2 position); void moveSprite(Vector2 move); - void setCrop(Rect crop); + void setCrop(const Rect& crop); void setColor(Color color); diff --git a/include/GraphicalAPI/TextModule.hpp b/include/GraphicalAPI/modules/TextModule.hpp similarity index 94% rename from include/GraphicalAPI/TextModule.hpp rename to include/GraphicalAPI/modules/TextModule.hpp index b3114e25..9d780310 100644 --- a/include/GraphicalAPI/TextModule.hpp +++ b/include/GraphicalAPI/modules/TextModule.hpp @@ -11,14 +11,14 @@ #include #include "myxmlpp.hpp" -#include "GraphicalAPI/ArcadeInterfaces/ITextModule.hpp" -#include "GraphicalAPI.hpp" #include "Color.hpp" #include "Vector.hpp" -#include "Rect.hpp" + +namespace arcade{class ITextModule;} namespace Polymorph { + class GraphicalAPI; class TextModule { diff --git a/include/Log/Logger.hpp b/include/Log/Logger.hpp index f8fb0772..8bcc250b 100644 --- a/include/Log/Logger.hpp +++ b/include/Log/Logger.hpp @@ -39,7 +39,7 @@ class Logger private: static inline std::string _logDir = "Logs/"; - static inline std::string _logInstance = ""; + static inline std::string _logInstance; static inline std::string _engineLogFile = "engine.log"; static inline Mode _mode = RELEASE_MODE; //////////////////////--------------------------///////////////////////// @@ -52,13 +52,13 @@ class Logger * @details Overrides the default log directory of the Logger * @param logDir new log directory */ - static void setLogDir(std::string logDir); + static void setLogDir(const std::string& logDir); /** * @details Adds a custom instance name prefix to the instance log sub directory * @param logInstanceName prefix name */ - static void setLogInstanceName(std::string logInstanceName); + static void setLogInstanceName(const std::string& logInstanceName); /** * @details Inits the logger instance with a log subdirectory name by date time now and sets the program mode @@ -72,7 +72,7 @@ class Logger * @param message the message to log * @param level the severity of the log (optional) */ - static void log(std::string message, severity level = INFO); + static void log(const std::string& message, severity level = INFO); /** * @details Logs a message to file and console depending on program mode and severity @@ -80,7 +80,7 @@ class Logger * @param specificFile a custom file to log in (will be placed in the log dir into the instance subdir log) * @param level the severity of the log (optional) */ - static void log(std::string message, std::string specificFile, severity level = INFO); + static void log(const std::string& message, std::string specificFile, severity level = INFO); private: @@ -90,14 +90,14 @@ class Logger * @param message the message to log * @param level the severity of the log (optional) */ - static void _consoleLog(std::string message, severity level); + static void _consoleLog(const std::string& message, severity level); /** * @details Logs a message and severity to default logfile instance * @param message the message to log * @param level the severity of the log (optional) */ - static void _logFile(std::string message, severity level); + static void _logFile(const std::string& message, severity level); /** * @details Logs a message and severity to specified logfile @@ -105,14 +105,14 @@ class Logger * @param file the specific file to log in * @param level the severity of the log (optional) */ - static void _logFile(std::string message, std::string file, severity level); + static void _logFile(const std::string& message, const std::string& file, severity level); /** * @details Gets and formats the actual date time to readable format * @param flags format flags (refer to std::strftime documentation) * @returns the formatted date time now string */ - static std::string _getTimeNow(std::string flags); + static std::string _getTimeNow(const std::string& flags); /** * @details Convert's the severity enumeration to string diff --git a/include/Polymorph/Components.hpp b/include/Polymorph/Components.hpp new file mode 100644 index 00000000..23036e9d --- /dev/null +++ b/include/Polymorph/Components.hpp @@ -0,0 +1,23 @@ +/* +** EPITECH PROJECT, 2020 +** Components.hpp +** File description: +** header for Components.c +*/ + + +#pragma once + +#include "../Core/component/base/Component.hpp" + +#include "../Core/component/builtins/TransformComponent.hpp" + +// Drawables +#include "../Core/component/base/ADrawableComponent.hpp" +#include "../Core/component/builtins/drawables/SpriteRendererComponent.hpp" +#include "../Core/component/builtins/drawables/TextRendererComponent.hpp" + +// Colliders +#include "../Core/component/base/ACollider2d.hpp" +#include "../Core/component/builtins/colliders/ColliderCircle2d.hpp" +#include "../Core/component/builtins/colliders/ColliderRect2d.hpp" diff --git a/include/Polymorph/Config.hpp b/include/Polymorph/Config.hpp new file mode 100644 index 00000000..c4d6c4cb --- /dev/null +++ b/include/Polymorph/Config.hpp @@ -0,0 +1,14 @@ +/* +** EPITECH PROJECT, 2020 +** Config.hpp +** File description: +** header for Config.c +*/ + +#pragma once + +//TODO: Maybe find a way to not include some Debug parts in XmlComponent ? +#include "../Config/XmlComponent.hpp" +#include "../Config/XmlEntity.hpp" +#include "../Config/XmlScene.hpp" +#include "../Utilities/uuid.hpp" \ No newline at end of file diff --git a/include/Polymorph/Core.hpp b/include/Polymorph/Core.hpp new file mode 100644 index 00000000..e312280c --- /dev/null +++ b/include/Polymorph/Core.hpp @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2020 +** Engine.hpp +** File description: +** header for Engine.c +*/ + + +#pragma once + +#include "../Core/Engine.hpp" +#include "../Core/scene/Scene.hpp" +#include "../Core/scene/SceneManager.hpp" +#include "../Core/entity/Entity_templated.hpp" +#include "../Core/component/base/Component_templated.hpp" +#include "../Utilities/safe_ptr.hpp" +#include "../GraphicalAPI/Input.hpp" +#include "../GraphicalAPI/GraphicalAPI.hpp" \ No newline at end of file diff --git a/include/Polymorph/Debug.hpp b/include/Polymorph/Debug.hpp new file mode 100644 index 00000000..a913ed49 --- /dev/null +++ b/include/Polymorph/Debug.hpp @@ -0,0 +1,13 @@ +/* +** EPITECH PROJECT, 2020 +** Exceptions.hpp +** File description: +** header for Exceptions.c +*/ + +#pragma once + +#include "../Exceptions/ExceptionLogger.hpp" +#include "../Exceptions/ConfigurationException.hpp" +#include "../Exceptions/GraphicalException.hpp" +#include "../Log/Logger.hpp" \ No newline at end of file diff --git a/include/Polymorph/Events.hpp b/include/Polymorph/Events.hpp new file mode 100644 index 00000000..a327e6cf --- /dev/null +++ b/include/Polymorph/Events.hpp @@ -0,0 +1,17 @@ +/* +** EPITECH PROJECT, 2020 +** BroadCasting.hpp +** File description: +** header for BroadCasting.c +*/ + +#ifndef ENGINE_EVENTS_HPP +#define ENGINE_EVENTS_HPP + +#include "../Events/ICollider2dHandler.hpp" +#include "../Events/IDragHandler.hpp" +#include "../Events/IDropHandler.hpp" +#include "../Events/IPointerClickHandler.hpp" +#include "../Events/IPointerHandler.hpp" + +#endif //ENGINE_EVENTS_HPP diff --git a/include/Polymorph/Factory.hpp b/include/Polymorph/Factory.hpp new file mode 100644 index 00000000..ab61a1d0 --- /dev/null +++ b/include/Polymorph/Factory.hpp @@ -0,0 +1,13 @@ +/* +** EPITECH PROJECT, 2020 +** Factory.hpp +** File description: +** header for Factory.c +*/ + +#pragma once + +#include "../ScriptingAPI/IScriptFactory.hpp" +#include "../ComponentsFactory/AComponentInitializer.hpp" +#include "../ComponentsFactory/ComponentFactory.hpp" + diff --git a/include/Polymorph/Settings.hpp b/include/Polymorph/Settings.hpp new file mode 100644 index 00000000..b065deb6 --- /dev/null +++ b/include/Polymorph/Settings.hpp @@ -0,0 +1,13 @@ +/* +** EPITECH PROJECT, 2020 +** Settings.hpp +** File description: +** header for Settings.c +*/ + +#pragma once + +#include "../GraphicalAPI/GraphicalAPI.hpp" +#include "../Core/settings/AudioSettings.hpp" +#include "../Core/settings/VideoSettings.hpp" +#include "../Core/settings/PhysicsSettings.hpp" \ No newline at end of file diff --git a/include/Polymorph/Types.hpp b/include/Polymorph/Types.hpp new file mode 100644 index 00000000..585f9e20 --- /dev/null +++ b/include/Polymorph/Types.hpp @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2020 +** Types.hpp +** File description: +** header for Types.c +*/ + +#pragma once + +#include "../Utilities/Time.hpp" +#include "../Utilities/uuid.hpp" +#include "../Utilities/types/Vector.hpp" +#include "../Utilities/types/Rect.hpp" +#include "../Utilities/types/Circle.hpp" +#include "../Utilities/types/Color.hpp" +#include "../GraphicalAPI/modules/SpriteModule.hpp" +#include "../GraphicalAPI/modules/TextModule.hpp" +#include "../GraphicalAPI/modules/DisplayModule.hpp" diff --git a/include/ScriptingAPI/ScriptFactory.hpp b/include/ScriptingAPI/IScriptFactory.hpp similarity index 94% rename from include/ScriptingAPI/ScriptFactory.hpp rename to include/ScriptingAPI/IScriptFactory.hpp index 23104f56..129d31ea 100644 --- a/include/ScriptingAPI/ScriptFactory.hpp +++ b/include/ScriptingAPI/IScriptFactory.hpp @@ -8,10 +8,9 @@ #pragma once -#include "factory/ComponentInitializer.hpp" - namespace Polymorph { + class AComponentInitializer; class IScriptFactory { diff --git a/include/ScriptingAPI/ScriptingApi.hpp b/include/ScriptingAPI/ScriptingApi.hpp index 31ffe985..14f0190a 100644 --- a/include/ScriptingAPI/ScriptingApi.hpp +++ b/include/ScriptingAPI/ScriptingApi.hpp @@ -9,11 +9,16 @@ #pragma once #include "DynamicLoader/DynamicLoader.hpp" -#include "ScriptFactory.hpp" -#include "factory/ComponentInitializer.hpp" + namespace Polymorph { + namespace Config{class XmlComponent;} + + class IScriptFactory; + class AComponentInitializer; + class Entity; + class ScriptingApi : public DynamicLibLoader { diff --git a/include/Engine/Utilities/Time.hpp b/include/Utilities/Time.hpp similarity index 100% rename from include/Engine/Utilities/Time.hpp rename to include/Utilities/Time.hpp diff --git a/include/Engine/Utilities/safe_ptr.hpp b/include/Utilities/safe_ptr.hpp similarity index 100% rename from include/Engine/Utilities/safe_ptr.hpp rename to include/Utilities/safe_ptr.hpp diff --git a/include/Engine/Utilities/Types/Circle.hpp b/include/Utilities/types/Circle.hpp similarity index 63% rename from include/Engine/Utilities/Types/Circle.hpp rename to include/Utilities/types/Circle.hpp index bda16660..28d8cf0a 100644 --- a/include/Engine/Utilities/Types/Circle.hpp +++ b/include/Utilities/types/Circle.hpp @@ -12,6 +12,7 @@ namespace Polymorph { + class Rect; class Circle { @@ -41,6 +42,15 @@ namespace Polymorph static bool intersect(const Circle &circle, const Vector2 ¢er, float radius); static bool intersect(const Vector2 ¢er, float radius, const Circle &circle); static bool intersect(const Vector2 ¢er1, float radius1, const Vector2 ¢er2, float radius2); + + static bool intersect(const Rect &rect, const Circle &circle); + static bool intersect(const Vector2 &position, const Vector2 &size, const Circle &circle); + static bool intersect(const Vector2 &position, const Vector2 &size, const Vector2 ¢er, float radius); + static bool intersect(const Rect &rect, const Vector2 ¢er, float radius); + static bool intersect(const Circle &circle, const Rect &rect); + static bool intersect(const Circle &circle, const Vector2 &position, const Vector2 &size); + static bool intersect(const Vector2 ¢er, float radius, const Vector2 &position, const Vector2 &size); + static bool intersect(const Vector2 ¢er, float radius, const Rect &rect); //////////////////////--------------------------///////////////////////// }; diff --git a/include/GraphicalAPI/Color.hpp b/include/Utilities/types/Color.hpp similarity index 100% rename from include/GraphicalAPI/Color.hpp rename to include/Utilities/types/Color.hpp diff --git a/include/Engine/Utilities/Types/Rect.hpp b/include/Utilities/types/Rect.hpp similarity index 70% rename from include/Engine/Utilities/Types/Rect.hpp rename to include/Utilities/types/Rect.hpp index 9a47c3c1..81780f52 100644 --- a/include/Engine/Utilities/Types/Rect.hpp +++ b/include/Utilities/types/Rect.hpp @@ -12,6 +12,7 @@ namespace Polymorph { + class Circle; class Rect { ////////////////////// CONSTRUCTORS/DESTRUCTORS ///////////////////////// @@ -54,6 +55,15 @@ namespace Polymorph static bool intersect(const Rect &rect, const Vector2 &position, const Vector2 &size); static bool intersect(const Vector2 &position1, const Vector2 &size1, const Vector2 &position2, const Vector2 &size2); + static bool intersect(const Rect &rect, const Circle &circle); + static bool intersect(const Vector2 &position, const Vector2 &size, const Circle &circle); + static bool intersect(const Vector2 &position, const Vector2 &size, const Vector2 ¢er, float radius); + static bool intersect(const Rect &rect, const Vector2 ¢er, float radius); + static bool intersect(const Circle &circle, const Rect &rect); + static bool intersect(const Circle &circle, const Vector2 &position, const Vector2 &size); + static bool intersect(const Vector2 ¢er, float radius, const Vector2 &position, const Vector2 &size); + static bool intersect(const Vector2 ¢er, float radius, const Rect &rect); + //////////////////////--------------------------///////////////////////// }; diff --git a/include/Engine/Utilities/Types/Vector.hpp b/include/Utilities/types/Vector.hpp similarity index 100% rename from include/Engine/Utilities/Types/Vector.hpp rename to include/Utilities/types/Vector.hpp diff --git a/include/Engine/Utilities/uuid.hpp b/include/Utilities/uuid.hpp similarity index 98% rename from include/Engine/Utilities/uuid.hpp rename to include/Utilities/uuid.hpp index b33d2bae..3516eedf 100644 --- a/include/Engine/Utilities/uuid.hpp +++ b/include/Utilities/uuid.hpp @@ -18,7 +18,7 @@ namespace Polymorph { static inline std::uniform_int_distribution<> dis(0, 15); std::string uuid(); - }; + } } diff --git a/src/ComponentsFactory/AComponentInitializer.cpp b/src/ComponentsFactory/AComponentInitializer.cpp new file mode 100644 index 00000000..f51a5724 --- /dev/null +++ b/src/ComponentsFactory/AComponentInitializer.cpp @@ -0,0 +1,24 @@ +/* +** EPITECH PROJECT, 2020 +** AComponentInitializer.cpp +** File description: +** AComponentInitializer.cpp +*/ + +#include +#include +#include +#include +#include + +namespace Polymorph +{ + AComponentInitializer::AComponentInitializer(std::string type, Config::XmlComponent &data, + Entity &entity) : data(data), type(std::move(type)) + {} + + void AComponentInitializer::_init() + { + component->enabled = data.isEnabled(); + } +} diff --git a/src/component/ComponentFactory.cpp b/src/ComponentsFactory/ComponentFactory.cpp similarity index 71% rename from src/component/ComponentFactory.cpp rename to src/ComponentsFactory/ComponentFactory.cpp index adce0f6a..8ae0a88c 100644 --- a/src/component/ComponentFactory.cpp +++ b/src/ComponentsFactory/ComponentFactory.cpp @@ -5,7 +5,10 @@ ** ComponentFactory.cpp */ -#include "factory/ComponentFactory.hpp" +#include +#include +#include + std::shared_ptr Polymorph::ComponentFactory::create(std::string &type, @@ -14,6 +17,5 @@ Polymorph::ComponentFactory::create(std::string &type, { if (!_buildables.contains(type)) return nullptr; - return _buildables[type](data, entity); -} - + return _buildables.find(type)->second(data, entity); +} \ No newline at end of file diff --git a/src/ComponentsFactory/initalizers/ColliderCircle2dInitializer.cpp b/src/ComponentsFactory/initalizers/ColliderCircle2dInitializer.cpp new file mode 100644 index 00000000..4e680b29 --- /dev/null +++ b/src/ComponentsFactory/initalizers/ColliderCircle2dInitializer.cpp @@ -0,0 +1,29 @@ +/* +** EPITECH PROJECT, 2022 +** ColliderCircle2dInitializer.cpp +** File description: +** ColliderCircle2dInitializer.cpp +*/ + + +#include +#include +#include +#include +#include + +Polymorph::ColliderCircle2dInitializer::ColliderCircle2dInitializer(Polymorph::Config::XmlComponent &data, Polymorph::Entity &entity) + : AComponentInitializer("ColliderCircle2d", data, entity) +{ + component = std::shared_ptr(new ColliderCircle2dComponent(entity)); +} + +std::shared_ptr &Polymorph::ColliderCircle2dInitializer::build() +{ + auto trm = std::dynamic_pointer_cast(component); + + data.setProperty("radius", trm->radius, Logger::MINOR); + data.setProperty("offset", trm->offset); + + return component; +} diff --git a/src/ComponentsFactory/initalizers/ColliderRect2dInitializer.cpp b/src/ComponentsFactory/initalizers/ColliderRect2dInitializer.cpp new file mode 100644 index 00000000..20a5554e --- /dev/null +++ b/src/ComponentsFactory/initalizers/ColliderRect2dInitializer.cpp @@ -0,0 +1,28 @@ +/* +** EPITECH PROJECT, 2022 +** ColliderRect2dInitializer.cpp +** File description: +** ColliderRect2dInitializer.cpp +*/ + +#include +#include +#include +#include +#include + +Polymorph::ColliderRect2dInitializer::ColliderRect2dInitializer(Polymorph::Config::XmlComponent &data, Polymorph::Entity &entity) + : AComponentInitializer("ColliderCircle2d", data, entity) +{ + component = std::shared_ptr(new ColliderRect2dComponent(entity)); +} + +std::shared_ptr &Polymorph::ColliderRect2dInitializer::build() +{ + auto trm = std::dynamic_pointer_cast(component); + + data.setProperty("size", trm->size, Logger::MINOR); + data.setProperty("offset", trm->offset); + + return component; +} diff --git a/src/component/initializers/SpriteRendererInitalizer.cpp b/src/ComponentsFactory/initalizers/SpriteRendererInitalizer.cpp similarity index 78% rename from src/component/initializers/SpriteRendererInitalizer.cpp rename to src/ComponentsFactory/initalizers/SpriteRendererInitalizer.cpp index 2c0d0cab..cb4d6397 100644 --- a/src/component/initializers/SpriteRendererInitalizer.cpp +++ b/src/ComponentsFactory/initalizers/SpriteRendererInitalizer.cpp @@ -5,10 +5,11 @@ ** SpriteRendererInitalizer.cpp */ -#include "factory/ComponentFactory.hpp" -#include "default/drawables/SpriteRendererComponent.hpp" -#include "XmlComponent.hpp" -#include "GraphicalAPI/SpriteModule.hpp" +#include +#include +#include +#include + using namespace Polymorph; diff --git a/src/component/initializers/TextRendererInitializer.cpp b/src/ComponentsFactory/initalizers/TextRendererInitializer.cpp similarity index 78% rename from src/component/initializers/TextRendererInitializer.cpp rename to src/ComponentsFactory/initalizers/TextRendererInitializer.cpp index ab42c6da..4dbe1920 100644 --- a/src/component/initializers/TextRendererInitializer.cpp +++ b/src/ComponentsFactory/initalizers/TextRendererInitializer.cpp @@ -4,10 +4,12 @@ ** File description: ** TextRendererInitializer.cpp */ -#include "factory/ComponentFactory.hpp" -#include "default/drawables/TextRendererComponent.hpp" -#include "XmlComponent.hpp" -#include "GraphicalAPI/TextModule.hpp" + + +#include +#include +#include +#include using namespace Polymorph; diff --git a/src/component/initializers/TransformInitializer.cpp b/src/ComponentsFactory/initalizers/TransformInitializer.cpp similarity index 88% rename from src/component/initializers/TransformInitializer.cpp rename to src/ComponentsFactory/initalizers/TransformInitializer.cpp index 05f5220a..48d60c16 100644 --- a/src/component/initializers/TransformInitializer.cpp +++ b/src/ComponentsFactory/initalizers/TransformInitializer.cpp @@ -5,10 +5,12 @@ ** TransformInitializer.hpp.cpp */ -#include "factory/ComponentInitializer.hpp" -#include "factory/initializers/TransformInitializer.hpp" -#include "default/TransformComponent.hpp" -#include "XmlComponent.hpp" + +#include +#include +#include +#include +#include namespace Polymorph { @@ -21,9 +23,11 @@ namespace Polymorph std::shared_ptr &TransformInitializer::build() { auto trm = std::dynamic_pointer_cast(component); + data.setProperty("position", trm->_position); data.setProperty("scale", trm->_scale); data.setProperty("rotation", trm->_rotation); + return component; } diff --git a/src/Config/XmlComponent.cpp b/src/Config/XmlComponent.cpp new file mode 100644 index 00000000..3fe7c4d4 --- /dev/null +++ b/src/Config/XmlComponent.cpp @@ -0,0 +1,766 @@ +/* +** EPITECH PROJECT, 2020 +** XmlComponent.cpp.cc +** File description: +** header for XmlComponent.c +*/ + + +#include +#include +#include +#include +#include +#include "XmlComponent.hpp" + + +std::string Polymorph::Config::XmlComponent::getType() +{ + if (this == Empty.get()) + return "Empty"; + try { + type = node->findAttribute("type")->getValue(); + return type; + } catch(myxmlpp::Exception &e) { + throw ConfigurationException("No Component type found in configuration !\n"+e.baseWhat(), Logger::MAJOR); + } +} + +bool Polymorph::Config::XmlComponent::isEnabled() +{ + try { + return node->findAttribute("enabled")->getValueBool(); + } catch(myxmlpp::Exception &e) { + Logger::log("No state property found for component '" + type + + "': set to false by default", Logger::DEBUG); + return false; + } +} + + + +Polymorph::Config::XmlComponent::XmlComponent(const std::shared_ptr &node) +{ + this->node = node; +} + +std::shared_ptr Polymorph::Config::XmlComponent::_findProperty(const std::string& name, Logger::severity level) +{ + for (auto &property: *node) { + try { + auto attr = property->findAttribute("name"); + if (attr->getValue() == name) + return property; + } catch (...) {} + } + if (level != Logger::MAJOR) { + Logger::log("In component '"+node->findAttribute("type")->getValue()+"': property named '" + name + "': not found.", level); + return nullptr; + } + throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': property named '" + name + "': not found.", Logger::MAJOR); +} + + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, int &toSet, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, level); + + if (propNode == nullptr) + return; + _setPropertyFromAttr("value", toSet, *propNode, level); +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, float &toSet, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, level); + + if (propNode == nullptr) + return; + _setPropertyFromAttr("value", toSet, *propNode, level); +} + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, bool &toSet, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, level); + + if (propNode == nullptr) + return; + _setPropertyFromAttr("value", toSet, *propNode, level); +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::string &toSet, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, level); + + if (propNode == nullptr) + return; + _setPropertyFromAttr("value", toSet, *propNode, level); +} + + + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, Vector3 &toSet, Logger::severity level) +{ + std::shared_ptr vectorProp = _findProperty(propertyName, level); + std::shared_ptr vector; + + if (vectorProp == nullptr) + return; + + try { + vector = vectorProp->findChild("Vector"); + } catch (...) { + if (level != Logger::MAJOR) + Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", level); + else + throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", Logger::MAJOR); + return; + } + _setPropertyFromAttr("x", toSet.x, *vector, level); + _setPropertyFromAttr("y", toSet.y, *vector, level); + _setPropertyFromAttr("z", toSet.z, *vector, level); +} + + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, Vector2 &toSet, Logger::severity level) +{ + std::shared_ptr vectorProp = _findProperty(propertyName, level); + std::shared_ptr vector; + + if (vectorProp == nullptr) + return; + + try { + vector = vectorProp->findChild("Vector"); + } catch (...) { + if (level != Logger::MAJOR) + Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", level); + else + throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", Logger::MAJOR); + return; + } + _setPropertyFromAttr("x", toSet.x, *vector, level); + _setPropertyFromAttr("y", toSet.y, *vector, level); +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, Rect &toSet, Logger::severity level) +{ + std::shared_ptr rectProp = _findProperty(propertyName, level); + std::shared_ptr rect; + + if (rectProp == nullptr) + return; + + try { + rect = rectProp->findChild("Rect"); + } catch (...) { + if (level != Logger::MAJOR) + Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", level); + else + throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", Logger::MAJOR); + return; + } + + _setPropertyFromAttr("x", toSet.x, *rect, level); + _setPropertyFromAttr("y", toSet.y, *rect, level); + _setPropertyFromAttr("width", toSet.width, *rect, level); + _setPropertyFromAttr("height", toSet.height, *rect, level); +} + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, level); + + if (propNode == nullptr) + return; + + for (auto &element : *propNode) { + try { + toSet.push_back(element->findAttribute("value")->getValueInt()); + } catch (...) { + Logger::log("Property Int List named '" + propertyName + + "': has no value", level); + } + } +} + + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, level); + + if (propNode == nullptr) + return; + + for (auto &element : *propNode) { + try { + toSet.push_back(element->findAttribute("value")->getValueFloat()); + } catch (...) { + Logger::log("Property Float List named '" + propertyName + + "': has no value", level); + } + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, level); + + if (propNode == nullptr) + return; + + for (auto &element : *propNode) { + try { + toSet.push_back(element->findAttribute("value")->getValueBool()); + } catch (...) { + Logger::log("Property Bool List named '" + propertyName + + "': has no value", level); + } + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, level); + + if (propNode == nullptr) + return; + + for (auto &element : *propNode) { + try { + toSet.push_back(element->findAttribute("value")->getValue()); + } catch (...) { + Logger::log("Property String List named '" + propertyName + + "': has no value", level); + } + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level) +{ + auto vectorProp = _findProperty(propertyName, level); + std::shared_ptr vector; + size_t count = 0; + Vector3 tmp; + + if (vectorProp == nullptr) + return; + + for (auto &element : *vectorProp) { + tmp = Vector3(); + try { + vector = element->findChild("Vector"); + } catch (...) { + Logger::log("Incomplete Vector3 property named '" + propertyName + + "' at index" + std::to_string(count) + ": not found", + level); + continue; + } + _setPropertyFromAttr("x", tmp.x, *vector, level); + _setPropertyFromAttr("y", tmp.y, *vector, level); + _setPropertyFromAttr("z", tmp.z, *vector, level); + + toSet[count] = tmp; + count += 1; + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, Sprite &toSet, Logger::severity level) +{ + auto data = _findProperty(propertyName, level); + + try { + toSet = GraphicalAPI::createSprite(data); + } catch (...) { + if (level != Logger::MAJOR) + Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", level); + else + throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", Logger::MAJOR); + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, Text &toSet, Logger::severity level) +{ + auto data = _findProperty(propertyName, level); + + try { + toSet = GraphicalAPI::createText(data); + } catch (...) { + if (level != Logger::MAJOR) + Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", level); + else + throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + + "': has missing value", Logger::MAJOR); + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, GameObject &toSet, Logger::severity level) +{ + auto refProp = _findProperty(propertyName, level); + std::string id; + + if (refProp == nullptr) + return; + + _setPropertyFromAttr("id", id, *refProp, level); + toSet = SceneManager::findById(id); +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, Logger::severity level) +{ + auto refProp = _findProperty(propertyName, level); + auto i = 0; + + if (refProp == nullptr) + return; + + for (auto &elem : *refProp) { + try { + auto id = elem->findAttribute("id")->getValue(); + auto gameObject = SceneManager::findById(id); + + if (!gameObject) + throw; + toSet.push_back(gameObject); + } catch (myxmlpp::Exception &e) { + Logger::log("Property gameObject ref nb: " + std::to_string(i) + + ", in list named '" + propertyName + "': has no value" + + e.baseWhat(), level); + } catch (...) { + Logger::log("Property gameObject ref nb: " + std::to_string(i) + + ", in list named '" + propertyName + "': not found", + level); + } + ++i; + } +} + + + +// STATICS +std::shared_ptr +Polymorph::Config::XmlComponent::_findProperty(const std::string& name, + std::shared_ptr &data, Logger::severity level) +{ + for (auto &property: *data) { + try { + auto attr = property->findAttribute("name"); + if (attr->getValue() == name) + return property; + } catch (...) {} + } + if (level != Logger::MAJOR) { + Logger::log("In property'"+data->getTag()+"': sub-property named '" + name + "': not found.", level); + return nullptr; + } + throw ConfigurationException("In property '"+data->getTag()+"': sub-property named '" + name + "': not found.", Logger::MAJOR); +} + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, int &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, data, level); + + auto parent_type = data->findAttribute("type")->getValue(); + auto parent_name = data->findAttribute("name")->getValue(); + + if (propNode == nullptr) + return; + + if (!_setPropertyFromAttr("value", toSet, *propNode, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, float &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, data, level); + auto parent_type = data->findAttribute("type")->getValue(); + auto parent_name = data->findAttribute("name")->getValue(); + + if (propNode == nullptr) + return; + + if (!_setPropertyFromAttr("value", toSet, *propNode, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); +} + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, bool &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, data, level); + auto parent_type = data->findAttribute("type")->getValue(); + auto parent_name = data->findAttribute("name")->getValue(); + + if (propNode == nullptr) + return; + + if (!_setPropertyFromAttr("value", toSet, *propNode, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::string &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, data, level); + auto parent_type = data->findAttribute("type")->getValue(); + auto parent_name = data->findAttribute("name")->getValue(); + + if (propNode == nullptr) + return; + + if (!_setPropertyFromAttr("value", toSet, *propNode, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); +} + + + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, Vector3 &toSet, std::shared_ptr &data, Logger::severity level) +{ + std::shared_ptr vectorProp = _findProperty(propertyName, data, level); + std::shared_ptr vector; + auto parent_type = data->findAttribute("type")->getValue(); + auto parent_name = data->findAttribute("name")->getValue(); + + if (vectorProp == nullptr) + return; + + try { + vector = vectorProp->findChild("Vector"); + } catch (...) { + if (level != Logger::MAJOR) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + else + throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", Logger::MAJOR); + return; + } + + if (!_setPropertyFromAttr("x", toSet.x, *vector, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + + if (!_setPropertyFromAttr("y", toSet.y, *vector, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + + if (!_setPropertyFromAttr("z", toSet.z, *vector, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); +} + + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, Vector2 &toSet, std::shared_ptr &data, Logger::severity level) +{ + std::shared_ptr vectorProp = _findProperty(propertyName, data, level); + std::shared_ptr vector; + auto parent_type = data->findAttribute("type")->getValue(); + auto parent_name = data->findAttribute("name")->getValue(); + + if (vectorProp == nullptr) + return; + + try { + vector = vectorProp->findChild("Vector"); + } catch (...) { + if (level != Logger::MAJOR) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + else + throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", Logger::MAJOR); + return; + } + + if (!_setPropertyFromAttr("x", toSet.x, *vector, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + + if (!_setPropertyFromAttr("y", toSet.y, *vector, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); +} + + + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, Rect &toSet, std::shared_ptr &data, Logger::severity level) +{ + std::shared_ptr rectProp = _findProperty(propertyName, data, level); + std::shared_ptr rect; + auto parent_type = data->findAttribute("type")->getValue(); + auto parent_name = data->findAttribute("name")->getValue(); + + if (rectProp == nullptr) + return; + + try { + rect = rectProp->findChild("Rect"); + } catch (...) { + if (level != Logger::MAJOR) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + else + throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", Logger::MAJOR); + return; + } + if (!_setPropertyFromAttr("x", toSet.x, *rect, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + + if (!_setPropertyFromAttr("y", toSet.y, *rect, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + + if (!_setPropertyFromAttr("width", toSet.width, *rect, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + + if (!_setPropertyFromAttr("height", toSet.height, *rect, level)) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); +} + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, data, level); + + if (propNode == nullptr) + return; + + for (auto &element : *propNode) { + try { + toSet.push_back(element->findAttribute("value")->getValueInt()); + } catch (...) { + Logger::log("Property Int List named '" + propertyName + + "': has no value", level); + } + } +} + + + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, data, level); + + if (propNode == nullptr) + return; + + for (auto &element : *propNode) { + try { + toSet.push_back(element->findAttribute("value")->getValueFloat()); + } catch (...) { + Logger::log("Property Float List named '" + propertyName + + "': has no value", level); + } + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, data, level); + + if (propNode == nullptr) + return; + + for (auto &element : *propNode) { + try { + toSet.push_back(element->findAttribute("value")->getValueBool()); + } catch (...) { + Logger::log("Property Bool List named '" + propertyName + + "': has no value", level); + } + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto propNode = _findProperty(propertyName, data, level); + + if (propNode == nullptr) + return; + + for (auto &element : *propNode) { + try { + toSet.push_back(element->findAttribute("value")->getValue()); + } catch (...) { + Logger::log("Property String List named '" + propertyName + + "': has no value", level); + } + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto vectorProp = _findProperty(propertyName, data, level); + std::shared_ptr vector; + size_t count = 0; + Vector3 tmp; + + if (vectorProp == nullptr) + return; + + for (auto &element : *vectorProp) { + tmp = Vector3(); + try { + vector = element->findChild("Vector"); + } catch (...) { + Logger::log("Incomplete Vector3 property named '" + propertyName + + "' at index" + std::to_string(count) + ": not found", + level); + continue; + } + _setPropertyFromAttr("x", tmp.x, *vector, level); + _setPropertyFromAttr("y", tmp.y, *vector, level); + _setPropertyFromAttr("z", tmp.z, *vector, level); + + toSet[count] = tmp; + count += 1; + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, GameObject &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto refProp = _findProperty(propertyName, data, level); + auto parent_type = data->findAttribute("type")->getValue(); + auto parent_name = data->findAttribute("name")->getValue(); + + if (refProp == nullptr) + return; + + try { + auto id = refProp->findAttribute("id")->getValue(); + toSet = SceneManager::findById(id); + } catch (...) { + if (level != Logger::MAJOR) + Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", level); + else + throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + + "': has missing value", Logger::MAJOR); + } +} + +bool Polymorph::Config::XmlComponent::_setPropertyFromAttr(const std::string& name, + int &toSet, + myxmlpp::Node &data, + Logger::severity level) +{ + try { + toSet = data.findAttribute(name)->getValueInt(); + return true; + } catch (const myxmlpp::Exception &e) { + if (level != Logger::MAJOR) + Logger::log(e.what(), + level); + else + throw ConfigurationException(e.what(), Logger::MAJOR); + return false; + } +} + +bool Polymorph::Config::XmlComponent::_setPropertyFromAttr(const std::string& name, + float &toSet, + myxmlpp::Node &data, + Logger::severity level) +{ + try { + toSet = data.findAttribute(name)->getValueFloat(); + return true; + } catch (const myxmlpp::Exception &e) { + if (level != Logger::MAJOR) + Logger::log(e.what(), + level); + else + throw ConfigurationException(e.what(), Logger::MAJOR); + return false; + } +} + +bool Polymorph::Config::XmlComponent::_setPropertyFromAttr(const std::string& name, + bool &toSet, + myxmlpp::Node &data, + Logger::severity level) +{ + try { + toSet = data.findAttribute(name)->getValueBool(); + return true; + } catch (const myxmlpp::Exception &e) { + if (level != Logger::MAJOR) + Logger::log(e.what(), + level); + else + throw ConfigurationException(e.what(), Logger::MAJOR); + return false; + } +} + +bool Polymorph::Config::XmlComponent::_setPropertyFromAttr(const std::string& name, + std::string &toSet, + myxmlpp::Node &data, + Logger::severity level) +{ + try { + toSet = data.findAttribute(name)->getValue(); + return true; + } catch (const myxmlpp::Exception &e) { + if (level != Logger::MAJOR) + Logger::log(e.what(), + level); + else + throw ConfigurationException(e.what(), Logger::MAJOR); + return false; + } +} + +void Polymorph::Config::XmlComponent::setProperty(const std::string& propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) +{ + auto refProp = _findProperty(propertyName, data, level); + auto i = 0; + + if (refProp == nullptr) + return; + + for (auto &elem : *refProp) { + try { + auto id = elem->findAttribute("id")->getValue(); + auto gameObject = SceneManager::findById(id); + + if (!gameObject) { + Logger::log("Property gameObject ref nb: " + std::to_string(i) + + ", in list named '" + propertyName + "': not found", + level); + throw; + } + toSet.push_back(gameObject); + } catch (myxmlpp::Exception &e) { + Logger::log("Property gameObject ref nb: " + std::to_string(i) + + ", in list named '" + propertyName + "': has no value" + + e.baseWhat(), level); + } + ++i; + } +} diff --git a/src/config/XmlEntity.cpp b/src/Config/XmlEntity.cpp similarity index 96% rename from src/config/XmlEntity.cpp rename to src/Config/XmlEntity.cpp index 6928d026..4ccc30fe 100644 --- a/src/config/XmlEntity.cpp +++ b/src/Config/XmlEntity.cpp @@ -5,12 +5,11 @@ ** header for XmlEntity.c */ -#include "XmlEntity.hpp" -#include "Entity_templated.hpp" + #include -#include "Log/Logger.hpp" -#include "Exceptions/ConfigurationException.hpp" -#include "default/TransformComponent.hpp" +#include +#include +#include namespace Polymorph { @@ -36,7 +35,7 @@ namespace Polymorph Engine &engine, std::string projectPath): _engine(engine) { this->_node = node; - _path = projectPath; + _path = std::move(projectPath); std::string name; try { diff --git a/src/config/XmlScene.cpp b/src/Config/XmlScene.cpp similarity index 88% rename from src/config/XmlScene.cpp rename to src/Config/XmlScene.cpp index 113e2bc2..0e736da3 100644 --- a/src/config/XmlScene.cpp +++ b/src/Config/XmlScene.cpp @@ -5,14 +5,9 @@ ** header for XmlScene.c */ -#include "config/XmlScene.hpp" -#include "config/XmlEntity.hpp" -#include "factory/ComponentInitializer.hpp" -#include "Entity.hpp" -#include "Engine.hpp" -#include "exceptions/Exception.hpp" -#include "Log/Logger.hpp" -#include "Exceptions/ConfigurationException.hpp" +#include +#include +#include namespace Polymorph { @@ -51,7 +46,7 @@ namespace Polymorph return _name; } - bool Config::XmlScene::isFirst() + bool Config::XmlScene::isFirst() const { return _first; } diff --git a/src/Engine.cpp b/src/Core/Engine.cpp similarity index 69% rename from src/Engine.cpp rename to src/Core/Engine.cpp index 70f42996..1c366ddd 100644 --- a/src/Engine.cpp +++ b/src/Core/Engine.cpp @@ -5,29 +5,31 @@ ** header for Polymorph.c */ -#include "XmlEntity.hpp" -#include "SceneManager.hpp" +#include +#include +#include +#include +#include +#include +#include +#include "ScriptingAPI/ScriptingApi.hpp" #include "Engine.hpp" -#include "Scene.hpp" -#include "Log/Logger.hpp" -#include -#include -#include "ConfigurationException.hpp" -#include "GraphicalException.hpp" + Polymorph::Engine::Engine(const std::string &projectPath, std::string projectName): _projectPath(projectPath), _projectName(std::move(projectName)) { Logger::setLogDir(projectPath + "/Logs"); _openProject(); _initDebugSettings(); - + _initVideoSettings(); _initAudioSettings(); _initPhysicSettings(); - + _initExectutionOrder(); _initLayers(); - + _initTemplates(); + _initPrefabs(); } int Polymorph::Engine::run() @@ -40,16 +42,16 @@ int Polymorph::Engine::run() { if (!!_display) GraphicalAPI::CurrentDisplay = (*_display).get(); - + _time.computeDeltaTime(); - + if (!!_display) { _display->fetchEvents(); _display->clearWindow(); } - + SceneManager::Current->updateComponents(); - + if (!!_display) { _display->displayWindow(); } @@ -137,38 +139,6 @@ void Polymorph::Engine::_initDebugSettings() void Polymorph::Engine::_initGameData() { - try { - std::shared_ptr prefabs = _projectConfig->getRoot()->findChild("Prefabs"); - - for (auto &prefab: *prefabs) { - try { - _prefabs.emplace_back(Config::XmlEntity(prefab, *this, _projectPath)); - } catch (...) { - Logger::log("Error loading prefab", Logger::MINOR); - } - } - } catch (myxmlpp::Exception &e) { - Logger::log("Error loading prefabs data in main config file", - Logger::MINOR); - } - - try { - std::shared_ptr prefabs = _projectConfig->getRoot()->findChild("Templates"); - - for (auto &prefab: *prefabs) { - try { - auto path = _projectPath + "/" + prefab->findAttribute("path")->getValue(); - auto templateDoc = myxmlpp::Doc(path); - _defaultConfigs.emplace_back(Config::XmlComponent(templateDoc.getRoot())); - } catch (...) { - Logger::log("Error loading component template", Logger::MINOR); - } - } - } catch (myxmlpp::Exception &e) { - Logger::log("Error loading templates data in main config file", - Logger::MINOR); - } - std::shared_ptr scenes = _projectConfig->getRoot()->findChild("Scenes"); if (scenes->empty()) @@ -192,19 +162,19 @@ Polymorph::Engine::~Engine() std::shared_ptr Polymorph::Engine::findSceneByName(const std::string& name) { - for (auto it = _scenes.begin(); it != _scenes.end(); ++it) { - if ((*it)->name == name) - return *it; + for (auto & _scene : _scenes) { + if (_scene->name == name) + return _scene; } return nullptr; } std::shared_ptr -Polymorph::Engine::findSceneById(std::string id) +Polymorph::Engine::findSceneById(const std::string& id) { - for (auto it = _scenes.begin(); it != _scenes.end(); ++it) { - if ((*it)->id == id) - return *it; + for (auto & _scene : _scenes) { + if (_scene->id == id) + return _scene; } return nullptr; } @@ -246,7 +216,7 @@ std::vector Polymorph::Engine::getDefaultConfig return _defaultConfigs; } -Polymorph::Config::XmlComponent &Polymorph::Engine::getDefaultConfig(std::string type) +Polymorph::Config::XmlComponent &Polymorph::Engine::getDefaultConfig(const std::string& type) { for (auto &c: _defaultConfigs) { if (c.getType() == type) @@ -256,7 +226,7 @@ Polymorph::Config::XmlComponent &Polymorph::Engine::getDefaultConfig(std::string return *Config::XmlComponent::Empty; } -void Polymorph::Engine::loadGraphicalAPI(std::string graphicalLibPath) +void Polymorph::Engine::loadGraphicalAPI(const std::string& graphicalLibPath) { try { @@ -271,7 +241,7 @@ void Polymorph::Engine::loadGraphicalAPI(std::string graphicalLibPath) } -void Polymorph::Engine::loadScriptingAPI(std::string scriptFactoryPath) +void Polymorph::Engine::loadScriptingAPI(const std::string& scriptFactoryPath) { try { @@ -279,7 +249,7 @@ void Polymorph::Engine::loadScriptingAPI(std::string scriptFactoryPath) } catch (ExceptionLogger &e) { e.what(); } catch (std::exception &e) { - Logger::log("Unknown error: " + std::string(e.what()), Logger::MAJOR); + Logger::log("[Scripting API]: " + std::string(e.what()), Logger::MAJOR); } } @@ -291,3 +261,75 @@ void Polymorph::Engine::loadEngine() throw std::runtime_error("No scenes built"); SceneManager::Current = *_scenes.begin(); } + +void Polymorph::Engine::_initPrefabs() +{ + + try { + std::shared_ptr prefabs = _projectConfig->getRoot()->findChild("Prefabs"); + + for (auto &prefab: *prefabs) { + try { + _prefabs.emplace_back(Config::XmlEntity(prefab, *this, _projectPath)); + } catch (myxmlpp::Exception &e) { + Logger::log("[Configuration] Error loading prefab." + e.baseWhat(), Logger::MINOR); + } catch (ExceptionLogger &e) { + e.what(); + } catch (std::exception &e) { + Logger::log("[Unknown] Error loading prefab\n" + std::string(e.what()), Logger::MINOR); + } + } + } catch (myxmlpp::NodeNotFoundException &e) { + Logger::log("[Configuration] Error loading prefabs: no prefabs to load." + e.baseWhat(), + Logger::MINOR); + }catch (myxmlpp::Exception &e) { + Logger::log("[Configuration] Error loading prefabs: " + e.baseWhat(), + Logger::MINOR); + } catch (ExceptionLogger &e) { + e.what(); + } catch (std::exception &e) { + Logger::log("[Unknown] Error loading prefabs data in main config file.\n" + std::string(e.what()), + Logger::MINOR); + } + +} + +void Polymorph::Engine::_initTemplates() +{ + + try { + std::shared_ptr prefabs = _projectConfig->getRoot()->findChild("Templates"); + + for (auto &prefab: *prefabs) { + try + { + auto path = _projectPath + "/" + + prefab->findAttribute("path")->getValue(); + auto templateDoc = myxmlpp::Doc(path); + _defaultConfigs.emplace_back( + Config::XmlComponent(templateDoc.getRoot())); + } catch (myxmlpp::Exception &e) { + Logger::log("[Configuration] Error template: " + e.baseWhat(), + Logger::MINOR); + } catch (ExceptionLogger &e) { + e.what(); + } catch (std::exception &e) { + Logger::log("[Unknown] Error loading template: \n" + std::string(e.what()), + Logger::MINOR); + } + } + } catch (myxmlpp::NodeNotFoundException &e) { + Logger::log("[Configuration] Error loading components templates: no templates to load." + e.baseWhat(), + Logger::MINOR); + } catch (myxmlpp::Exception &e) { + Logger::log("[Configuration] Error loading components templates: " + e.baseWhat(), + Logger::MINOR); + } catch (ExceptionLogger &e) { + e.what(); + } catch (std::exception &e) { + Logger::log("[Unknown] Error loading components templates: \n" + std::string(e.what()), + Logger::MINOR); + } + + +} diff --git a/src/component/builtins/drawables/ADrawableComponent.cpp b/src/Core/component/base/ADrawableComponent.cpp similarity index 79% rename from src/component/builtins/drawables/ADrawableComponent.cpp rename to src/Core/component/base/ADrawableComponent.cpp index 364a5f8f..f6ffb5be 100644 --- a/src/component/builtins/drawables/ADrawableComponent.cpp +++ b/src/Core/component/base/ADrawableComponent.cpp @@ -5,7 +5,8 @@ ** DrawableComponent.cpp */ -#include "default/drawables/ADrawableComponent.hpp" +#include +#include namespace Polymorph { diff --git a/src/component/builtins/colliders/Collider2dComponent.cpp b/src/Core/component/base/Collider2dComponent.cpp similarity index 71% rename from src/component/builtins/colliders/Collider2dComponent.cpp rename to src/Core/component/base/Collider2dComponent.cpp index d9a440a7..43d842b7 100644 --- a/src/component/builtins/colliders/Collider2dComponent.cpp +++ b/src/Core/component/base/Collider2dComponent.cpp @@ -5,34 +5,34 @@ ** Collider2dComponent.cpp */ -#include "default/Colliders/Collider2d.hpp" -#include "interfaces/ICollider2dHandler.hpp" -#include "Entity_templated.hpp" +#include +#include +#include using namespace Polymorph; -void Collider2dComponent::_broadCastCollisionStay(Collider2dComponent &collider) +void ACollider2dComponent::_broadCastCollisionStay(ACollider2dComponent &collider) { for (auto &c: gameObject.getComponents()) c->onCollisionStay(collider); } -void Collider2dComponent::_broadCastCollisionEnter(Collider2dComponent &collider) +void ACollider2dComponent::_broadCastCollisionEnter(ACollider2dComponent &collider) { for (auto &c: gameObject.getComponents()) c->onCollisionEnter(collider); } -void Collider2dComponent::_broadCastCollisionExit(Collider2dComponent &collider) +void ACollider2dComponent::_broadCastCollisionExit(ACollider2dComponent &collider) { for (auto &c: gameObject.getComponents()) c->onCollisionExit(collider); } -void Collider2dComponent::update() +void ACollider2dComponent::update() { - for (auto c2 = _colliderIdx + 1; c2 != _allColliders.end(); ++c2) + for (auto c2 = _colliderIdx + 1; c2 != _allColliders.end(); ++c2) { for (; !(*c2)->enabled && c2 != _allColliders.end(); ++c2); if (c2 == _allColliders.end()) @@ -43,25 +43,25 @@ void Collider2dComponent::update() } -void Collider2dComponent::_checkCollisionToBroadCast(Collider2dComponent &collider) +void ACollider2dComponent::_checkCollisionToBroadCast(ACollider2dComponent &collider) { bool collided = checkCollision(collider); - - if (collided + + if (collided && _encountered.contains(collider.gameObject.getId()) && _encountered[collider.gameObject.getId()]) { _broadCastCollisionStay(collider); } - - else if (collided + + else if (collided && (!_encountered.contains(collider.gameObject.getId()) || !_encountered[collider.gameObject.getId()]) ) { _encountered[collider.gameObject.getId()] = true; _broadCastCollisionEnter(collider); } - + else if (!collided && _encountered.contains(collider.gameObject.getId()) && _encountered[collider.gameObject.getId()]) @@ -71,15 +71,15 @@ void Collider2dComponent::_checkCollisionToBroadCast(Collider2dComponent &collid } } -Collider2dComponent::Collider2dComponent(Entity &gameObject, std::string &type) +ACollider2dComponent::ACollider2dComponent(Entity &gameObject, std::string type) :Component(type, gameObject) { _allColliders.push_back(this); - + _colliderIdx = _allColliders.end() - 1; } -Collider2dComponent::~Collider2dComponent() +ACollider2dComponent::~ACollider2dComponent() { _allColliders.erase(_colliderIdx); } diff --git a/src/component/Component.cpp b/src/Core/component/base/Component.cpp similarity index 92% rename from src/component/Component.cpp rename to src/Core/component/base/Component.cpp index 4451c6a5..b67adf06 100644 --- a/src/component/Component.cpp +++ b/src/Core/component/base/Component.cpp @@ -6,8 +6,7 @@ */ -#include "Component.hpp" -#include "Entity.hpp" +#include Polymorph::Component::Component(Polymorph::Entity &game_object) : _type("Component"), gameObject(game_object), transform(*game_object.transform), name(game_object.name) diff --git a/src/component/builtins/TransformComponent.cpp b/src/Core/component/builtins/TransformComponent.cpp similarity index 97% rename from src/component/builtins/TransformComponent.cpp rename to src/Core/component/builtins/TransformComponent.cpp index acf66bea..7ffb8e3a 100644 --- a/src/component/builtins/TransformComponent.cpp +++ b/src/Core/component/builtins/TransformComponent.cpp @@ -5,8 +5,8 @@ ** Transfoem.cpp.c */ -#include "default/TransformComponent.hpp" -#include "Entity.hpp" +#include +#include namespace Polymorph { @@ -202,7 +202,7 @@ namespace Polymorph void TransformComponent::_moveChildren(const Vector3 &delta) { - for (auto c : _children) { + for (auto &c : _children) { c->move(delta); } } diff --git a/src/component/builtins/colliders/ColliderCircle2d.cpp b/src/Core/component/builtins/colliders/ColliderCircle2d.cpp similarity index 61% rename from src/component/builtins/colliders/ColliderCircle2d.cpp rename to src/Core/component/builtins/colliders/ColliderCircle2d.cpp index 1e1e64a3..dddeed9d 100644 --- a/src/component/builtins/colliders/ColliderCircle2d.cpp +++ b/src/Core/component/builtins/colliders/ColliderCircle2d.cpp @@ -5,15 +5,14 @@ ** Collider2dCircleComponent.cpp */ -#include "default/Colliders/ColliderCircle2d.hpp" -#include "default/Colliders/ColliderRect2d.hpp" -#include "default/TransformComponent.hpp" -#include "Exceptions/ExceptionLogger.hpp" -#include "Utilities/Types/Circle.hpp" +#include +#include +#include +#include using namespace Polymorph; -bool ColliderCircle2dComponent::checkCollision(Collider2dComponent &other) +bool ColliderCircle2dComponent::checkCollision(ACollider2dComponent &other) { auto tmpPosition = Vector2(transform.getPosition()) + offset; auto otherPosition = Vector2(other.transform.getPosition()) + other.offset; @@ -23,7 +22,13 @@ bool ColliderCircle2dComponent::checkCollision(Collider2dComponent &other) if (circleShape) { return Circle::intersect(tmpPosition, radius, otherPosition, circleShape->radius); } else if (boxShape) { - return false; + return Circle::intersect(tmpPosition, radius, otherPosition, boxShape->size); } throw ExceptionLogger("ColliderBox2dComponent::checkCollision: unknown collider type"); } + +ColliderCircle2dComponent::ColliderCircle2dComponent(Entity &gameObject) + : ACollider2dComponent(gameObject, "ColliderCircle2d") +{ + +} diff --git a/src/component/builtins/colliders/ColliderRect2d.cpp b/src/Core/component/builtins/colliders/ColliderRect2d.cpp similarity index 61% rename from src/component/builtins/colliders/ColliderRect2d.cpp rename to src/Core/component/builtins/colliders/ColliderRect2d.cpp index aec216e3..9b8053df 100644 --- a/src/component/builtins/colliders/ColliderRect2d.cpp +++ b/src/Core/component/builtins/colliders/ColliderRect2d.cpp @@ -5,15 +5,14 @@ ** Collider2dBoxComponent.cpp */ -#include "default/Colliders/ColliderRect2d.hpp" -#include "default/Colliders/ColliderCircle2d.hpp" -#include "default/TransformComponent.hpp" -#include "Exceptions/ExceptionLogger.hpp" -#include "Utilities/Types/Rect.hpp" +#include +#include +#include +#include using namespace Polymorph; -bool ColliderRect2dComponent::checkCollision(Collider2dComponent &other) +bool ColliderRect2dComponent::checkCollision(ACollider2dComponent &other) { auto tmpPosition = Vector2(transform.getPosition()) + offset; auto otherPosition = Vector2(other.transform.getPosition()) + other.offset; @@ -21,9 +20,15 @@ bool ColliderRect2dComponent::checkCollision(Collider2dComponent &other) auto boxShape = dynamic_cast(&other); if (circleShape) { - return false; + return Rect::intersect(tmpPosition, size, otherPosition, circleShape->radius); } else if (boxShape) { return Rect::intersect(tmpPosition, size, otherPosition, boxShape->size); } throw ExceptionLogger("ColliderBox2dComponent::checkCollision: unknown collider type"); } + +ColliderRect2dComponent::ColliderRect2dComponent(Entity &entity) + : ACollider2dComponent(entity, "ColliderRect2d") +{ + +} diff --git a/src/component/builtins/drawables/SpriteRendererComponent.cpp b/src/Core/component/builtins/drawables/SpriteRendererComponent.cpp similarity index 73% rename from src/component/builtins/drawables/SpriteRendererComponent.cpp rename to src/Core/component/builtins/drawables/SpriteRendererComponent.cpp index 62d81498..f96a1d50 100644 --- a/src/component/builtins/drawables/SpriteRendererComponent.cpp +++ b/src/Core/component/builtins/drawables/SpriteRendererComponent.cpp @@ -5,10 +5,9 @@ ** SpriteRendererComponent.cpp */ -#include "default/drawables/SpriteRendererComponent.hpp" -#include "default/TransformComponent.hpp" -#include "GraphicalAPI/SpriteModule.hpp" -#include "GraphicalAPI/DisplayModule.hpp" +#include +#include +#include namespace Polymorph { diff --git a/src/component/builtins/drawables/TextRendererComponent.cpp b/src/Core/component/builtins/drawables/TextRendererComponent.cpp similarity index 73% rename from src/component/builtins/drawables/TextRendererComponent.cpp rename to src/Core/component/builtins/drawables/TextRendererComponent.cpp index 6c2bd685..a514ab99 100644 --- a/src/component/builtins/drawables/TextRendererComponent.cpp +++ b/src/Core/component/builtins/drawables/TextRendererComponent.cpp @@ -5,10 +5,9 @@ ** TextRendererComponent.cpp */ -#include "default/drawables/TextRendererComponent.hpp" -#include "default/TransformComponent.hpp" -#include "GraphicalAPI/SpriteModule.hpp" -#include "GraphicalAPI/DisplayModule.hpp" +#include +#include +#include namespace Polymorph { diff --git a/src/entity/Entity.cpp b/src/Core/entity/Entity.cpp similarity index 93% rename from src/entity/Entity.cpp rename to src/Core/entity/Entity.cpp index f7b78d46..aeaf53de 100644 --- a/src/entity/Entity.cpp +++ b/src/Core/entity/Entity.cpp @@ -5,18 +5,12 @@ ** header for Entity.c */ -#include "factory/ComponentFactory.hpp" -#include "default/TransformComponent.hpp" -#include "Entity_templated.hpp" -#include "Engine.hpp" -#include "XmlEntity.hpp" -#include "Component.hpp" -#include "Log/Logger.hpp" -#include "default/drawables/ADrawableComponent.hpp" -#include "Entity.hpp" +#include +#include +#include +#include #include "ScriptingAPI/ScriptingApi.hpp" - Polymorph::Entity::Entity(Config::XmlEntity &data, Engine &game) : _game(game), _xml_config(data), _stringId(data.getId()) { diff --git a/src/scene/Scene.cpp b/src/Core/scene/Scene.cpp similarity index 94% rename from src/scene/Scene.cpp rename to src/Core/scene/Scene.cpp index 51d7adc5..9fcbd359 100644 --- a/src/scene/Scene.cpp +++ b/src/Core/scene/Scene.cpp @@ -5,16 +5,10 @@ ** header for Scene.c */ -#include "XmlScene.hpp" -#include "Scene.hpp" - -#include -#include "Engine.hpp" -#include "Entity.hpp" -#include "XmlEntity.hpp" -#include "Time.hpp" -#include "default/TransformComponent.hpp" -#include "uuid.hpp" +#include +#include +#include +#include namespace Polymorph { @@ -107,7 +101,7 @@ namespace Polymorph else ++entity; } - return count; + return static_cast(count); } GameObject Scene::find(const std::string &needle) @@ -223,7 +217,7 @@ namespace Polymorph void Scene::addEntityAtIdx(const std::shared_ptr &entity, std::size_t idx) { - _entities.insert(_entities.begin() + idx, entity); + _entities.insert(_entities.begin() + (int)idx, entity); } } diff --git a/src/scene/SceneManager.cpp b/src/Core/scene/SceneManager.cpp similarity index 96% rename from src/scene/SceneManager.cpp rename to src/Core/scene/SceneManager.cpp index d553d048..5555d993 100644 --- a/src/scene/SceneManager.cpp +++ b/src/Core/scene/SceneManager.cpp @@ -5,12 +5,9 @@ ** SceneManager.cpp */ -#include "SceneManager.hpp" -#include "Scene.hpp" -#include "Engine.hpp" -#include "XmlEntity.hpp" -#include "Vector.hpp" -#include "default/TransformComponent.hpp" +#include +#include +#include std::vector Polymorph::SceneManager::getAll() { diff --git a/src/settings/AudioSettings.cpp b/src/Core/settings/AudioSettings.cpp similarity index 88% rename from src/settings/AudioSettings.cpp rename to src/Core/settings/AudioSettings.cpp index fff6ff0a..8a7244c9 100644 --- a/src/settings/AudioSettings.cpp +++ b/src/Core/settings/AudioSettings.cpp @@ -6,8 +6,8 @@ */ -#include "AudioSettings.hpp" -#include "Log/Logger.hpp" +#include +#include Polymorph::Settings::AudioSettings::AudioSettings( const std::shared_ptr &node) : _node(node) @@ -36,15 +36,15 @@ Polymorph::Settings::AudioSettings::_getVolume(const std::string &attrName) return 100; } -int Polymorph::Settings::AudioSettings::getMasterVolume() { +int Polymorph::Settings::AudioSettings::getMasterVolume() const { return _masterVolume; } -int Polymorph::Settings::AudioSettings::getMusicVolume() { +int Polymorph::Settings::AudioSettings::getMusicVolume() const { return _musicVolume; } -int Polymorph::Settings::AudioSettings::getSfxVolume() { +int Polymorph::Settings::AudioSettings::getSfxVolume() const { return _sfxVolume; } diff --git a/src/settings/PhysicsSettings.cpp b/src/Core/settings/PhysicsSettings.cpp similarity index 97% rename from src/settings/PhysicsSettings.cpp rename to src/Core/settings/PhysicsSettings.cpp index 32d834d1..00ea6b9d 100644 --- a/src/settings/PhysicsSettings.cpp +++ b/src/Core/settings/PhysicsSettings.cpp @@ -6,9 +6,9 @@ */ -#include "PhysicsSettings.hpp" -#include "Log/Logger.hpp" -#include "Exceptions/ConfigurationException.hpp" + +#include +#include Polymorph::Settings::PhysicsSettings::PhysicsSettings( const std::shared_ptr& node) diff --git a/src/settings/VideoSettings.cpp b/src/Core/settings/VideoSettings.cpp similarity index 98% rename from src/settings/VideoSettings.cpp rename to src/Core/settings/VideoSettings.cpp index 6f425ecc..08d23eca 100644 --- a/src/settings/VideoSettings.cpp +++ b/src/Core/settings/VideoSettings.cpp @@ -6,9 +6,9 @@ */ -#include "VideoSettings.hpp" -#include "Log/Logger.hpp" -#include "Exceptions/ConfigurationException.hpp" + +#include +#include Polymorph::Settings::VideoSettings::VideoSettings( const std::shared_ptr &node): _node(node) diff --git a/src/DynamicLoader.cpp b/src/DynamicLoader/DynamicLoader.cpp similarity index 89% rename from src/DynamicLoader.cpp rename to src/DynamicLoader/DynamicLoader.cpp index 539df90d..9181aca3 100644 --- a/src/DynamicLoader.cpp +++ b/src/DynamicLoader/DynamicLoader.cpp @@ -15,7 +15,7 @@ DynamicLibLoader::~DynamicLibLoader() dlclose(_handler); } -void DynamicLibLoader::loadHandler(std::string libPath) +void DynamicLibLoader::loadHandler(const std::string& libPath) { //TODO: check close error ? diff --git a/src/exeptions/ConfigurationException.cpp b/src/Exeptions/ConfigurationException.cpp similarity index 76% rename from src/exeptions/ConfigurationException.cpp rename to src/Exeptions/ConfigurationException.cpp index d77579af..a05b7140 100644 --- a/src/exeptions/ConfigurationException.cpp +++ b/src/Exeptions/ConfigurationException.cpp @@ -7,6 +7,6 @@ #include "ConfigurationException.hpp" -ConfigurationException::ConfigurationException(std::string message, +ConfigurationException::ConfigurationException(const std::string& message, Logger::severity level) : ExceptionLogger("[Corrupted files] " + message, level) {} diff --git a/src/exeptions/ExceptionLogger.cpp b/src/Exeptions/ExceptionLogger.cpp similarity index 86% rename from src/exeptions/ExceptionLogger.cpp rename to src/Exeptions/ExceptionLogger.cpp index 6a147c24..c768ae35 100644 --- a/src/exeptions/ExceptionLogger.cpp +++ b/src/Exeptions/ExceptionLogger.cpp @@ -7,9 +7,11 @@ #include "ExceptionLogger.hpp" +#include + ExceptionLogger::ExceptionLogger(std::string message, Logger::severity level) { - _message = message; + _message = std::move(message); _level = level; } diff --git a/src/exeptions/GraphicalException.cpp b/src/Exeptions/GraphicalException.cpp similarity index 77% rename from src/exeptions/GraphicalException.cpp rename to src/Exeptions/GraphicalException.cpp index 6b015dc9..d52503ce 100644 --- a/src/exeptions/GraphicalException.cpp +++ b/src/Exeptions/GraphicalException.cpp @@ -7,7 +7,7 @@ #include "GraphicalException.hpp" -GraphicalException::GraphicalException(std::string apiMessage, +GraphicalException::GraphicalException(const std::string& apiMessage, Logger::severity level) : ExceptionLogger("[Graphical issue] " + apiMessage, level) { diff --git a/src/GraphicalAPI/GraphicalAPI.cpp b/src/GraphicalAPI/GraphicalAPI.cpp index cd6cf917..e6d419c2 100644 --- a/src/GraphicalAPI/GraphicalAPI.cpp +++ b/src/GraphicalAPI/GraphicalAPI.cpp @@ -5,9 +5,9 @@ ** header for GraphicalAPI.c */ -#include "GraphicalAPI/GraphicalAPI.hpp" -#include "GraphicalAPI/DisplayModule.hpp" -#include "GraphicalException.hpp" +#include +#include +#include Polymorph::GraphicalAPI::GraphicalAPI(std::string handlerPath) { diff --git a/src/GraphicalAPI/Input.cpp b/src/GraphicalAPI/Input.cpp index d3c2468e..00c58d10 100644 --- a/src/GraphicalAPI/Input.cpp +++ b/src/GraphicalAPI/Input.cpp @@ -5,8 +5,9 @@ ** header for Input.c */ -#include "GraphicalAPI/Input.hpp" -#include "Log/Logger.hpp" +#include +#include +#include bool Polymorph::Input::isKeyHold(arcade::KeyCode code) { diff --git a/src/GraphicalAPI/DisplayModule.cpp b/src/GraphicalAPI/modules/DisplayModule.cpp similarity index 89% rename from src/GraphicalAPI/DisplayModule.cpp rename to src/GraphicalAPI/modules/DisplayModule.cpp index ae2b5c78..99a730cc 100644 --- a/src/GraphicalAPI/DisplayModule.cpp +++ b/src/GraphicalAPI/modules/DisplayModule.cpp @@ -6,24 +6,30 @@ */ #include "GraphicalAPI/GraphicalAPI.hpp" -#include "GraphicalAPI/ArcadeInterfaces/IDisplayModule.hpp" -#include "GraphicalAPI/DisplayModule.hpp" +#include "GraphicalAPI/arcade/IDisplayModule.hpp" +#include "GraphicalAPI/modules/DisplayModule.hpp" + +#include + +#include "GraphicalAPI/arcade/ISpriteModule.hpp" +#include "GraphicalAPI/modules/SpriteModule.hpp" + +#include "GraphicalAPI/arcade/ITextModule.hpp" +#include "GraphicalAPI/modules/TextModule.hpp" -#include "GraphicalAPI/ArcadeInterfaces/ISpriteModule.hpp" #include "DynamicLoader/DynamicLoader.hpp" -#include "GraphicalAPI/SpriteModule.hpp" #include "settings/VideoSettings.hpp" #include "GraphicalException.hpp" namespace Polymorph { - DisplayModule::DisplayModule(const std::shared_ptr &settings, - std::string title) : _settings(settings), _title(title) + DisplayModule::DisplayModule(std::shared_ptr settings, + std::string title) : _settings(std::move(settings)), _title(std::move(title)) { - + } - + void DisplayModule::draw(SpriteModule &sprite) { if (!_displayModule || !sprite.getSprite()) @@ -89,7 +95,7 @@ namespace Polymorph Logger::log("[Graphical API] No display available.", Logger::MINOR); return; } - _displayModule->setResolution(newResolution.x, newResolution.y); + _displayModule->setResolution((int)newResolution.x, (int)newResolution.y); } Vector2 DisplayModule::getResolution() @@ -147,11 +153,11 @@ namespace Polymorph Logger::log("[Graphical API] No display available.", Logger::MINOR); return; } - _displayModule->setResolution(res.x, res.y); + _displayModule->setResolution((int)res.x, (int)res.y); _displayModule->setWindowTitle(_title); _displayModule->setFps(_settings->getMaxFps()); _displayModule->setFullScreen(_settings->getFullscreen()); - + } bool DisplayModule::isKeyPressed(arcade::KeyCode code) diff --git a/src/GraphicalAPI/SpriteModule.cpp b/src/GraphicalAPI/modules/SpriteModule.cpp similarity index 85% rename from src/GraphicalAPI/SpriteModule.cpp rename to src/GraphicalAPI/modules/SpriteModule.cpp index 2d7e3b1c..3d367914 100644 --- a/src/GraphicalAPI/SpriteModule.cpp +++ b/src/GraphicalAPI/modules/SpriteModule.cpp @@ -5,12 +5,12 @@ ** header for Sprite.c */ -#include "GraphicalAPI/SpriteModule.hpp" -#include "GraphicalAPI/GraphicalAPI.hpp" -#include "DynamicLoader/DynamicLoader.hpp" -#include "Log/Logger.hpp" -#include "GraphicalException.hpp" -#include "XmlComponent.hpp" +#include +#include +#include +#include +#include +#include void Polymorph::SpriteModule::_loadModule() { @@ -21,8 +21,8 @@ void Polymorph::SpriteModule::_loadModule() Polymorph::SpriteModule::SpriteModule(std::string filePath) { _sprites.push_back(this); - _filePath = filePath; - + _filePath = std::move(filePath); + _loadModule(); } @@ -37,7 +37,7 @@ arcade::ISpriteModule *Polymorph::SpriteModule::getSprite() return _spriteModule; } -void Polymorph::SpriteModule::setSprite(std::string newFilePath) +void Polymorph::SpriteModule::setSprite(const std::string& newFilePath) { _filePath = newFilePath; if (_spriteModule) @@ -74,14 +74,14 @@ void Polymorph::SpriteModule::moveSprite(Polymorph::Vector2 move) Logger::log("No Sprite Object loaded", Logger::DEBUG); } -void Polymorph::SpriteModule::setCrop(Polymorph::Rect crop) +void Polymorph::SpriteModule::setCrop(const Polymorph::Rect& crop) { _crop = crop; - + if (_spriteModule) try { if (_crop.x > -1 && _crop.y > -1 && _crop.width > 0 && _crop.height > 0) - _spriteModule->setCrop(_crop.x, _crop.y, _crop.width, _crop.height); + _spriteModule->setCrop((int)_crop.x, (int)_crop.y, (int)_crop.width, (int)_crop.height); } catch (std::exception &e) { throw GraphicalException("Sprite Crop exception: " + std::string(e.what()), Logger::DEBUG); } diff --git a/src/GraphicalAPI/TextModule.cpp b/src/GraphicalAPI/modules/TextModule.cpp similarity index 86% rename from src/GraphicalAPI/TextModule.cpp rename to src/GraphicalAPI/modules/TextModule.cpp index 5b1b1c4c..9686ef19 100644 --- a/src/GraphicalAPI/TextModule.cpp +++ b/src/GraphicalAPI/modules/TextModule.cpp @@ -6,13 +6,13 @@ */ -#include "GraphicalAPI/GraphicalAPI.hpp" -#include "DynamicLoader/DynamicLoader.hpp" -#include "Log/Logger.hpp" -#include "GraphicalException.hpp" -#include "XmlComponent.hpp" -#include +#include +#include +#include +#include +#include + Polymorph::TextModule::TextModule(std::string fontPath, std::string text, unsigned int size) : _filepath(std::move(fontPath)), _str(std::move(text)) @@ -51,18 +51,18 @@ void Polymorph::TextModule::setFont(std::string newFilePath) } -void Polymorph::TextModule::setPosition(Polymorph::Vector2 position) +void Polymorph::TextModule::setPosition(Vector2 position) { if (_textModule) - _textModule->setPosition(position.x, position.y); + _textModule->setPosition((int)position.x, (int)position.y); else Logger::log("No text module loaded.", Logger::MINOR); } -void Polymorph::TextModule::move(Polymorph::Vector2 move) +void Polymorph::TextModule::move(Vector2 move) { if (_textModule) - _textModule->move(move.x, move.y); + _textModule->move((int)move.x, (int)move.y); else Logger::log("No text module loaded.", Logger::MINOR); @@ -114,13 +114,16 @@ Polymorph::TextModule &Polymorph::TextModule::operator=(const std::string &newTe _textModule->setText(newText); else Logger::log("No text module loaded.", Logger::MINOR); + return *this; } + Polymorph::TextModule &Polymorph::TextModule::operator+=(const std::string &newText) { if (_textModule) _textModule->setText(_str + newText); else Logger::log("No text module loaded.", Logger::MINOR); + return *this; } std::string Polymorph::TextModule::operator+(const std::string &newText) diff --git a/src/Logger.cpp b/src/Log/Logger.cpp similarity index 69% rename from src/Logger.cpp rename to src/Log/Logger.cpp index aff0d385..d2503e4d 100644 --- a/src/Logger.cpp +++ b/src/Log/Logger.cpp @@ -5,22 +5,24 @@ ** header for Logger.c */ -#include #include #include +#include +#include +#include #include "Log/Logger.hpp" -void Logger::log(std::string message, std::string specificFile, +void Logger::log(const std::string& message, std::string specificFile, Logger::severity level) { if (_logInstance.empty()) initLogInstance(); - _logFile(message, specificFile, level); + _logFile(message, std::move(specificFile), level); _consoleLog(message, level); } -void Logger::log(std::string message, Logger::severity level) +void Logger::log(const std::string& message, Logger::severity level) { if (_logInstance.empty()) initLogInstance(); @@ -36,12 +38,12 @@ void Logger::initLogInstance(Mode mode) _logInstance = _getTimeNow("%F_%X"); } -void Logger::_logFile(std::string message, Logger::severity level) +void Logger::_logFile(const std::string& message, Logger::severity level) { if (_mode == RELEASE_MODE && level == DEBUG) return; - std::fstream file(_logDir + "/"+ _logInstance + "_"+ _engineLogFile, std::ios_base::out|std::ios_base::app); + std::fstream file(_logDir + "/"+ _logInstance, std::ios_base::out|std::ios_base::app); if (!file.is_open()) throw std::runtime_error("Failed to open log file"); @@ -50,7 +52,7 @@ void Logger::_logFile(std::string message, Logger::severity level) file.close(); } -std::string Logger::_getTimeNow(std::string flags) +std::string Logger::_getTimeNow(const std::string& flags) { char buffer[80]; time_t rawtime; @@ -59,7 +61,7 @@ std::string Logger::_getTimeNow(std::string flags) time (&rawtime); timeinfo = localtime (&rawtime); std::strftime(buffer, 80, flags.c_str(), timeinfo); - std::string s(""); + std::string s; s+= buffer; return buffer; } @@ -81,12 +83,12 @@ std::string Logger::_severity_to_string(Logger::severity level) } void -Logger::_logFile(std::string message, std::string filepath, Logger::severity level) +Logger::_logFile(const std::string& message, const std::string& filepath, Logger::severity level) { if (_mode == RELEASE_MODE && level == DEBUG) return; - std::ofstream file(_logDir + _logInstance + "/"+ filepath); + std::ofstream file(_logDir + "/" + filepath); if (!file.is_open()) throw std::runtime_error("Failed to open log file"); @@ -95,7 +97,7 @@ Logger::_logFile(std::string message, std::string filepath, Logger::severity lev file.close(); } -void Logger::_consoleLog(std::string message, Logger::severity level) +void Logger::_consoleLog(const std::string& message, Logger::severity level) { if (_mode == RELEASE_MODE && level == DEBUG) return; @@ -104,12 +106,14 @@ void Logger::_consoleLog(std::string message, Logger::severity level) } -void Logger::setLogDir(std::string logDir) +void Logger::setLogDir(const std::string& logDir) { _logDir = logDir; + if (!std::filesystem::is_directory(logDir)) + std::filesystem::create_directory(logDir); } -void Logger::setLogInstanceName(std::string logInstanceName) +void Logger::setLogInstanceName(const std::string& logInstanceName) { _logInstance = logInstanceName + "_" + _getTimeNow("%F_%X"); } diff --git a/src/ScriptingApi/ScriptingApi.cpp b/src/ScriptingApi/ScriptingApi.cpp index 2337ba1e..7bee205d 100644 --- a/src/ScriptingApi/ScriptingApi.cpp +++ b/src/ScriptingApi/ScriptingApi.cpp @@ -6,8 +6,8 @@ */ #include "ScriptingAPI/ScriptingApi.hpp" -#include "Log/Logger.hpp" -#include "ExceptionLogger.hpp" +#include "ScriptingAPI/IScriptFactory.hpp" +#include Polymorph::ScriptingApi::Initializer Polymorph::ScriptingApi::create(std::string &type, @@ -16,7 +16,7 @@ Polymorph::ScriptingApi::create(std::string &type, { if (!_instance || !_instance->_scriptFactory) { - Logger::log("No Script factory loaded to try load component type: '"+type+"'.", Logger::DEBUG); + Logger::log("[Scripting API] No Script factory loaded to try load component type: '"+type+"'.", Logger::DEBUG); return nullptr; } return _instance->_scriptFactory->create(type, data, entity); @@ -25,7 +25,7 @@ Polymorph::ScriptingApi::create(std::string &type, Polymorph::ScriptingApi::ScriptingApi(std::string libPath) { if (_instance != nullptr) - throw ExceptionLogger("Tried to create ScriptingAPI where one exist already.", Logger::MAJOR); + throw ExceptionLogger("[Scripting API] Tried to create ScriptingAPI where one exist already.", Logger::MAJOR); _instance = this; try { diff --git a/src/utilities/Time.cpp b/src/Utilities/Time.cpp similarity index 89% rename from src/utilities/Time.cpp rename to src/Utilities/Time.cpp index ac604e31..36387a82 100644 --- a/src/utilities/Time.cpp +++ b/src/Utilities/Time.cpp @@ -5,13 +5,13 @@ ** Time.cpp */ -#include "Time.hpp" +#include namespace Polymorph { - Time::Time() : _lastTime(Clock::now()) {}; + Time::Time() : _lastTime(Clock::now()) {} void Time::computeDeltaTime() { diff --git a/src/Utilities/types/Circle.cpp b/src/Utilities/types/Circle.cpp new file mode 100644 index 00000000..d2c99b05 --- /dev/null +++ b/src/Utilities/types/Circle.cpp @@ -0,0 +1,175 @@ +/* +** EPITECH PROJECT, 2022 +** Circle.cpp +** File description: +** Circle.cpp +*/ + +#include +#include + +Polymorph::Circle::Circle(const Polymorph::Vector2 ¢er, float radius): center(center), radius(radius) +{ +} + +Polymorph::Circle::Circle(const Polymorph::Circle &circle): center(circle.center), radius(circle.radius) +{ +} + +Polymorph::Circle::Circle(float x, float y, float radius): center(x, y), radius(radius) +{ +} + +bool Polymorph::Circle::intersect(const Polymorph::Circle &circle1, + const Polymorph::Circle &circle2) +{ + auto tmp = circle1.center.delta(circle2.center); + + if (sqrtf(powf(tmp.x, 2.0f) + powf(tmp.y, 2.0f)) <= circle1.radius + circle2.radius) + return true; + return false; +} + +bool Polymorph::Circle::intersect(const Polymorph::Circle &circle, + const Polymorph::Vector2 ¢er, + float radius) +{ + auto tmp = circle.center.delta(center); + + if (sqrtf(powf(tmp.x, 2.0f) + powf(tmp.y, 2.0f)) <= circle.radius + radius) + return true; + return false; +} + +bool Polymorph::Circle::intersect(const Polymorph::Vector2 ¢er, + float radius, + const Polymorph::Circle &circle) +{ + auto tmp = circle.center.delta(center); + + if (sqrtf(powf(tmp.x, 2.0f) + powf(tmp.y, 2.0f)) <= circle.radius + radius) + return true; + return false; +} + +bool Polymorph::Circle::intersect(const Polymorph::Vector2 ¢er1, + float radius1, + const Polymorph::Vector2 ¢er2, + float radius2) +{ + auto tmp = center1.delta(center2); + + if (sqrtf(powf(tmp.x, 2.0f) + powf(tmp.y, 2.0f)) <= radius1 + radius2) + return true; + return false; +} + +bool Polymorph::Circle::intersect(const Polymorph::Rect &rect, + const Polymorph::Circle &circle) +{ + auto circleDistanceX = fabs(circle.center.x - rect.x); + auto circleDistanceY = fabs(circle.center.y - rect.y); + + if (circleDistanceX > (rect.width/2 + circle.radius) || circleDistanceY > (rect.height/2 + circle.radius)) + return false; + if (circleDistanceX <= (rect.width/2) || circleDistanceY <= (rect.height/2)) + return true; + return ((pow((circleDistanceX - rect.width/2), 2) + pow((circleDistanceY - rect.height/2), 2)) <= (pow(circle.radius, 2))); +} + +bool Polymorph::Circle::intersect(const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size, + const Polymorph::Circle &circle) +{ + auto circleDistanceX = fabs(circle.center.x - position.x); + auto circleDistanceY = fabs(circle.center.y - position.y); + + if (circleDistanceX > (size.x/2 + circle.radius) || circleDistanceY > (size.y/2 + circle.radius)) + return false; + if (circleDistanceX <= (size.x/2) || circleDistanceY <= (size.y/2)) + return true; + return ((pow((circleDistanceX - size.x/2), 2) + pow((circleDistanceY - size.y/2), 2)) <= (pow(circle.radius, 2))); +} + +bool Polymorph::Circle::intersect(const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size, + const Polymorph::Vector2 ¢er, + float radius) +{ + auto circleDistanceX = fabs(center.x - position.x); + auto circleDistanceY = fabs(center.y - position.y); + + if (circleDistanceX > (size.x/2 + radius) || circleDistanceY > (size.y/2 + radius)) + return false; + if (circleDistanceX <= (size.x/2) || circleDistanceY <= (size.y/2)) + return true; + return ((pow((circleDistanceX - size.x/2), 2) + pow((circleDistanceY - size.y/2), 2)) <= (pow(radius, 2))); +} + +bool Polymorph::Circle::intersect(const Polymorph::Rect &rect, + const Polymorph::Vector2 ¢er, + float radius) +{ + auto circleDistanceX = fabs(center.x - rect.x); + auto circleDistanceY = fabs(center.y - rect.y); + + if (circleDistanceX > (rect.width/2 + radius) || circleDistanceY > (rect.height/2 + radius)) + return false; + if (circleDistanceX <= (rect.width/2) || circleDistanceY <= (rect.height/2)) + return true; + return ((pow((circleDistanceX - rect.width/2), 2) + pow((circleDistanceY - rect.height/2), 2)) <= (pow(radius, 2))); +} + +bool Polymorph::Circle::intersect(const Polymorph::Circle &circle, + const Polymorph::Rect &rect) +{ + auto circleDistanceX = fabs(circle.center.x - rect.x); + auto circleDistanceY = fabs(circle.center.y - rect.y); + + if (circleDistanceX > (rect.width/2 + circle.radius) || circleDistanceY > (rect.height/2 + circle.radius)) + return false; + if (circleDistanceX <= (rect.width/2) || circleDistanceY <= (rect.height/2)) + return true; + return ((pow((circleDistanceX - rect.width/2), 2) + pow((circleDistanceY - rect.height/2), 2)) <= (pow(circle.radius, 2))); +} + +bool Polymorph::Circle::intersect(const Polymorph::Circle &circle, + const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size) +{ + auto circleDistanceX = fabs(circle.center.x - position.x); + auto circleDistanceY = fabs(circle.center.y - position.y); + + if (circleDistanceX > (size.x/2 + circle.radius) || circleDistanceY > (size.y/2 + circle.radius)) + return false; + if (circleDistanceX <= (size.x/2) || circleDistanceY <= (size.y/2)) + return true; + return ((pow((circleDistanceX - size.x/2), 2) + pow((circleDistanceY - size.y/2), 2)) <= (pow(circle.radius, 2))); +} + +bool Polymorph::Circle::intersect(const Polymorph::Vector2 ¢er, float radius, + const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size) +{ + auto circleDistanceX = fabs(center.x - position.x); + auto circleDistanceY = fabs(center.y - position.y); + + if (circleDistanceX > (size.x/2 + radius) || circleDistanceY > (size.y/2 + radius)) + return false; + if (circleDistanceX <= (size.x/2) || circleDistanceY <= (size.y/2)) + return true; + return ((pow((circleDistanceX - size.x/2), 2) + pow((circleDistanceY - size.y/2), 2)) <= (pow(radius, 2))); +} + +bool Polymorph::Circle::intersect(const Polymorph::Vector2 ¢er, float radius, + const Polymorph::Rect &rect) +{ + auto circleDistanceX = fabs(center.x - rect.x); + auto circleDistanceY = fabs(center.y - rect.y); + + if (circleDistanceX > (rect.width/2 + radius) || circleDistanceY > (rect.height/2 + radius)) + return false; + if (circleDistanceX <= (rect.width/2) || circleDistanceY <= (rect.height/2)) + return true; + return ((pow((circleDistanceX - rect.width/2), 2) + pow((circleDistanceY - rect.height/2), 2)) <= (pow(radius, 2))); +} diff --git a/src/GraphicalAPI/Color.cpp b/src/Utilities/types/Color.cpp similarity index 74% rename from src/GraphicalAPI/Color.cpp rename to src/Utilities/types/Color.cpp index 4f4ecf2c..ffa63429 100644 --- a/src/GraphicalAPI/Color.cpp +++ b/src/Utilities/types/Color.cpp @@ -5,8 +5,8 @@ ** Color.cpp */ -#include "GraphicalAPI/Color.hpp" -#include "XmlComponent.hpp" +#include +#include Polymorph::Color::Color(std::shared_ptr &data) @@ -35,9 +35,9 @@ Polymorph::Color::Color(unsigned char r, unsigned char g, unsigned char b) } void -Polymorph::Color::setColor(unsigned char r, unsigned char g, unsigned char b) +Polymorph::Color::setColor(unsigned char red, unsigned char green, unsigned char blue) { - this->r = r; - this->g = g; - this->b = b; + this->r = red; + this->g = green; + this->b = blue; } diff --git a/src/Utilities/types/Rect.cpp b/src/Utilities/types/Rect.cpp new file mode 100644 index 00000000..7f23a7a7 --- /dev/null +++ b/src/Utilities/types/Rect.cpp @@ -0,0 +1,165 @@ +/* +** EPITECH PROJECT, 2022 +** Rect.cpp +** File description: +** Rect.cpp +*/ + +#include + +bool Polymorph::Rect::intersect(const Polymorph::Rect &rect1, const Polymorph::Rect &rect2) +{ + if (rect1.x + rect1.width < rect2.x + || rect1.x > rect2.x + rect2.width + || rect1.y + rect1.height < rect2.y + || rect1.y > rect2.y + rect2.height) + return false; + return true; +} + +bool Polymorph::Rect::intersect(const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size, + const Polymorph::Rect &rect) +{ + if (rect.x + rect.width < position.x + || rect.x > position.x + size.x + || rect.y + rect.height < position.y + || rect.y > position.y + size.y) + return false; + return true; +} + +bool Polymorph::Rect::intersect(const Polymorph::Rect &rect, + const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size) +{ + if (rect.x + rect.width < position.x + || rect.x > position.x + size.x + || rect.y + rect.height < position.y + || rect.y > position.y + size.y) + return false; + return true; +} + +bool Polymorph::Rect::intersect(const Polymorph::Vector2 &position1, + const Polymorph::Vector2 &size1, + const Polymorph::Vector2 &position2, + const Polymorph::Vector2 &size2) +{ + if (position1.x + size1.x < position2.x + || position1.x > position2.x + size2.x + || position1.y + size1.y < position2.y + || position1.y > position2.y + size2.y) + return false; + return true; +} + +bool Polymorph::Rect::intersect(const Polymorph::Rect &rect, + const Polymorph::Circle &circle) +{ + auto circleDistanceX = fabs(circle.center.x - rect.x); + auto circleDistanceY = fabs(circle.center.y - rect.y); + + if (circleDistanceX > (rect.width/2 + circle.radius) || circleDistanceY > (rect.height/2 + circle.radius)) + return false; + if (circleDistanceX <= (rect.width/2) || circleDistanceY <= (rect.height/2)) + return true; + return ((pow((circleDistanceX - rect.width/2), 2) + pow((circleDistanceY - rect.height/2), 2)) <= (pow(circle.radius, 2))); +} + +bool Polymorph::Rect::intersect(const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size, + const Polymorph::Circle &circle) +{ + auto circleDistanceX = fabs(circle.center.x - position.x); + auto circleDistanceY = fabs(circle.center.y - position.y); + + if (circleDistanceX > (size.x/2 + circle.radius) || circleDistanceY > (size.y/2 + circle.radius)) + return false; + if (circleDistanceX <= (size.x/2) || circleDistanceY <= (size.y/2)) + return true; + return ((pow((circleDistanceX - size.x/2), 2) + pow((circleDistanceY - size.y/2), 2)) <= (pow(circle.radius, 2))); +} + +bool Polymorph::Rect::intersect(const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size, + const Polymorph::Vector2 ¢er, + float radius) +{ + auto circleDistanceX = fabs(center.x - position.x); + auto circleDistanceY = fabs(center.y - position.y); + + if (circleDistanceX > (size.x/2 + radius) || circleDistanceY > (size.y/2 + radius)) + return false; + if (circleDistanceX <= (size.x/2) || circleDistanceY <= (size.y/2)) + return true; + return ((pow((circleDistanceX - size.x/2), 2) + pow((circleDistanceY - size.y/2), 2)) <= (pow(radius, 2))); +} + +bool Polymorph::Rect::intersect(const Polymorph::Rect &rect, + const Polymorph::Vector2 ¢er, + float radius) +{ + auto circleDistanceX = fabs(center.x - rect.x); + auto circleDistanceY = fabs(center.y - rect.y); + + if (circleDistanceX > (rect.width/2 + radius) || circleDistanceY > (rect.height/2 + radius)) + return false; + if (circleDistanceX <= (rect.width/2) || circleDistanceY <= (rect.height/2)) + return true; + return ((pow((circleDistanceX - rect.width/2), 2) + pow((circleDistanceY - rect.height/2), 2)) <= (pow(radius, 2))); +} + +bool Polymorph::Rect::intersect(const Polymorph::Circle &circle, + const Polymorph::Rect &rect) +{ + auto circleDistanceX = fabs(circle.center.x - rect.x); + auto circleDistanceY = fabs(circle.center.y - rect.y); + + if (circleDistanceX > (rect.width/2 + circle.radius) || circleDistanceY > (rect.height/2 + circle.radius)) + return false; + if (circleDistanceX <= (rect.width/2) || circleDistanceY <= (rect.height/2)) + return true; + return ((pow((circleDistanceX - rect.width/2), 2) + pow((circleDistanceY - rect.height/2), 2)) <= (pow(circle.radius, 2))); +} + +bool Polymorph::Rect::intersect(const Polymorph::Circle &circle, + const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size) +{ + auto circleDistanceX = fabs(circle.center.x - position.x); + auto circleDistanceY = fabs(circle.center.y - position.y); + + if (circleDistanceX > (size.x/2 + circle.radius) || circleDistanceY > (size.y/2 + circle.radius)) + return false; + if (circleDistanceX <= (size.x/2) || circleDistanceY <= (size.y/2)) + return true; + return ((pow((circleDistanceX - size.x/2), 2) + pow((circleDistanceY - size.y/2), 2)) <= (pow(circle.radius, 2))); +} + +bool Polymorph::Rect::intersect(const Polymorph::Vector2 ¢er, float radius, + const Polymorph::Vector2 &position, + const Polymorph::Vector2 &size) +{ + auto circleDistanceX = fabs(center.x - position.x); + auto circleDistanceY = fabs(center.y - position.y); + + if (circleDistanceX > (size.x/2 + radius) || circleDistanceY > (size.y/2 + radius)) + return false; + if (circleDistanceX <= (size.x/2) || circleDistanceY <= (size.y/2)) + return true; + return ((pow((circleDistanceX - size.x/2), 2) + pow((circleDistanceY - size.y/2), 2)) <= (pow(radius, 2))); +} + +bool Polymorph::Rect::intersect(const Polymorph::Vector2 ¢er, float radius, + const Polymorph::Rect &rect) +{ + auto circleDistanceX = fabs(center.x - rect.x); + auto circleDistanceY = fabs(center.y - rect.y); + + if (circleDistanceX > (rect.width/2 + radius) || circleDistanceY > (rect.height/2 + radius)) + return false; + if (circleDistanceX <= (rect.width/2) || circleDistanceY <= (rect.height/2)) + return true; + return ((pow((circleDistanceX - rect.width/2), 2) + pow((circleDistanceY - rect.height/2), 2)) <= (pow(radius, 2))); +} diff --git a/src/utilities/types/Vector.cpp b/src/Utilities/types/Vector.cpp similarity index 96% rename from src/utilities/types/Vector.cpp rename to src/Utilities/types/Vector.cpp index 48ae264e..9085ac91 100644 --- a/src/utilities/types/Vector.cpp +++ b/src/Utilities/types/Vector.cpp @@ -5,7 +5,7 @@ ** Vector.cpp.c */ -#include "Types/Vector.hpp" +#include namespace Polymorph { @@ -26,7 +26,7 @@ namespace Polymorph Vector3::Vector3(float x, float y, float z): x(x), y(y), z(z) {} - Vector3::Vector3(float x, float y) : x(x), y(y), z(z) + Vector3::Vector3(float x, float y) : x(x), y(y), z(0) {} Vector3 Vector3::operator+(const Vector3 &other) const { diff --git a/src/utilities/uuid.cpp b/src/Utilities/uuid.cpp similarity index 88% rename from src/utilities/uuid.cpp rename to src/Utilities/uuid.cpp index 9a62058f..a9f4d8bc 100644 --- a/src/utilities/uuid.cpp +++ b/src/Utilities/uuid.cpp @@ -6,7 +6,7 @@ */ -#include "uuid.hpp" +#include std::string Polymorph::uuid::uuid() { diff --git a/src/component/AComponentInitializer.cpp b/src/component/AComponentInitializer.cpp deleted file mode 100644 index 9c1c24ca..00000000 --- a/src/component/AComponentInitializer.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* -** EPITECH PROJECT, 2020 -** AComponentInitializer.cpp -** File description: -** AComponentInitializer.cpp -*/ - -#include "component/factory/ComponentInitializer.hpp" -#include "XmlComponent.hpp" -#include "Component.hpp" - -namespace Polymorph -{ - AComponentInitializer::AComponentInitializer(const std::string &type, Config::XmlComponent &data, - Entity &entity) : data(data), type(type) - {} - - void AComponentInitializer::_init() - { - component->enabled = data.isEnabled(); - } -} diff --git a/src/config/XmlComponent.cpp b/src/config/XmlComponent.cpp deleted file mode 100644 index cc6128f5..00000000 --- a/src/config/XmlComponent.cpp +++ /dev/null @@ -1,974 +0,0 @@ -/* -** EPITECH PROJECT, 2020 -** XmlComponent.cpp.cc -** File description: -** header for XmlComponent.c -*/ - - -#include "XmlComponent.hpp" -#include "Log/Logger.hpp" -#include "Vector.hpp" -#include "Rect.hpp" -#include "Exceptions/ConfigurationException.hpp" -#include "SceneManager.hpp" -#include - - -std::string Polymorph::Config::XmlComponent::getType() -{ - if (this == Empty.get()) - return "Empty"; - try { - type = node->findAttribute("type")->getValue(); - return type; - } catch(myxmlpp::Exception &e) { - throw ConfigurationException("No Component type found in configuration !\n"+e.baseWhat(), Logger::MAJOR); - } -} - -bool Polymorph::Config::XmlComponent::isEnabled() -{ - try { - return node->findAttribute("enabled")->getValueBool(); - } catch(myxmlpp::Exception &e) { - Logger::log("No state property found for component '" + type + - "': set to false by default", Logger::DEBUG); - return false; - } -} - - - -Polymorph::Config::XmlComponent::XmlComponent(const std::shared_ptr &node) -{ - this->node = node; -} - -std::shared_ptr Polymorph::Config::XmlComponent::_findProperty(std::string name, Logger::severity level) -{ - for (auto &property: *node) { - try { - auto attr = property->findAttribute("name"); - if (attr->getValue() == name) - return property; - } catch (...) {} - } - if (level != Logger::MAJOR) - { - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': property named '" + name + "': not found.", level); - return nullptr; - } - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': property named '" + name + "': not found.", Logger::MAJOR); -} - - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, int &toSet, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, level); - - if (propNode == nullptr) - return; - - try { - toSet = propNode->findAttribute("value")->getValueInt(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, float &toSet, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, level); - - if (propNode == nullptr) - return; - - try { - toSet = propNode->findAttribute("value")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, bool &toSet, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, level); - - if (propNode == nullptr) - return; - - try { - toSet = propNode->findAttribute("value")->getValueBool(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::string &toSet, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, level); - - if (propNode == nullptr) - return; - - try { - toSet = propNode->findAttribute("value")->getValue(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, Vector3 &toSet, Logger::severity level) -{ - std::shared_ptr vectorProp = _findProperty(propertyName, level); - std::shared_ptr vector; - - if (vectorProp == nullptr) - return; - - try { - vector = vectorProp->findChild("Vector"); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - return; - } - - try { - toSet.x = vector->findAttribute("x")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.y = vector->findAttribute("y")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.z = vector->findAttribute("z")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, Vector2 &toSet, Logger::severity level) -{ - std::shared_ptr vectorProp = _findProperty(propertyName, level); - std::shared_ptr vector; - - if (vectorProp == nullptr) - return; - - try { - vector = vectorProp->findChild("Vector"); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - return; - } - - try { - toSet.x = vector->findAttribute("x")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.y = vector->findAttribute("y")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, Rect &toSet, Logger::severity level) -{ - std::shared_ptr rectProp = _findProperty(propertyName, level); - std::shared_ptr rect; - - if (rectProp == nullptr) - return; - - try { - rect = rectProp->findChild("Rect"); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - return; - } - - try { - toSet.x = rect->findAttribute("x")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.y = rect->findAttribute("y")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.width = rect->findAttribute("width")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.height = rect->findAttribute("height")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, level); - - if (propNode == nullptr) - return; - - for (auto &element : *propNode) { - try { - toSet.push_back(element->findAttribute("value")->getValueInt()); - } catch (...) { - Logger::log("Property Int List named '" + propertyName + - "': has no value", Logger::DEBUG); - } - } -} - - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, level); - - if (propNode == nullptr) - return; - - for (auto &element : *propNode) { - try { - toSet.push_back(element->findAttribute("value")->getValueFloat()); - } catch (...) { - Logger::log("Property Float List named '" + propertyName + - "': has no value", Logger::DEBUG); - } - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, level); - - if (propNode == nullptr) - return; - - for (auto &element : *propNode) { - try { - toSet.push_back(element->findAttribute("value")->getValueBool()); - } catch (...) { - Logger::log("Property Bool List named '" + propertyName + - "': has no value", Logger::DEBUG); - } - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, level); - - if (propNode == nullptr) - return; - - for (auto &element : *propNode) { - try { - toSet.push_back(element->findAttribute("value")->getValue()); - } catch (...) { - Logger::log("Property String List named '" + propertyName + - "': has no value", Logger::DEBUG); - } - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, Logger::severity level) -{ - auto vectorProp = _findProperty(propertyName, level); - std::shared_ptr vector; - size_t count = 0; - Vector3 tmp; - - if (vectorProp == nullptr) - return; - - for (auto &element : *vectorProp) { - tmp = Vector3(); - try { - vector = element->findChild("Vector"); - } catch (...) { - Logger::log("Incomplete Vector3 property named '" + propertyName + - "' at index" + std::to_string(count) + ": not found", - Logger::DEBUG); - continue; - } - - try { - tmp.x = vector->findAttribute("x")->getValueFloat(); - } catch (...) { - Logger::log("x value of vector property named '" + propertyName + - "' at index" + std::to_string(count) + ": not found", - Logger::DEBUG); - } - - try { - tmp.y = vector->findAttribute("y")->getValueFloat(); - } catch (...) { - Logger::log("y value of vector property named '" + propertyName + - "' at index" + std::to_string(count) + ": not found", - Logger::DEBUG); - } - - try { - tmp.z = vector->findAttribute("z")->getValueFloat(); - } catch (...) { - Logger::log("z value of vector property named '" + propertyName + - "' at index" + std::to_string(count) + ": not found", - Logger::DEBUG); - } - - toSet[count] = tmp; - count += 1; - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, Sprite &toSet, Logger::severity level) -{ - auto data = _findProperty(propertyName, level); - - try { - toSet = GraphicalAPI::createSprite(data); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, Text &toSet, Logger::severity level) -{ - auto data = _findProperty(propertyName, level); - - try { - toSet = GraphicalAPI::createText(data); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, GameObject &toSet, Logger::severity level) -{ - auto refProp = _findProperty(propertyName, level); - - if (refProp == nullptr) - return; - - try { - auto id = refProp->findAttribute("id")->getValue(); - toSet = SceneManager::findById(id); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In component '"+node->findAttribute("type")->getValue()+"': Property gameObject ref named '" + propertyName + - "': has no value", level); - else - throw ConfigurationException("In component '"+node->findAttribute("type")->getValue()+"': Property gameObject ref named '" + propertyName + - "': has no value", Logger::MAJOR); - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, Logger::severity level) -{ - auto refProp = _findProperty(propertyName, level); - auto i = 0; - - if (refProp == nullptr) - return; - - for (auto &elem : *refProp) { - try { - auto id = elem->findAttribute("id")->getValue(); - auto gameObject = SceneManager::findById(id); - - if (!gameObject) { - Logger::log("Property gameObject ref nb: " + std::to_string(i) + - ", in list named '" + propertyName + "': not found", - Logger::DEBUG); - throw; - } - toSet.push_back(gameObject); - } catch (myxmlpp::Exception &e) { - Logger::log("Property gameObject ref nb: " + std::to_string(i) + - ", in list named '" + propertyName + "': has no value" + - e.baseWhat(), Logger::DEBUG); - } - ++i; - } -} - - - -// STATICS -std::shared_ptr -Polymorph::Config::XmlComponent::_findProperty(std::string name, - std::shared_ptr &data, Logger::severity level) -{ - for (auto &property: *data) { - try { - auto attr = property->findAttribute("name"); - if (attr->getValue() == name) - return property; - } catch (...) {} - } - if (level != Logger::MAJOR) - { - Logger::log("In property'"+data->getTag()+"': sub-property named '" + name + "': not found.", level); - return nullptr; - } - throw ConfigurationException("In property '"+data->getTag()+"': sub-property named '" + name + "': not found.", Logger::MAJOR); -} - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, int &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, data, level); - - auto parent_type = data->findAttribute("type")->getValue(); - auto parent_name = data->findAttribute("name")->getValue(); - - if (propNode == nullptr) - return; - - try { - toSet = propNode->findAttribute("value")->getValueInt(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, float &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, data, level); - auto parent_type = data->findAttribute("type")->getValue(); - auto parent_name = data->findAttribute("name")->getValue(); - - if (propNode == nullptr) - return; - - try { - toSet = propNode->findAttribute("value")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, bool &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, data, level); - auto parent_type = data->findAttribute("type")->getValue(); - auto parent_name = data->findAttribute("name")->getValue(); - - if (propNode == nullptr) - return; - - try { - toSet = propNode->findAttribute("value")->getValueBool(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::string &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, data, level); - auto parent_type = data->findAttribute("type")->getValue(); - auto parent_name = data->findAttribute("name")->getValue(); - - if (propNode == nullptr) - return; - - try { - toSet = propNode->findAttribute("value")->getValue(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, Vector3 &toSet, std::shared_ptr &data, Logger::severity level) -{ - std::shared_ptr vectorProp = _findProperty(propertyName, data, level); - std::shared_ptr vector; - auto parent_type = data->findAttribute("type")->getValue(); - auto parent_name = data->findAttribute("name")->getValue(); - - if (vectorProp == nullptr) - return; - - try { - vector = vectorProp->findChild("Vector"); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - return; - } - - try { - toSet.x = vector->findAttribute("x")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.y = vector->findAttribute("y")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.z = vector->findAttribute("z")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, Vector2 &toSet, std::shared_ptr &data, Logger::severity level) -{ - std::shared_ptr vectorProp = _findProperty(propertyName, data, level); - std::shared_ptr vector; - auto parent_type = data->findAttribute("type")->getValue(); - auto parent_name = data->findAttribute("name")->getValue(); - - if (vectorProp == nullptr) - return; - - try { - vector = vectorProp->findChild("Vector"); - } catch (...) { - - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - return; - } - - try { - toSet.x = vector->findAttribute("x")->getValueFloat(); - } catch (...) { - - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.y = vector->findAttribute("y")->getValueFloat(); - } catch (...) { - - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, Rect &toSet, std::shared_ptr &data, Logger::severity level) -{ - std::shared_ptr rectProp = _findProperty(propertyName, data, level); - std::shared_ptr rect; - auto parent_type = data->findAttribute("type")->getValue(); - auto parent_name = data->findAttribute("name")->getValue(); - - if (rectProp == nullptr) - return; - - try { - rect = rectProp->findChild("Rect"); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - return; - } - - try { - toSet.x = rect->findAttribute("x")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.y = rect->findAttribute("y")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.width = rect->findAttribute("width")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } - - try { - toSet.height = rect->findAttribute("height")->getValueFloat(); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, data, level); - - if (propNode == nullptr) - return; - - for (auto &element : *propNode) { - try { - toSet.push_back(element->findAttribute("value")->getValueInt()); - } catch (...) { - Logger::log("Property Int List named '" + propertyName + - "': has no value", Logger::DEBUG); - } - } -} - - - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, data, level); - - if (propNode == nullptr) - return; - - for (auto &element : *propNode) { - try { - toSet.push_back(element->findAttribute("value")->getValueFloat()); - } catch (...) { - Logger::log("Property Float List named '" + propertyName + - "': has no value", Logger::DEBUG); - } - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, data, level); - - if (propNode == nullptr) - return; - - for (auto &element : *propNode) { - try { - toSet.push_back(element->findAttribute("value")->getValueBool()); - } catch (...) { - Logger::log("Property Bool List named '" + propertyName + - "': has no value", Logger::DEBUG); - } - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto propNode = _findProperty(propertyName, data, level); - - if (propNode == nullptr) - return; - - for (auto &element : *propNode) { - try { - toSet.push_back(element->findAttribute("value")->getValue()); - } catch (...) { - Logger::log("Property String List named '" + propertyName + - "': has no value", Logger::DEBUG); - } - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto vectorProp = _findProperty(propertyName, data, level); - std::shared_ptr vector; - size_t count = 0; - Vector3 tmp; - - if (vectorProp == nullptr) - return; - - for (auto &element : *vectorProp) { - tmp = Vector3(); - try { - vector = element->findChild("Vector"); - } catch (...) { - Logger::log("Incomplete Vector3 property named '" + propertyName + - "' at index" + std::to_string(count) + ": not found", - Logger::DEBUG); - continue; - } - - try { - tmp.x = vector->findAttribute("x")->getValueFloat(); - } catch (...) { - Logger::log("x value of vector property named '" + propertyName + - "' at index" + std::to_string(count) + ": not found", - Logger::DEBUG); - } - - try { - tmp.y = vector->findAttribute("y")->getValueFloat(); - } catch (...) { - Logger::log("y value of vector property named '" + propertyName + - "' at index" + std::to_string(count) + ": not found", - Logger::DEBUG); - } - - try { - tmp.z = vector->findAttribute("z")->getValueFloat(); - } catch (...) { - Logger::log("z value of vector property named '" + propertyName + - "' at index" + std::to_string(count) + ": not found", - Logger::DEBUG); - } - - toSet[count] = tmp; - count += 1; - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, GameObject &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto refProp = _findProperty(propertyName, data, level); - auto parent_type = data->findAttribute("type")->getValue(); - auto parent_name = data->findAttribute("name")->getValue(); - - if (refProp == nullptr) - return; - - try { - auto id = refProp->findAttribute("id")->getValue(); - toSet = SceneManager::findById(id); - } catch (...) { - if (level != Logger::MAJOR) - Logger::log("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", level); - else - throw ConfigurationException("In property type '"+parent_type+"', named '"+parent_name+"': sub-property named '" + propertyName + - "': has missing value", Logger::MAJOR); - } -} - -void Polymorph::Config::XmlComponent::setProperty(std::string propertyName, std::vector &toSet, std::shared_ptr &data, Logger::severity level) -{ - auto refProp = _findProperty(propertyName, data, level); - auto i = 0; - - if (refProp == nullptr) - return; - - for (auto &elem : *refProp) { - try { - auto id = elem->findAttribute("id")->getValue(); - auto gameObject = SceneManager::findById(id); - - if (!gameObject) { - Logger::log("Property gameObject ref nb: " + std::to_string(i) + - ", in list named '" + propertyName + "': not found", - Logger::DEBUG); - throw; - } - toSet.push_back(gameObject); - } catch (myxmlpp::Exception &e) { - Logger::log("Property gameObject ref nb: " + std::to_string(i) + - ", in list named '" + propertyName + "': has no value" + - e.baseWhat(), Logger::DEBUG); - } - ++i; - } -} diff --git a/src/utilities/types/Circle.cpp b/src/utilities/types/Circle.cpp deleted file mode 100644 index 2d523473..00000000 --- a/src/utilities/types/Circle.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* -** EPITECH PROJECT, 2022 -** Circle.cpp -** File description: -** Circle.cpp -*/ - -#include "Circle.hpp" -#include - -Polymorph::Circle::Circle(const Polymorph::Vector2 ¢er, float radius): center(center), radius(radius) -{ -} - -Polymorph::Circle::Circle(const Polymorph::Circle &circle): center(circle.center), radius(circle.radius) -{ -} - -Polymorph::Circle::Circle(float x, float y, float radius): center(x, y), radius(radius) -{ -} - -bool Polymorph::Circle::intersect(const Polymorph::Circle &circle1, - const Polymorph::Circle &circle2) -{ - auto tmp = circle1.center.delta(circle2.center); - - if (sqrtf(powf(tmp.x, 2.0f) + powf(tmp.y, 2.0f)) <= circle1.radius + circle2.radius) - return true; - return false; -} - -bool Polymorph::Circle::intersect(const Polymorph::Circle &circle, - const Polymorph::Vector2 ¢er, - float radius) -{ - auto tmp = circle.center.delta(center); - - if (sqrtf(powf(tmp.x, 2.0f) + powf(tmp.y, 2.0f)) <= circle.radius + radius) - return true; - return false; -} - -bool Polymorph::Circle::intersect(const Polymorph::Vector2 ¢er, - float radius, - const Polymorph::Circle &circle) -{ - auto tmp = circle.center.delta(center); - - if (sqrtf(powf(tmp.x, 2.0f) + powf(tmp.y, 2.0f)) <= circle.radius + radius) - return true; - return false; -} - -bool Polymorph::Circle::intersect(const Polymorph::Vector2 ¢er1, - float radius1, - const Polymorph::Vector2 ¢er2, - float radius2) -{ - auto tmp = center1.delta(center2); - - if (sqrtf(powf(tmp.x, 2.0f) + powf(tmp.y, 2.0f)) <= radius1 + radius2) - return true; - return false; -} diff --git a/src/utilities/types/Rect.cpp b/src/utilities/types/Rect.cpp deleted file mode 100644 index a8541834..00000000 --- a/src/utilities/types/Rect.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* -** EPITECH PROJECT, 2022 -** Rect.cpp -** File description: -** Rect.cpp -*/ - -#include "Rect.hpp" - -bool Polymorph::Rect::intersect(const Polymorph::Rect &rect1, const Polymorph::Rect &rect2) -{ - if (rect1.x + rect1.width < rect2.x - || rect1.x > rect2.x + rect2.width - || rect1.y + rect1.height < rect2.y - || rect1.y > rect2.y + rect2.height) - return false; - return true; -} - -bool Polymorph::Rect::intersect(const Polymorph::Vector2 &position, - const Polymorph::Vector2 &size, - const Polymorph::Rect &rect) -{ - if (rect.x + rect.width < position.x - || rect.x > position.x + size.x - || rect.y + rect.height < position.y - || rect.y > position.y + size.y) - return false; - return true; -} - -bool Polymorph::Rect::intersect(const Polymorph::Rect &rect, - const Polymorph::Vector2 &position, - const Polymorph::Vector2 &size) -{ - if (rect.x + rect.width < position.x - || rect.x > position.x + size.x - || rect.y + rect.height < position.y - || rect.y > position.y + size.y) - return false; - return true; -} - -bool Polymorph::Rect::intersect(const Polymorph::Vector2 &position1, - const Polymorph::Vector2 &size1, - const Polymorph::Vector2 &position2, - const Polymorph::Vector2 &size2) -{ - if (position1.x + size1.x < position2.x - || position1.x > position2.x + size2.x - || position1.y + size1.y < position2.y - || position1.y > position2.y + size2.y) - return false; - return true; -}