diff --git a/Escape-the-Dawn.sln b/Escape-the-Dawn.sln index 75bbb7b..213283c 100644 --- a/Escape-the-Dawn.sln +++ b/Escape-the-Dawn.sln @@ -4,6 +4,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Escape-the-Dawn", "Escape-the-Dawn\Escape-the-Dawn.vcxproj", "{FE405CFA-8FCE-4867-92CF-797E73B36482}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Tests", "Tests\Tests.vcxproj", "{B9A8F4AA-BE85-45EA-84DD-652D13DD22BE}" + ProjectSection(ProjectDependencies) = postProject + {A9755CAA-62DC-442D-B82C-F548546CFD38} = {A9755CAA-62DC-442D-B82C-F548546CFD38} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Executable", "Executable\Executable.vcxproj", "{A9755CAA-62DC-442D-B82C-F548546CFD38}" EndProject diff --git a/Escape-the-Dawn/AABB.cpp b/Escape-the-Dawn/AABB.cpp deleted file mode 100644 index 72022a6..0000000 --- a/Escape-the-Dawn/AABB.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "AABB.h" - -AABB::AABB(glm::vec3 _volumeVector, glm::vec3 _origin) -{ - volumeVector = _volumeVector; - origin = _origin; - - CreateBB(); -} - -void AABB::CreateBB() -{ - // Cube 1x1x1, centered on origin - GLfloat vertices[] = { - origin.x - 0.5, origin.y - 0.5, origin.z - 0.5, 1.0, - origin.x + 0.5, origin.y - 0.5, origin.z - 0.5, 1.0, - origin.x + 0.5, origin.y + 0.5, origin.z - 0.5, 1.0, - origin.x - 0.5, origin.y + 0.5, origin.z - 0.5, 1.0, - origin.x - 0.5, origin.y - 0.5, origin.z + 0.5, 1.0, - origin.x + 0.5, origin.y - 0.5, origin.z + 0.5, 1.0, - origin.x + 0.5, origin.y + 0.5, origin.z + 0.5, 1.0, - origin.x - 0.5, origin.y + 0.5, origin.z + 0.5, 1.0, - }; - GLuint vbo_vertices; - glGenBuffers(1, &vbo_vertices); - glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - GLushort elements[] = { - 0, 1, 2, 3, - 4, 5, 6, 7, - 0, 4, 1, 5, - 2, 6, 3, 7 - }; - GLuint ibo_elements; - glGenBuffers(1, &ibo_elements); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_elements); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - - glm::vec3 size = glm::vec3(glm::abs(origin.x-volumeVector.x), glm::abs(origin.y-volumeVector.y), glm::abs(origin.z-volumeVector.z)); - glm::mat4 transform = glm::translate(glm::mat4(1), origin) * glm::scale(glm::mat4(1), size); - - for (int i = 0; i < ) -} \ No newline at end of file diff --git a/Escape-the-Dawn/AABB.h b/Escape-the-Dawn/AABB.h index c56d5c0..85f07cb 100644 --- a/Escape-the-Dawn/AABB.h +++ b/Escape-the-Dawn/AABB.h @@ -1,23 +1,15 @@ #ifndef AABB_h__ #define AABB_h__ -#include -//#define GLFW_INCLUDE_GLU -//#include -//#include -#include -#include +#include -class AABB +struct AABB { -public: - AABB(glm::vec3, glm::vec3); - void CreateBB(void); - + AABB(glm::vec3 origin, glm::vec3 volumeVector) + : Origin(origin), VolumeVector(volumeVector) { } -private: - glm::vec3 origin; - glm::vec3 volumeVector; //The vector that defines the volume of the BB, it goes from one corner to the opposite one - + glm::vec3 Origin; + glm::vec3 VolumeVector; //The vector that defines the volume of the BB, it goes from the origin to a corner }; + #endif // !AABB_h__ diff --git a/Escape-the-Dawn/Component.h b/Escape-the-Dawn/Component.h index c3b49f4..221108c 100644 --- a/Escape-the-Dawn/Component.h +++ b/Escape-the-Dawn/Component.h @@ -1,7 +1,7 @@ #ifndef Component_h__ #define Component_h__ -#include "ComponentFactory.h" +#include "Factory.h" #include "Entity.h" struct Component @@ -9,4 +9,6 @@ struct Component EntityID Entity; }; +//&static ComponentFactory componentFactory; + #endif // Component_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/ComponentFactory.h b/Escape-the-Dawn/ComponentFactory.h deleted file mode 100644 index 4596c0b..0000000 --- a/Escape-the-Dawn/ComponentFactory.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef ComponentFactory_h__ -#define ComponentFactory_h__ - -#include -#include -#include -#include - -struct Component; - -#define REGISTER_COMPONENT(NAME, TYPE) \ - static ComponentRegistrar registrar(NAME); - -template -class ComponentRegistrar -{ -public: - ComponentRegistrar(std::string name) - { - ComponentFactory::Instance()->Register(name, [](void) -> std::shared_ptr { return std::shared_ptr(new T()); }); - } -}; - -class ComponentFactory -{ -public: - static ComponentFactory* Instance() - { - static ComponentFactory factory; - return &factory; - } - - void Register(std::string name, std::function(void)> factoryFunction) - { - m_FactoryFunctions[name] = factoryFunction; - } - - std::shared_ptr Create(std::string name) - { - auto it = m_FactoryFunctions.find(name); - if (it != m_FactoryFunctions.end()) - return it->second(); - else - return nullptr; - } - -private: - std::map(void)>> m_FactoryFunctions; -}; - -#endif // ComponentFactory_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/Bounds.h b/Escape-the-Dawn/Components/Bounds.h index da97403..b717776 100644 --- a/Escape-the-Dawn/Components/Bounds.h +++ b/Escape-the-Dawn/Components/Bounds.h @@ -1,5 +1,5 @@ -#ifndef Bounds_h__ -#define Bounds_h__ +#ifndef Components_Bounds_h__ +#define Components_Bounds_h__ #include "Component.h" #include "AABB.h" @@ -7,11 +7,10 @@ namespace Components { - struct Bounds : Component - { - AABB BB; //Axis Aligned Bounding Box - }; - REGISTER_COMPONENT("Bounds", Bounds); +struct Bounds : Component +{ + AABB BoundingBox; //Axis Aligned Bounding Box +}; } -#endif // !Bounds_h__ \ No newline at end of file +#endif // !Components_Bounds_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/Camera.h b/Escape-the-Dawn/Components/Camera.h index 44226e8..c836df4 100644 --- a/Escape-the-Dawn/Components/Camera.h +++ b/Escape-the-Dawn/Components/Camera.h @@ -1,18 +1,17 @@ -#ifndef Camera_h__ -#define Camera_h__ +#ifndef Components_Camera_h__ +#define Components_Camera_h__ #include "Component.h" namespace Components { - struct Camera : Component - { - int FOV; - int NearClip; - int FarClip; - }; - REGISTER_COMPONENT("Camera", Camera); +struct Camera : Component +{ + int FOV; + int NearClip; + int FarClip; +}; } -#endif // !Camera_h__ \ No newline at end of file +#endif // !Components_Camera_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/Collision.h b/Escape-the-Dawn/Components/Collision.h index d471d1c..b9f44a5 100644 --- a/Escape-the-Dawn/Components/Collision.h +++ b/Escape-the-Dawn/Components/Collision.h @@ -1,18 +1,18 @@ -#ifndef Collision_h__ -#define Collision_h__ +#ifndef Components_Collision_h__ +#define Components_Collision_h__ +#include "Entity.h" #include "Component.h" #include namespace Components { - struct Collision : Component - { - bool Phantom; - std::vector CollidingEntities; - }; - REGISTER_COMPONENT("Collision", Collision); +struct Collision : Component +{ + bool Phantom; + std::vector CollidingEntities; +}; } -#endif // !Collision_h__ \ No newline at end of file +#endif // !Components_Collision_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/DirectionalLight.h b/Escape-the-Dawn/Components/DirectionalLight.h index 17c578d..ee2dd72 100644 --- a/Escape-the-Dawn/Components/DirectionalLight.h +++ b/Escape-the-Dawn/Components/DirectionalLight.h @@ -1,5 +1,5 @@ -#ifndef DirectionalLight_h__ -#define DirectionalLight_h__ +#ifndef Components_DirectionalLight_h__ +#define Components_DirectionalLight_h__ #include "Component.h" #include "Color.h" @@ -7,14 +7,13 @@ namespace Components { - struct DirectionalLight : Component - { - float Intensity; - float MaxRange; - float SpecularIntensity; - Color color; - }; - REGISTER_COMPONENT("DirectionalLight", DirectionalLight); +struct DirectionalLight : Component +{ + float Intensity; + float MaxRange; + float SpecularIntensity; + Color Color; +}; } -#endif // !DirectionalLight_h__ \ No newline at end of file +#endif // !Components_DirectionalLight_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/Input.h b/Escape-the-Dawn/Components/Input.h index 9d0c346..f5c9e2a 100644 --- a/Escape-the-Dawn/Components/Input.h +++ b/Escape-the-Dawn/Components/Input.h @@ -1,5 +1,5 @@ -#ifndef Input_h__ -#define Input_h__ +#ifndef Components_Input_h__ +#define Components_Input_h__ #include "Component.h" #include @@ -7,13 +7,13 @@ namespace Components { - struct Input : Component - { - int KeyState[GLFW_KEY_LAST]; - float MouseState[2]; - float dX, dY; - }; - REGISTER_COMPONENT("Input", Input); +struct Input : Component +{ + int KeyState[GLFW_KEY_LAST]; + float MouseState[2]; + float dX, dY; +}; } -#endif // !Input_h__ \ No newline at end of file + +#endif // !Components_Input_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/Model.h b/Escape-the-Dawn/Components/Model.h index 37dbdf0..ce27b3b 100644 --- a/Escape-the-Dawn/Components/Model.h +++ b/Escape-the-Dawn/Components/Model.h @@ -1,5 +1,7 @@ -#ifndef Model_h__ -#define Model_h__ +#ifndef Components_Model_h__ +#define Components_Model_h__ + +#include #include "Component.h" #include "Color.h" @@ -7,12 +9,11 @@ namespace Components { - struct Model : Component - { - std::string ModelName; - Color color; - }; - REGISTER_COMPONENT("Model", Model); +struct Model : Component +{ + std::string ModelFile; + Color Color; +}; } -#endif // !Model_h__ \ No newline at end of file +#endif // !Components_Model_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/ParticleEmitter.h b/Escape-the-Dawn/Components/ParticleEmitter.h index 5850f24..06a1658 100644 --- a/Escape-the-Dawn/Components/ParticleEmitter.h +++ b/Escape-the-Dawn/Components/ParticleEmitter.h @@ -1,5 +1,5 @@ -#ifndef ParticleEmitter_h__ -#define ParticleEmitter_h__ +#ifndef Components_ParticleEmitter_h__ +#define Components_ParticleEmitter_h__ #include "Component.h" #include "Color.h" @@ -8,19 +8,18 @@ namespace Components { - struct ParticleEmitter : Component - { - int ParticleTemplate; - float SpawnFrequency; - int SpawnCount; - std::vector ColorSpectrum; - std::vector ScaleSpectrum; - float SpreadAngle; - float LifeTime; - std::vector VelocitySpectrum; - std::vector AngularVelocitySpectrum; - }; - REGISTER_COMPONENT("ParticleEmitter", ParticleEmitter); +struct ParticleEmitter : Component +{ + int ParticleTemplate; + float SpawnFrequency; + int SpawnCount; + std::vector ColorSpectrum; + std::vector ScaleSpectrum; + float SpreadAngle; + float LifeTime; + std::vector VelocitySpectrum; + std::vector AngularVelocitySpectrum; +}; } -#endif // !ParticleEmitter_h__ \ No newline at end of file +#endif // !Components_ParticleEmitter_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/PointLight.h b/Escape-the-Dawn/Components/PointLight.h index 70ec5ac..daf3aa9 100644 --- a/Escape-the-Dawn/Components/PointLight.h +++ b/Escape-the-Dawn/Components/PointLight.h @@ -1,5 +1,5 @@ -#ifndef PointLight_h__ -#define PointLight_h__ +#ifndef Components_PointLight_h__ +#define Components_PointLight_h__ #include "Component.h" #include "Color.h" @@ -7,14 +7,13 @@ namespace Components { - struct PointLight : Component - { - float Intensity; - float MaxRange; - float SpecularIntensity; - Color color; - }; - REGISTER_COMPONENT("PointLight", PointLight); +struct PointLight : Component +{ + float Intensity; + float MaxRange; + float SpecularIntensity; + Color Color; +}; } -#endif // !PointLight_h__ \ No newline at end of file +#endif // !Components_PointLight_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/PowerUp.h b/Escape-the-Dawn/Components/PowerUp.h index 012b85c..fce5d6e 100644 --- a/Escape-the-Dawn/Components/PowerUp.h +++ b/Escape-the-Dawn/Components/PowerUp.h @@ -1,16 +1,15 @@ -#ifndef PowerUp_h__ -#define PowerUp_h__ +#ifndef Components_PowerUp_h__ +#define Components_PowerUp_h__ #include "Component.h" namespace Components { - struct PowerUp : Component - { - int Speed; - }; - REGISTER_COMPONENT("PowerUp", PowerUp); +struct PowerUp : Component +{ + float Speed; +}; } -#endif // !PowerUp_h__ \ No newline at end of file +#endif // !Components_PowerUp_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/SoundEmitter.h b/Escape-the-Dawn/Components/SoundEmitter.h index 6409ab1..01772cd 100644 --- a/Escape-the-Dawn/Components/SoundEmitter.h +++ b/Escape-the-Dawn/Components/SoundEmitter.h @@ -1,18 +1,19 @@ -#ifndef SoundEmitter_h__ -#define SoundEmitter_h__ +#ifndef Components_SoundEmitter_h__ +#define Components_SoundEmitter_h__ + +#include #include "Component.h" namespace Components { - struct SoundEmitter : Component - { - std::string SoundFile; - float Volume; - float MaxRange; - }; - REGISTER_COMPONENT("SoundEmitter", SoundEmitter); +struct SoundEmitter : Component +{ + std::string SoundFile; + float Volume; + float MaxRange; +}; } -#endif // !SoundEmitter_h__ \ No newline at end of file +#endif // !Components_SoundEmitter_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/Sprite.h b/Escape-the-Dawn/Components/Sprite.h index a64a3f1..f54d3d0 100644 --- a/Escape-the-Dawn/Components/Sprite.h +++ b/Escape-the-Dawn/Components/Sprite.h @@ -1,5 +1,7 @@ -#ifndef Sprite_h__ -#define Sprite_h__ +#ifndef Components_Sprite_h__ +#define Components_Sprite_h__ + +#include #include "Component.h" #include "Color.h" @@ -7,12 +9,11 @@ namespace Components { - struct Sprite : Component - { - std::string SpriteFile; - Color color; - }; - REGISTER_COMPONENT("Sprite", Sprite); +struct Sprite : Component +{ + std::string SpriteFile; + Color Color; +}; } -#endif // !Sprite_h__ \ No newline at end of file +#endif // !Components_Sprite_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/Stat.h b/Escape-the-Dawn/Components/Stat.h index 618adb7..31a3dc3 100644 --- a/Escape-the-Dawn/Components/Stat.h +++ b/Escape-the-Dawn/Components/Stat.h @@ -1,17 +1,16 @@ -#ifndef Stat_h__ -#define Stat_h__ +#ifndef Components_Stat_h__ +#define Components_Stat_h__ #include "Component.h" namespace Components { - struct Stat : Component - { - int Health; - bool Destroyable; - }; - REGISTER_COMPONENT("Stat", Stat); +struct Stat : Component +{ + float Health; + bool Destroyable; +}; } -#endif // !Stat_h__ \ No newline at end of file +#endif // !Components_Stat_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/Template.h b/Escape-the-Dawn/Components/Template.h index 465187e..4bcb25c 100644 --- a/Escape-the-Dawn/Components/Template.h +++ b/Escape-the-Dawn/Components/Template.h @@ -1,13 +1,12 @@ -#ifndef Template_h__ -#define Template_h__ +#ifndef Components_Template_h__ +#define Components_Template_h__ #include "Component.h" namespace Components { - struct Template : Component { }; - REGISTER_COMPONENT("Template", Template); +struct Template : Component { }; } -#endif // !Template_h__ \ No newline at end of file +#endif // !Components_Template_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Components/Transform.h b/Escape-the-Dawn/Components/Transform.h new file mode 100644 index 0000000..9f2df7a --- /dev/null +++ b/Escape-the-Dawn/Components/Transform.h @@ -0,0 +1,19 @@ +#ifndef Components_Transform_h__ +#define Components_Transform_h__ + +#include "Component.h" +#include + +namespace Components +{ + +struct Transform : Component +{ + glm::vec3 Position; + glm::quat Orientation; + glm::vec3 Velocity; +}; + +} + +#endif // Components_Transform_h__ diff --git a/Escape-the-Dawn/Components/TransformComponent.h b/Escape-the-Dawn/Components/TransformComponent.h deleted file mode 100644 index 66cdb17..0000000 --- a/Escape-the-Dawn/Components/TransformComponent.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef Transform_h__ -#define Transform_h__ - -#include "Component.h" -#include - -namespace Components -{ - - struct Transform : Component - { - float Position[3]; - glm::fquat qtrn; //Quaternion with floats - float Velocity[3]; - }; - REGISTER_COMPONENT("Transform", Transform); - -} -#endif // Transform_h__ diff --git a/Escape-the-Dawn/Escape-the-Dawn.vcxproj b/Escape-the-Dawn/Escape-the-Dawn.vcxproj index 133bbc3..22a9e55 100644 --- a/Escape-the-Dawn/Escape-the-Dawn.vcxproj +++ b/Escape-the-Dawn/Escape-the-Dawn.vcxproj @@ -98,8 +98,6 @@ - - @@ -115,9 +113,9 @@ - - + + diff --git a/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters b/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters index 65cd581..99a8f67 100644 --- a/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters +++ b/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters @@ -1,7 +1,6 @@  - @@ -27,14 +26,10 @@ - - - - @@ -64,18 +59,6 @@ Components - - Components - - - Components - - - Components - - - Components - Components @@ -105,6 +88,25 @@ + + + Components + + + Components + + + Components + + + Components + + + Util + + + Util + @@ -124,5 +126,8 @@ {54f1eb6f-dc00-4e97-a3ef-ac255d755e2e} + + {d985d7a7-c041-46fe-ae03-aa40295a7aad} + \ No newline at end of file diff --git a/Escape-the-Dawn/Factory.h b/Escape-the-Dawn/Factory.h new file mode 100644 index 0000000..1a82f5b --- /dev/null +++ b/Escape-the-Dawn/Factory.h @@ -0,0 +1,35 @@ +#ifndef ComponentFactory_h__ +#define ComponentFactory_h__ + +#include +#include +#include +#include + +template +class Factory +{ +public: + void Register(std::string name, std::function factoryFunction) + { + m_FactoryFunctions[name] = factoryFunction; + } + + T Create(std::string name) + { + auto it = m_FactoryFunctions.find(name); + if (it != m_FactoryFunctions.end()) { + return it->second(); + } else { + return nullptr; + } + } + +private: + std::map> m_FactoryFunctions; +}; + +struct Component; +class ComponentFactory : public Factory { }; + +#endif // ComponentFactory_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Systems/CollisionSystem.h b/Escape-the-Dawn/Systems/CollisionSystem.h index 008115a..2648e70 100644 --- a/Escape-the-Dawn/Systems/CollisionSystem.h +++ b/Escape-the-Dawn/Systems/CollisionSystem.h @@ -4,8 +4,7 @@ #include "System.h" #include "logging.h" -#include "Components/TransformComponent.h" - +#include "Components/Transform.h" namespace Systems { diff --git a/Escape-the-Dawn/Systems/InputSystem.cpp b/Escape-the-Dawn/Systems/InputSystem.cpp index e69de29..15f0790 100644 --- a/Escape-the-Dawn/Systems/InputSystem.cpp +++ b/Escape-the-Dawn/Systems/InputSystem.cpp @@ -0,0 +1,12 @@ +#include "InputSystem.h" +#include "World.h" + +void Systems::InputSystem::Update(double dt, EntityID entity, EntityID parent) +{ + auto input = m_World->GetComponent(entity, "Input"); + if (input == nullptr) + return; + + +} + diff --git a/Escape-the-Dawn/Systems/InputSystem.h b/Escape-the-Dawn/Systems/InputSystem.h index e69de29..951a75f 100644 --- a/Escape-the-Dawn/Systems/InputSystem.h +++ b/Escape-the-Dawn/Systems/InputSystem.h @@ -0,0 +1,27 @@ +#ifndef InputSystem_h__ +#define InputSystem_h__ + +#include + +#include "System.h" + +#include "Components/Input.h" + +namespace Systems +{ + +class InputSystem : public System +{ +public: + InputSystem(World* world) + : System(world) + { + + } + + void Update(double dt, EntityID entity, EntityID parent) override; +}; + +} + +#endif // InputSystem_h__ diff --git a/Escape-the-Dawn/World.cpp b/Escape-the-Dawn/World.cpp index fe130a8..43dd8d8 100644 --- a/Escape-the-Dawn/World.cpp +++ b/Escape-the-Dawn/World.cpp @@ -84,4 +84,19 @@ World::World() m_LastEntityID = 0; m_Systems.push_back(std::make_shared(this)); -} \ No newline at end of file + + RegisterComponents(); + RegisterSystems(); +} + +void World::RegisterComponents() +{ + m_ComponentFactory.Register("Transform", []() { return new Components::Transform(); }); + m_ComponentFactory.Register("Input", []() { return new Components::Input(); }); + m_ComponentFactory.Register("DirectionalLight", []() { return new Components::DirectionalLight(); }); +} + +void World::RegisterSystems() +{ + +} diff --git a/Escape-the-Dawn/World.h b/Escape-the-Dawn/World.h index 1dec1c5..921c273 100644 --- a/Escape-the-Dawn/World.h +++ b/Escape-the-Dawn/World.h @@ -8,7 +8,11 @@ #include "Entity.h" #include "Component.h" -#include "ComponentFactory.h" +#include "Factory.h" +#include "Components/Transform.h" +#include "Components/Input.h" +#include "Components/DirectionalLight.h" + #include "System.h" #include "Systems/CollisionSystem.h" @@ -18,6 +22,9 @@ public: World(); ~World(); + virtual void RegisterComponents(); + virtual void RegisterSystems(); + EntityID CreateEntity(EntityID parent = 0); void RemoveEntity(EntityID entity); @@ -29,12 +36,22 @@ public: template std::shared_ptr AddComponent(EntityID entity, std::string componentType) { - std::shared_ptr component = std::static_pointer_cast(ComponentFactory::Instance()->Create(componentType)); + std::shared_ptr component = std::shared_ptr(static_cast(m_ComponentFactory.Create(componentType))); + if (component == nullptr) { + LOG_ERROR("Failed to attach invalid component \"%s\" to entity #%i", componentType.c_str(), entity); + return nullptr; + } + m_ComponentsOfType[componentType].push_back(component); m_EntityComponents[entity][componentType] = component; return component; } + std::shared_ptr AddComponent(EntityID entity, std::string componentType) + { + return AddComponent(entity, componentType); + } + template std::shared_ptr GetComponent(EntityID entity, std::string componentType) { @@ -56,6 +73,7 @@ private: // A bottom to top tree. A map of child entities to parent entities. std::unordered_map m_EntityParents; + ComponentFactory m_ComponentFactory; std::unordered_map>> m_ComponentsOfType; std::unordered_map>> m_EntityComponents; std::vector> m_Systems; diff --git a/Tests/Tests.vcxproj b/Tests/Tests.vcxproj index 75763b5..eeb8982 100644 --- a/Tests/Tests.vcxproj +++ b/Tests/Tests.vcxproj @@ -63,6 +63,13 @@ + + + $(OutDir)$(TargetName)$(TargetExt) --log_level=test_suite + + + Running tests + @@ -78,6 +85,13 @@ true boost_unit_test_framework-vc110-1_55.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + $(OutDir)$(TargetName)$(TargetExt) --log_level=test_suite + + + Running tests + diff --git a/Tests/main.cpp b/Tests/main.cpp index 4668e93..027263d 100644 --- a/Tests/main.cpp +++ b/Tests/main.cpp @@ -1,5 +1,7 @@ +#include "logging.h" + #include "World.h" -#include "Components/TransformComponent.h" +#include "Components/Transform.h" #define BOOST_TEST_MODULE World #define BOOST_TEST_DYN_LINK @@ -50,4 +52,13 @@ BOOST_AUTO_TEST_CASE(Recycling) world.RemoveEntity(ent11); EntityID ent12 = world.CreateEntity(); // 1 BOOST_REQUIRE(ent11 == ent12); +} + +BOOST_AUTO_TEST_CASE(ComponentCreation) +{ + World world; + + EntityID ent = world.CreateEntity(); + BOOST_CHECK(world.AddComponent(ent, "Transform") != nullptr); + BOOST_CHECK(world.AddComponent(ent, "Input") != nullptr); } \ No newline at end of file