From 7675ddc3a4a3ca90ec17fb5d43f46b7dc5def98c Mon Sep 17 00:00:00 2001 From: karl Date: Tue, 7 Jan 2020 13:10:23 +0100 Subject: [PATCH] Add glm for vector math, used for position and movement --- CMakeLists.txt | 5 ++-- ECS/Components/Movement.h | 14 ++++-------- ECS/Components/Position.h | 18 --------------- ECS/Components/Transform.h | 34 ++++++++++++++++++++++++++++ ECS/Systems/GravitySystem.h | 6 ++--- ECS/Systems/KeyboardMovementSystem.h | 26 ++++++++++----------- ECS/Systems/PositionDebugSystem.h | 10 ++++---- main.cpp | 7 +++--- 8 files changed, 65 insertions(+), 55 deletions(-) delete mode 100644 ECS/Components/Position.h create mode 100644 ECS/Components/Transform.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f251511..fffe941 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,9 +5,10 @@ set(CMAKE_CXX_STANDARD 17) find_package(OpenGL REQUIRED) find_package(glfw3 REQUIRED) +find_package(glm REQUIRED) -add_executable(ecsgame Util/glad.c Util/OBJ_Loader.h Rendering/Shader.cpp Rendering/Shader.h main.cpp ECS/Components/Position.h ECS/Components/Movement.h ECS/Events/InputEvent.h ECS/Systems/GravitySystem.h ECS/Systems/PositionDebugSystem.h ECS/Systems/KeyboardMovementSystem.h) +add_executable(ecsgame Util/glad.c Util/OBJ_Loader.h Rendering/Shader.cpp Rendering/Shader.h main.cpp ECS/Components/Transform.h ECS/Components/Movement.h ECS/Events/InputEvent.h ECS/Systems/GravitySystem.h ECS/Systems/PositionDebugSystem.h ECS/Systems/KeyboardMovementSystem.h ECS/Components/Camera.h) include_directories(${OPENGL_INCLUDE_DIRS}) -target_link_libraries(ecsgame ${OPENGL_LIBRARY} glfw ${CMAKE_DL_LIBS}) \ No newline at end of file +target_link_libraries(ecsgame ${OPENGL_LIBRARY} glfw glm ${CMAKE_DL_LIBS}) \ No newline at end of file diff --git a/ECS/Components/Movement.h b/ECS/Components/Movement.h index ed0f431..4769618 100644 --- a/ECS/Components/Movement.h +++ b/ECS/Components/Movement.h @@ -6,19 +6,13 @@ #define ECSGAME_MOVEMENT_H struct Movement { - Movement(float speedX, float speedY, float speedZ) : speedX(speedX), speedY(speedY), speedZ(speedZ) {} + Movement(glm::vec3 speed) : speed(speed) {} - float speedX; - float speedY; - float speedZ; + glm::vec3 speed; - int movingX = 0; - int movingY = 0; - int movingZ = 0; + glm::ivec3 moving; - float velocityX = 0.0f; - float velocityY = 0.0f; - float velocityZ = 0.0f; + glm::vec3 velocity; }; #endif //ECSGAME_MOVEMENT_H diff --git a/ECS/Components/Position.h b/ECS/Components/Position.h deleted file mode 100644 index d5f592d..0000000 --- a/ECS/Components/Position.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// Created by karl on 04.01.20. -// - -#ifndef ECSGAME_POSITION_H -#define ECSGAME_POSITION_H - -struct Position { - Position(float x, float y, float z) : x(x), y(y), z(z) {} - - Position() : x(0.f), y(0.f), z(0.f) {} - - float x; - float y; - float z; -}; - -#endif //ECSGAME_POSITION_H diff --git a/ECS/Components/Transform.h b/ECS/Components/Transform.h new file mode 100644 index 0000000..0a58126 --- /dev/null +++ b/ECS/Components/Transform.h @@ -0,0 +1,34 @@ +// +// Created by karl on 04.01.20. +// + +#ifndef ECSGAME_TRANSFORM_H +#define ECSGAME_TRANSFORM_H + +#include +#include +#include + +struct Transform { + Transform() = default; + + glm::mat4 matrix = glm::mat4(1.0f); // Initialize as identity + + void translate(glm::vec3 offset) { + matrix = glm::translate(matrix, offset); + } + + void uniform_scale(float factor) { + scale(glm::vec3(factor, factor, factor)); + } + + void scale(glm::vec3 factors) { + matrix = glm::scale(matrix, factors); + } + + glm::vec3 getPosition() { + return matrix * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); + } +}; + +#endif //ECSGAME_TRANSFORM_H diff --git a/ECS/Systems/GravitySystem.h b/ECS/Systems/GravitySystem.h index d0e1162..05b249c 100644 --- a/ECS/Systems/GravitySystem.h +++ b/ECS/Systems/GravitySystem.h @@ -6,7 +6,7 @@ #define ECSGAME_GRAVITYSYSTEM_H #include "../ECS.h" -#include "../Components/Position.h" +#include "../Components/Transform.h" using namespace ECS; @@ -17,8 +17,8 @@ public: } void tick(World *pWorld, float deltaTime) override { - pWorld->each([&](Entity *ent, ComponentHandle position) { - position->y += gravityAmount * deltaTime; + pWorld->each([&](Entity *ent, ComponentHandle position) { + position->translate(glm::vec3(0.0f, gravityAmount * deltaTime, 0.0f)); }); } diff --git a/ECS/Systems/KeyboardMovementSystem.h b/ECS/Systems/KeyboardMovementSystem.h index 326dc55..e9bd690 100644 --- a/ECS/Systems/KeyboardMovementSystem.h +++ b/ECS/Systems/KeyboardMovementSystem.h @@ -11,7 +11,7 @@ #include #include "../ECS.h" -#include "../Components/Position.h" +#include "../Components/Transform.h" #include "../Events/InputEvent.h" #include "../Components/Movement.h" @@ -28,33 +28,33 @@ class KeyboardMovementSystem : public EntitySystem, public EventSubscribereach([&](Entity *ent, ComponentHandle movement) { if (event.action == GLFW_PRESS) { - movement->movingZ = -1; + movement->moving.z = -1; } else if (event.action == GLFW_RELEASE) { - movement->movingZ = 0; + movement->moving.z = 0; } }); } else if (event.key == GLFW_KEY_S) { myWorld->each([&](Entity *ent, ComponentHandle movement) { if (event.action == GLFW_PRESS) { - movement->movingZ = 1; + movement->moving.z = 1; } else if (event.action == GLFW_RELEASE) { - movement->movingZ = 0; + movement->moving.z = 0; } }); } else if (event.key == GLFW_KEY_A) { myWorld->each([&](Entity *ent, ComponentHandle movement) { if (event.action == GLFW_PRESS) { - movement->movingX = 1; + movement->moving.x = 1; } else if (event.action == GLFW_RELEASE) { - movement->movingX = 0; + movement->moving.x = 0; } }); } else if (event.key == GLFW_KEY_D) { myWorld->each([&](Entity *ent, ComponentHandle movement) { if (event.action == GLFW_PRESS) { - movement->movingX = -1; + movement->moving.x = -1; } else if (event.action == GLFW_RELEASE) { - movement->movingX = 0; + movement->moving.x = 0; } }); } @@ -62,11 +62,9 @@ class KeyboardMovementSystem : public EntitySystem, public EventSubscribereach( - [&](Entity *ent, ComponentHandle position, ComponentHandle movement) { - position->x += movement->movingX * movement->speedX * deltaTime; - position->y += movement->movingY * movement->speedY * deltaTime; - position->z += movement->movingZ * movement->speedZ * deltaTime; + pWorld->each( + [&](Entity *ent, ComponentHandle transform, ComponentHandle movement) { + transform->translate(glm::vec3(movement->moving) * movement->speed * deltaTime); }); } diff --git a/ECS/Systems/PositionDebugSystem.h b/ECS/Systems/PositionDebugSystem.h index 5fd0a66..e2fb8d3 100644 --- a/ECS/Systems/PositionDebugSystem.h +++ b/ECS/Systems/PositionDebugSystem.h @@ -8,18 +8,18 @@ #include #include "../ECS.h" -#include "../Components/Position.h" +#include "../Components/Transform.h" using namespace ECS; class PositionDebugOutputSystem : public EntitySystem { public: void tick(World *pWorld, float deltaTime) override { - pWorld->each([&](Entity *ent, ComponentHandle position) { + pWorld->each([&](Entity *ent, ComponentHandle transform) { std::cout << ent->getEntityId() << ": " - << position->x << ", " - << position->y << ", " - << position->z + << transform->getPosition().x << ", " + << transform->getPosition().y << ", " + << transform->getPosition().z << std::endl; }); } diff --git a/main.cpp b/main.cpp index 686c332..dfb4d29 100644 --- a/main.cpp +++ b/main.cpp @@ -24,15 +24,16 @@ static void key_callback(GLFWwindow *window, int key, int scancode, int action, } int main() { + // TODO: Could be automated by getting all classes within 'ECS/Systems' world->registerSystem(new GravitySystem(-9.8f)); world->registerSystem(new PositionDebugOutputSystem()); world->registerSystem(new KeyboardMovementSystem()); Entity *ent = world->create(); - ent->assign(0.f, 0.f, 0.f); - ent->assign(1.f, 1.f, 1.f); + ent->assign(); + ent->assign(glm::vec3(1.f, 1.f, 1.f)); - ComponentHandle pos = ent->get(); + ComponentHandle pos = ent->get(); GLFWwindow *window;