From eb9c217eb4dcea8118f9878e34a5e4553ed82a2d Mon Sep 17 00:00:00 2001 From: Tleety Date: Wed, 9 Dec 2015 10:44:06 +0100 Subject: [PATCH 01/10] 3D picking float value error fixed. --- include/Engine/Rendering/Util/ScreenCoords.h | 11 +++- resources/Shaders/Picking.frag.glsl | 2 +- src/Engine/Rendering/Renderer.cpp | 53 +++++++++++++------- src/Engine/Rendering/Util/ScreenCoords.cpp | 18 +++++-- 4 files changed, 58 insertions(+), 26 deletions(-) diff --git a/include/Engine/Rendering/Util/ScreenCoords.h b/include/Engine/Rendering/Util/ScreenCoords.h index 22c5b9e0..92e92bdc 100644 --- a/include/Engine/Rendering/Util/ScreenCoords.h +++ b/include/Engine/Rendering/Util/ScreenCoords.h @@ -11,6 +11,13 @@ class ScreenCoords { public: ScreenCoords() = delete; + + struct PixelData + { + int Color[2]; + float Depth; + }; + //Return world position from given screenspace coordinates and depth value in viewspace. static glm::vec3 ToWorldPos(glm::vec2 screenCoord, float depth, Rectangle resolution, glm::mat4 cameraProjectionMat, glm::mat4 cameraViewMat); static glm::vec3 ToWorldPos(float x, float y, float depth, Rectangle resolution, glm::mat4 cameraProjectionMat, glm::mat4 cameraViewMat); @@ -18,8 +25,8 @@ public: static glm::vec3 ToWorldPos(float x, float y, float depth, float screenWidth, float screenHeight, glm::mat4 cameraProjectionMat, glm::mat4 cameraViewMat); //Return data from the given buffers at the coordinates given in screenspace. Buffer should probably have a texture that covers the screen. //Data is given as R = x, B = y, and - static glm::vec3 ToPixelData(glm::vec2 screenCoord, FrameBuffer* PickDataBuffer, GLuint DepthBuffer); - static glm::vec3 ToPixelData(float x, float y, FrameBuffer* PickDataBuffer, GLuint DepthBuffer); + static PixelData ToPixelData(glm::vec2 screenCoord, FrameBuffer* PickDataBuffer, GLuint DepthBuffer); + static PixelData ToPixelData(float x, float y, FrameBuffer* PickDataBuffer, GLuint DepthBuffer); //Return EntityID of the clicked coordinate in given screenspace coordinates. //EntityID ScreenCoordsToEntityID(glm::vec2 screenCoord, float depth); diff --git a/resources/Shaders/Picking.frag.glsl b/resources/Shaders/Picking.frag.glsl index 11f529b0..8c95ead3 100644 --- a/resources/Shaders/Picking.frag.glsl +++ b/resources/Shaders/Picking.frag.glsl @@ -13,7 +13,7 @@ out vec4 TextureFragment; void main() { - TextureFragment = vec4(PickingColor, 0, 1); + TextureFragment = vec4(PickingColor/255, 0, 1); } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index f39580b7..aba512fd 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -117,21 +117,24 @@ void Renderer::InputUpdate(double dt) static double mousePosX, mousePosY; glfwGetCursorPos(m_Window, &mousePosX, &mousePosY); if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) { - glm::vec3 data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer); - glm::vec2 color = glm::vec2(data); - float depth = data.z; + ScreenCoords::PixelData data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer); - glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); + glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, data.Depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); // glm::vec3 worldPos = glm::vec3(glm::inverse(m_Camera->ViewMatrix()) * glm::vec4(viewPos, 1.f)); - //printf("R: %f, G: %f, Depth: %f\n", color.r, color.g, depth); + //printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth); //printf("view: x: %f, y: %f z: %f, Length: %f\n\n", viewPos.x, viewPos.y, viewPos.z, glm::length(viewPos)); - - if (color != glm::vec2(0, 0)) { - EntityID pickedEntity = m_PickingColorsToEntity[color]; - printf("Picked Entity: %i", pickedEntity); - - } + //printf("\n\n---------------------------\n"); + auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1])); + if (got == m_PickingColorsToEntity.end()) + printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]); + else + printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second); + //printf("----\n"); + //for (auto i : m_PickingColorsToEntity) { + // printf("Entity: %i, Color: R: %f, G: %f\n", i.second, i.first.r, i.first.g); + //} + //printf("---------------------------\n\n"); } if (glfwGetKey(m_Window, GLFW_KEY_SPACE) == GLFW_PRESS) { @@ -213,10 +216,12 @@ void Renderer::DrawScene(RenderQueueCollection& rq) continue; } } + GLERROR("DrawScene Error"); } void Renderer::PickingPass(RenderQueueCollection& rq) { + m_PickingColorsToEntity.clear(); m_PickingBuffer.Bind(); glEnable(GL_DEPTH_TEST); @@ -225,7 +230,7 @@ void Renderer::PickingPass(RenderQueueCollection& rq) glClearColor(0.f, 0.f, 0.f, 1.f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - int r = 30; + int r = 1; int g = 0; //TODO: Render: Add code for more jobs than modeljobs. @@ -237,8 +242,18 @@ void Renderer::PickingPass(RenderQueueCollection& rq) auto modelJob = std::dynamic_pointer_cast(job); if (modelJob) { - glm::vec2 pickColor = glm::vec2(r/255.f, g/255.f); - m_PickingColorsToEntity[pickColor] = modelJob->Entity; + //--------------- + //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame. + //--------------- + int pickColor[2] = { r, g }; + for (auto i : m_PickingColorsToEntity) { + if(modelJob->Entity == i.second) { + pickColor[0] = i.first.x; + pickColor[1] = i.first.y; + r -= 1; + } + } + m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; //Render picking stuff @@ -246,19 +261,21 @@ void Renderer::PickingPass(RenderQueueCollection& rq) glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); - glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(pickColor)); + glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); glBindVertexArray(modelJob->Model->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); - r+=50; + r += 1; if(r > 255) { r = 0; - g+=50; + g += 1; } } } m_PickingBuffer.Unbind(); + GLERROR("PickingPass Error"); + } @@ -300,7 +317,7 @@ void Renderer::InitializeTextures() */ GenerateTexture(&m_PickingTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, - glm::vec2(m_Resolution.Width, m_Resolution.Height), GL_RG8, GL_RG, GL_FLOAT); + glm::vec2(m_Resolution.Width, m_Resolution.Height), GL_RG8, GL_RG, GL_UNSIGNED_BYTE); } void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) diff --git a/src/Engine/Rendering/Util/ScreenCoords.cpp b/src/Engine/Rendering/Util/ScreenCoords.cpp index aad94d67..e999c895 100644 --- a/src/Engine/Rendering/Util/ScreenCoords.cpp +++ b/src/Engine/Rendering/Util/ScreenCoords.cpp @@ -29,22 +29,30 @@ glm::vec3 ScreenCoords::ToWorldPos(glm::vec2 screenCoord, float depth, float scr return ToWorldPos(screenCoord.x, screenCoord.y, depth, screenWidth, screenHeight, cameraProjectionMat, cameraViewMat); } -glm::vec3 ScreenCoords::ToPixelData(float x, float y, FrameBuffer* PickDataBuffer, GLuint DepthBuffer) +ScreenCoords::PixelData ScreenCoords::ToPixelData(float x, float y, FrameBuffer* PickDataBuffer, GLuint DepthBuffer) { PickDataBuffer->Bind(); - glm::vec2 pixelData; - glReadPixels(x, y, 1, 1, GL_RG, GL_FLOAT, &pixelData); + unsigned char pdata[2]; + glReadPixels(x, y, 1, 1, GL_RG, GL_UNSIGNED_BYTE, &pdata); PickDataBuffer->Unbind(); + glBindFramebuffer(GL_FRAMEBUFFER, DepthBuffer); float depthData; glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depthData); glBindFramebuffer(GL_FRAMEBUFFER, 0); - return glm::vec3(pixelData, depthData); + PixelData p; + p.Color[0] = (int)pdata[0]; + p.Color[1] = (int)pdata[1]; + p.Depth = depthData; + + GLERROR("ScreenCoords::ToPixelData Error"); + + return p; } -glm::vec3 ScreenCoords::ToPixelData(glm::vec2 screenCoord, FrameBuffer* PickDataBuffer, GLuint DepthBuffer) +ScreenCoords::PixelData ScreenCoords::ToPixelData(glm::vec2 screenCoord, FrameBuffer* PickDataBuffer, GLuint DepthBuffer) { return ToPixelData(screenCoord.x, screenCoord.y, PickDataBuffer, DepthBuffer); } From bb900c51105ed432e6c24ac4fae8a86b74049573 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 10 Dec 2015 16:33:33 +0100 Subject: [PATCH 02/10] Added picking event --- include/Engine/Rendering/EPicking.h | 69 ++++++++++++++++++++++ include/Engine/Rendering/Renderer.h | 11 +++- src/Engine/Rendering/Renderer.cpp | 35 ++++------- src/Engine/Rendering/Util/ScreenCoords.cpp | 1 + src/Game/Game.cpp | 4 +- 5 files changed, 94 insertions(+), 26 deletions(-) create mode 100644 include/Engine/Rendering/EPicking.h diff --git a/include/Engine/Rendering/EPicking.h b/include/Engine/Rendering/EPicking.h new file mode 100644 index 00000000..df75854a --- /dev/null +++ b/include/Engine/Rendering/EPicking.h @@ -0,0 +1,69 @@ +#ifndef Events_Picking_h__ +#define Events_Picking_h__ + +#include "../OpenGL.h" +#include "../GLM.h" + +#include "../Core/EventBroker.h" +#include "Util/ScreenCoords.h" +#include "FrameBuffer.h" +#include "../Core/Entity.h" +#include "Util/UnorderedMapVec2.h" + +namespace Events +{ + +/** Thrown Every frame, use functions to pick*/ +struct Picking : Event +{ +public: + Picking(FrameBuffer* pickingBuffer, GLuint* depthBuffer, glm::mat4 projectionMatrix, glm::mat4 viewMatrix, Rectangle resolution, const std::unordered_map* pickingColorsToEntity) + : PickingBuffer(pickingBuffer) + , DepthBuffer(depthBuffer) + , ProjectionMatrix(projectionMatrix) + , ViewMatrix(viewMatrix) + , Resolution(resolution) + , PickingColorsToEntity(pickingColorsToEntity) + { } + + + + struct PickData + { + //Picked Entity + EntityID Entity; + //World position of the "pick" + glm::vec3 Position; + }; + + PickData Pick(glm::vec2 screenCoord) const + { + PickData pickData; + + ScreenCoords::PixelData data = ScreenCoords::ToPixelData(screenCoord, PickingBuffer, *DepthBuffer); + + auto it = PickingColorsToEntity->find(glm::vec2(data.Color[0], data.Color[1])); + if (it != PickingColorsToEntity->end()) { + pickData.Entity = it->second; + } else { + pickData.Entity = -1; + } + pickData.Position = ScreenCoords::ToWorldPos(screenCoord.x, Resolution.Width - screenCoord.y, data.Depth, Resolution, ProjectionMatrix, ViewMatrix); + + return pickData; + } + + +private: + FrameBuffer* PickingBuffer; + GLuint* DepthBuffer; + const glm::mat4 ProjectionMatrix; + const glm::mat4 ViewMatrix; + const Rectangle Resolution; + const std::unordered_map* PickingColorsToEntity; + +}; + +} + +#endif diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b1b76468..76de0818 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -11,15 +11,24 @@ #include "FrameBuffer.h" #include "../Core/World.h" +#include "../Core/EventBroker.h" +#include "EPicking.h" + class Renderer : public IRenderer { public: + Renderer(EventBroker* eventBroker) + : m_EventBroker(eventBroker) + { } + virtual void Initialize() override; virtual void Update(double dt) override; virtual void Draw(RenderQueueCollection& rq) override; private: //----------------------Variables----------------------// + EventBroker* m_EventBroker; + Texture* m_ErrorTexture; Texture* m_WhiteTexture; float m_CameraMoveSpeed; @@ -31,8 +40,6 @@ private: Model* m_UnitQuad; Model* m_UnitSphere; - - std::unordered_map m_PickingColorsToEntity; //----------------------Functions----------------------// diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index aba512fd..6f4235d2 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -3,7 +3,6 @@ void Renderer::Initialize() { InitializeWindow(); - // Create default camera m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f); m_DefaultCamera->SetPosition(glm::vec3(0, 0, 10)); @@ -116,26 +115,6 @@ void Renderer::InputUpdate(double dt) static double mousePosX, mousePosY; glfwGetCursorPos(m_Window, &mousePosX, &mousePosY); - if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) { - ScreenCoords::PixelData data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer); - - glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, data.Depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); - // glm::vec3 worldPos = glm::vec3(glm::inverse(m_Camera->ViewMatrix()) * glm::vec4(viewPos, 1.f)); - - //printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth); - //printf("view: x: %f, y: %f z: %f, Length: %f\n\n", viewPos.x, viewPos.y, viewPos.z, glm::length(viewPos)); - //printf("\n\n---------------------------\n"); - auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1])); - if (got == m_PickingColorsToEntity.end()) - printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]); - else - printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second); - //printf("----\n"); - //for (auto i : m_PickingColorsToEntity) { - // printf("Entity: %i, Color: R: %f, G: %f\n", i.second, i.first.r, i.first.g); - //} - //printf("---------------------------\n\n"); - } if (glfwGetKey(m_Window, GLFW_KEY_SPACE) == GLFW_PRESS) { @@ -161,7 +140,8 @@ void Renderer::InputUpdate(double dt) void Renderer::Update(double dt) { - InputUpdate(dt); + m_EventBroker->Process(); + InputUpdate(dt); } @@ -276,6 +256,17 @@ void Renderer::PickingPass(RenderQueueCollection& rq) m_PickingBuffer.Unbind(); GLERROR("PickingPass Error"); + //Publish pick event every frame with the pick data that can be picked by the event + Events::Picking pickEvent = Events::Picking( + &m_PickingBuffer, + &m_DepthBuffer, + m_Camera->ProjectionMatrix(), + m_Camera->ViewMatrix(), + m_Resolution, + &m_PickingColorsToEntity); + + m_EventBroker->Publish(pickEvent); + } diff --git a/src/Engine/Rendering/Util/ScreenCoords.cpp b/src/Engine/Rendering/Util/ScreenCoords.cpp index e999c895..36dd08a1 100644 --- a/src/Engine/Rendering/Util/ScreenCoords.cpp +++ b/src/Engine/Rendering/Util/ScreenCoords.cpp @@ -56,3 +56,4 @@ ScreenCoords::PixelData ScreenCoords::ToPixelData(glm::vec2 screenCoord, FrameBu { return ToPixelData(screenCoord.x, screenCoord.y, PickDataBuffer, DepthBuffer); } + diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 15dde3a0..bff6aebc 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -16,7 +16,7 @@ Game::Game(int argc, char* argv[]) m_RenderQueueFactory = new RenderQueueFactory(); // Create the renderer - m_Renderer = new Renderer(); + m_Renderer = new Renderer(m_EventBroker); m_Renderer->SetFullscreen(m_Config->Get("Video.Fullscreen", false)); m_Renderer->SetVSYNC(m_Config->Get("Video.VSYNC", false)); m_Renderer->SetResolution(Rectangle( @@ -65,12 +65,12 @@ void Game::Tick() m_EventBroker->Swap(); m_InputManager->Update(dt); - m_Renderer->Update(dt); m_EventBroker->Swap(); // Iterate through systems and update world! m_SystemPipeline->Update(m_World, dt); testTick(dt); + m_Renderer->Update(dt); m_RenderQueueFactory->Update(m_World); m_Renderer->Draw(m_RenderQueueFactory->RenderQueues()); From 80f028edf2ebf9d69f30c4f06ea6441bce75b695 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 11 Dec 2015 13:45:19 +0100 Subject: [PATCH 03/10] Added a very basic PlayerSystem, and a PlayerComponent. --- include/Engine/Core/System.h | 7 ++-- include/Engine/Core/SystemPipeline.h | 4 +-- include/Game/Game.h | 1 + include/Game/PlayerSystem.h | 34 ++++++++++++++++++ include/Game/RaptorCopterSystem.h | 2 +- resources/Schema/Components/Player.xml | 4 +++ resources/Schema/Components/Player.xsd | 14 ++++++++ resources/Schema/Entities/Test.xml | 10 ++++++ src/Game/Game.cpp | 3 +- src/Game/PlayerSystem.cpp | 49 ++++++++++++++++++++++++++ 10 files changed, 121 insertions(+), 7 deletions(-) create mode 100644 include/Game/PlayerSystem.h create mode 100644 resources/Schema/Components/Player.xml create mode 100644 resources/Schema/Components/Player.xsd create mode 100644 src/Game/PlayerSystem.cpp diff --git a/include/Engine/Core/System.h b/include/Engine/Core/System.h index 8e8c71b9..a79e025f 100644 --- a/include/Engine/Core/System.h +++ b/include/Engine/Core/System.h @@ -10,16 +10,17 @@ class System friend class SystemPipeline; public: - System(const EventBroker* eventBroker, std::string componentType) + System(EventBroker* eventBroker, std::string componentType) : m_EventBroker(eventBroker) , m_ComponentType(componentType) { } - + + virtual void Initialize(); virtual void Update(World* world, ComponentWrapper& component, double dt) = 0; private: - const EventBroker* m_EventBroker; std::string m_ComponentType; + EventBroker* m_EventBroker; }; #endif \ No newline at end of file diff --git a/include/Engine/Core/SystemPipeline.h b/include/Engine/Core/SystemPipeline.h index 24f98121..e4b8bb1f 100644 --- a/include/Engine/Core/SystemPipeline.h +++ b/include/Engine/Core/SystemPipeline.h @@ -9,7 +9,7 @@ class SystemPipeline { public: - SystemPipeline(const EventBroker* eventBroker) + SystemPipeline(EventBroker* eventBroker) : m_EventBroker(eventBroker) { } ~SystemPipeline() @@ -51,7 +51,7 @@ public: } private: - const EventBroker* m_EventBroker; + EventBroker* m_EventBroker; std::unordered_map> m_Systems; }; diff --git a/include/Game/Game.h b/include/Game/Game.h index 500ecf3a..bc66d62f 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -13,6 +13,7 @@ #include "Core/EntityXMLFile.h" #include "Core/SystemPipeline.h" #include "RaptorCopterSystem.h" +#include "PlayerSystem.h" class Game { diff --git a/include/Game/PlayerSystem.h b/include/Game/PlayerSystem.h new file mode 100644 index 00000000..c6a9f04b --- /dev/null +++ b/include/Game/PlayerSystem.h @@ -0,0 +1,34 @@ +#ifndef PlayerSystem_h__ +#define PlayerSystem_h__ + +#include +#include + +#include "Common.h" +#include "Core/System.h" +#include "Core/EventBroker.h" +#include "Core/EKeyDown.h" +#include "Core/EKeyUp.h" + +class PlayerSystem : public System +{ +public: + PlayerSystem(EventBroker* eventBroker) + : System(eventBroker, "Player") + { } + + void Initialize(); + virtual void Update(World* world, ComponentWrapper& player, double dt) override; + +private: + float m_Speed; + glm::vec3 m_Direction; + EventBroker* m_EventBroker; + + EventRelay m_EKeyDown; + bool OnKeyDown(const Events::KeyDown &event); + EventRelay m_EKeyUp; + bool OnKeyUp(const Events::KeyUp &event); +}; + +#endif \ No newline at end of file diff --git a/include/Game/RaptorCopterSystem.h b/include/Game/RaptorCopterSystem.h index 55647004..a25ca3df 100644 --- a/include/Game/RaptorCopterSystem.h +++ b/include/Game/RaptorCopterSystem.h @@ -4,7 +4,7 @@ class RaptorCopterSystem : public System { public: - RaptorCopterSystem(const EventBroker* eventBroker) + RaptorCopterSystem(EventBroker* eventBroker) : System(eventBroker, "RaptorCopter") { } diff --git a/resources/Schema/Components/Player.xml b/resources/Schema/Components/Player.xml new file mode 100644 index 00000000..d2e5f3a7 --- /dev/null +++ b/resources/Schema/Components/Player.xml @@ -0,0 +1,4 @@ + + 0 + + \ No newline at end of file diff --git a/resources/Schema/Components/Player.xsd b/resources/Schema/Components/Player.xsd new file mode 100644 index 00000000..61f19646 --- /dev/null +++ b/resources/Schema/Components/Player.xsd @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 2c3ea18e..885ff3d2 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -31,6 +31,16 @@ + + + + + + + Models/Core/UnitCube.obj + + + diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index bff6aebc..0fc913de 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -44,7 +44,8 @@ Game::Game(int argc, char* argv[]) // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); - m_SystemPipeline->AddSystem(); + m_SystemPipeline->AddSystem(); + m_SystemPipeline->AddSystem(); m_LastTime = glfwGetTime(); diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp new file mode 100644 index 00000000..b8dadaee --- /dev/null +++ b/src/Game/PlayerSystem.cpp @@ -0,0 +1,49 @@ +#include "PlayerSystem.h" + +void PlayerSystem::Initialize() +{ + EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PlayerSystem::OnKeyDown); + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PlayerSystem::OnKeyUp); +} + +void PlayerSystem::Update(World * world, ComponentWrapper & player, double dt) +{ + m_EventBroker->Process(); + ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); + (glm::vec3&)player["Velocity"] = m_Speed * float(dt) * m_Direction; + (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; +} + +bool PlayerSystem::OnKeyDown(const Events::KeyDown & event) +{ + if (event.KeyCode == GLFW_KEY_P) { + m_Direction.z == -1; + } + if (event.KeyCode == GLFW_KEY_LEFT) { + m_Direction.x == -1; + } + if (event.KeyCode == GLFW_KEY_DOWN) { + m_Direction.z == 1; + } + if (event.KeyCode == GLFW_KEY_RIGHT) { + m_Direction.x == 1; + } + return true; +} + +bool PlayerSystem::OnKeyUp(const Events::KeyUp & event) +{ + if (event.KeyCode == GLFW_KEY_UP) { + m_Direction.z == 0; + } + if (event.KeyCode == GLFW_KEY_LEFT) { + m_Direction.x == 0; + } + if (event.KeyCode == GLFW_KEY_DOWN) { + m_Direction.z == 0; + } + if (event.KeyCode == GLFW_KEY_RIGHT) { + m_Direction.x == 0; + } + return false; +} From 0b60979c7bda0a5240d471f177cc20a73351b0b9 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 11 Dec 2015 14:03:00 +0100 Subject: [PATCH 04/10] Added a Initialize function for systems. --- include/Engine/Core/System.h | 4 ++-- include/Engine/Core/SystemPipeline.h | 10 ++++++++++ include/Game/PlayerSystem.h | 3 +-- include/Game/RaptorCopterSystem.h | 2 ++ src/Game/Game.cpp | 4 ++++ src/Game/PlayerSystem.cpp | 2 +- 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/include/Engine/Core/System.h b/include/Engine/Core/System.h index a79e025f..c4a33d94 100644 --- a/include/Engine/Core/System.h +++ b/include/Engine/Core/System.h @@ -15,10 +15,10 @@ public: , m_ComponentType(componentType) { } - virtual void Initialize(); + virtual void Initialize() { } virtual void Update(World* world, ComponentWrapper& component, double dt) = 0; -private: +protected: std::string m_ComponentType; EventBroker* m_EventBroker; }; diff --git a/include/Engine/Core/SystemPipeline.h b/include/Engine/Core/SystemPipeline.h index e4b8bb1f..a3dc4f36 100644 --- a/include/Engine/Core/SystemPipeline.h +++ b/include/Engine/Core/SystemPipeline.h @@ -21,6 +21,16 @@ public: } } + void Initialize() + { + for (auto& pair : m_Systems) { + auto& systems = pair.second; + for (auto& system : systems) { + system->Initialize(); + } + } + } + template void AddSystem(Arguments... args) { diff --git a/include/Game/PlayerSystem.h b/include/Game/PlayerSystem.h index c6a9f04b..92e8a7cc 100644 --- a/include/Game/PlayerSystem.h +++ b/include/Game/PlayerSystem.h @@ -17,13 +17,12 @@ public: : System(eventBroker, "Player") { } - void Initialize(); + virtual void Initialize(); virtual void Update(World* world, ComponentWrapper& player, double dt) override; private: float m_Speed; glm::vec3 m_Direction; - EventBroker* m_EventBroker; EventRelay m_EKeyDown; bool OnKeyDown(const Events::KeyDown &event); diff --git a/include/Game/RaptorCopterSystem.h b/include/Game/RaptorCopterSystem.h index a25ca3df..cdd6dd90 100644 --- a/include/Game/RaptorCopterSystem.h +++ b/include/Game/RaptorCopterSystem.h @@ -8,6 +8,8 @@ public: : System(eventBroker, "RaptorCopter") { } + virtual void Initialize() { } + virtual void Update(World* world, ComponentWrapper& raptorCopter, double dt) override { ComponentWrapper& transform = world->GetComponent(raptorCopter.EntityID, "Transform"); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 0fc913de..21f93e41 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -47,9 +47,13 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); + + m_LastTime = glfwGetTime(); testIntialize(); + + m_SystemPipeline->Initialize(); } Game::~Game() diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index b8dadaee..024204b5 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -16,7 +16,7 @@ void PlayerSystem::Update(World * world, ComponentWrapper & player, double dt) bool PlayerSystem::OnKeyDown(const Events::KeyDown & event) { - if (event.KeyCode == GLFW_KEY_P) { + if (event.KeyCode == GLFW_KEY_UP) { m_Direction.z == -1; } if (event.KeyCode == GLFW_KEY_LEFT) { From 094c7fbb444a6a12a6351974e0e144277285bdc5 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 11 Dec 2015 14:20:36 +0100 Subject: [PATCH 05/10] Added system to CMakeLists.txt. --- src/Game/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Game/CMakeLists.txt b/src/Game/CMakeLists.txt index c21aaa8a..18b80f93 100644 --- a/src/Game/CMakeLists.txt +++ b/src/Game/CMakeLists.txt @@ -19,6 +19,7 @@ file(GLOB SOURCE_FILES set(SOURCE_FILES ${SOURCE_FILES} "Game.cpp" + "PlayerSystem.cpp" ) set(LIBRARIES From c2435fda2d8313a9d93da7fa2bf01267d138b247 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 11 Dec 2015 14:27:54 +0100 Subject: [PATCH 06/10] Added Component to Components.xsd and Entity.xsd --- resources/Schema/Components.xsd | 1 + resources/Schema/Components/Player.xml | 1 - resources/Schema/Components/Player.xsd | 1 - resources/Schema/Entities/Test.xml | 3 +++ resources/Schema/Types/Entity.xsd | 1 + 5 files changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index d4160700..12fb870e 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -5,4 +5,5 @@ + \ No newline at end of file diff --git a/resources/Schema/Components/Player.xml b/resources/Schema/Components/Player.xml index d2e5f3a7..91a3bb4e 100644 --- a/resources/Schema/Components/Player.xml +++ b/resources/Schema/Components/Player.xml @@ -1,4 +1,3 @@ - 0 \ No newline at end of file diff --git a/resources/Schema/Components/Player.xsd b/resources/Schema/Components/Player.xsd index 61f19646..78c5866b 100644 --- a/resources/Schema/Components/Player.xsd +++ b/resources/Schema/Components/Player.xsd @@ -6,7 +6,6 @@ - diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 885ff3d2..4b8fb132 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -33,6 +33,9 @@ + + + diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index 695ae7d1..92f7dc31 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -14,6 +14,7 @@ + From 4da33ff4ec16c1ad641ccdd60a5c41c3057d4bfa Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 11 Dec 2015 15:00:57 +0100 Subject: [PATCH 07/10] Fixed movement on a "player" cube. Very simple system atm --- include/Game/PlayerSystem.h | 11 +++++++- src/Game/PlayerSystem.cpp | 50 +++++++++++++++++++++++++------------ 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/include/Game/PlayerSystem.h b/include/Game/PlayerSystem.h index 92e8a7cc..5966bb24 100644 --- a/include/Game/PlayerSystem.h +++ b/include/Game/PlayerSystem.h @@ -10,6 +10,14 @@ #include "Core/EKeyDown.h" #include "Core/EKeyUp.h" +struct KeyInput +{ + bool Forward = false; + bool Left = false; + bool Back = false; + bool Right = false; +}; + class PlayerSystem : public System { public: @@ -21,8 +29,9 @@ public: virtual void Update(World* world, ComponentWrapper& player, double dt) override; private: - float m_Speed; + float m_Speed = 5; glm::vec3 m_Direction; + KeyInput input; EventRelay m_EKeyDown; bool OnKeyDown(const Events::KeyDown &event); diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index 024204b5..17e18a9a 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -8,6 +8,24 @@ void PlayerSystem::Initialize() void PlayerSystem::Update(World * world, ComponentWrapper & player, double dt) { + if (input.Forward) { + m_Direction.z = -1; + } + else if (input.Back) { + m_Direction.z = 1; + } + else { + m_Direction.z = 0; + } + if (input.Left) { + m_Direction.x = -1; + } + else if (input.Right) { + m_Direction.x = 1; + } + else { + m_Direction.x = 0; + } m_EventBroker->Process(); ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); (glm::vec3&)player["Velocity"] = m_Speed * float(dt) * m_Direction; @@ -16,34 +34,34 @@ void PlayerSystem::Update(World * world, ComponentWrapper & player, double dt) bool PlayerSystem::OnKeyDown(const Events::KeyDown & event) { - if (event.KeyCode == GLFW_KEY_UP) { - m_Direction.z == -1; + if (event.KeyCode == GLFW_KEY_W) { + input.Forward = true; } - if (event.KeyCode == GLFW_KEY_LEFT) { - m_Direction.x == -1; + if (event.KeyCode == GLFW_KEY_A) { + input.Left = true; } - if (event.KeyCode == GLFW_KEY_DOWN) { - m_Direction.z == 1; + if (event.KeyCode == GLFW_KEY_S) { + input.Back = true; } - if (event.KeyCode == GLFW_KEY_RIGHT) { - m_Direction.x == 1; + if (event.KeyCode == GLFW_KEY_D) { + input.Right = true; } return true; } bool PlayerSystem::OnKeyUp(const Events::KeyUp & event) { - if (event.KeyCode == GLFW_KEY_UP) { - m_Direction.z == 0; + if (event.KeyCode == GLFW_KEY_W) { + input.Forward = false; } - if (event.KeyCode == GLFW_KEY_LEFT) { - m_Direction.x == 0; + if (event.KeyCode == GLFW_KEY_A) { + input.Left = false; } - if (event.KeyCode == GLFW_KEY_DOWN) { - m_Direction.z == 0; + if (event.KeyCode == GLFW_KEY_S) { + input.Back = false; } - if (event.KeyCode == GLFW_KEY_RIGHT) { - m_Direction.x == 0; + if (event.KeyCode == GLFW_KEY_D) { + input.Right = false; } return false; } From 16d636a87c0f9d134ca83afe73f42147aad01f05 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 11 Dec 2015 15:23:56 +0100 Subject: [PATCH 08/10] Removed Initialize function for systems. --- include/Engine/Core/System.h | 1 - include/Engine/Core/SystemPipeline.h | 10 ---------- include/Game/PlayerSystem.h | 6 ++++-- src/Game/Game.cpp | 2 -- src/Game/PlayerSystem.cpp | 5 ----- 5 files changed, 4 insertions(+), 20 deletions(-) diff --git a/include/Engine/Core/System.h b/include/Engine/Core/System.h index c4a33d94..cb4ccc26 100644 --- a/include/Engine/Core/System.h +++ b/include/Engine/Core/System.h @@ -15,7 +15,6 @@ public: , m_ComponentType(componentType) { } - virtual void Initialize() { } virtual void Update(World* world, ComponentWrapper& component, double dt) = 0; protected: diff --git a/include/Engine/Core/SystemPipeline.h b/include/Engine/Core/SystemPipeline.h index a3dc4f36..e4b8bb1f 100644 --- a/include/Engine/Core/SystemPipeline.h +++ b/include/Engine/Core/SystemPipeline.h @@ -21,16 +21,6 @@ public: } } - void Initialize() - { - for (auto& pair : m_Systems) { - auto& systems = pair.second; - for (auto& system : systems) { - system->Initialize(); - } - } - } - template void AddSystem(Arguments... args) { diff --git a/include/Game/PlayerSystem.h b/include/Game/PlayerSystem.h index 5966bb24..789b7549 100644 --- a/include/Game/PlayerSystem.h +++ b/include/Game/PlayerSystem.h @@ -23,9 +23,11 @@ class PlayerSystem : public System public: PlayerSystem(EventBroker* eventBroker) : System(eventBroker, "Player") - { } + { + EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PlayerSystem::OnKeyDown); + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PlayerSystem::OnKeyUp); + } - virtual void Initialize(); virtual void Update(World* world, ComponentWrapper& player, double dt) override; private: diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 21f93e41..9eafd887 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -52,8 +52,6 @@ Game::Game(int argc, char* argv[]) m_LastTime = glfwGetTime(); testIntialize(); - - m_SystemPipeline->Initialize(); } Game::~Game() diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index 17e18a9a..a7b60011 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -1,10 +1,5 @@ #include "PlayerSystem.h" -void PlayerSystem::Initialize() -{ - EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PlayerSystem::OnKeyDown); - EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PlayerSystem::OnKeyUp); -} void PlayerSystem::Update(World * world, ComponentWrapper & player, double dt) { From 3da69c8a1b46246ce343561ff982dc25c01134ab Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 11 Dec 2015 15:29:57 +0100 Subject: [PATCH 09/10] Fixed indentation --- include/Engine/Core/EventBroker.h | 134 +++++++++++++++--------------- include/Engine/Core/System.h | 4 +- include/Game/PlayerSystem.h | 36 ++++---- src/Game/Game.cpp | 80 +++++++++--------- src/Game/PlayerSystem.cpp | 92 ++++++++++---------- 5 files changed, 171 insertions(+), 175 deletions(-) diff --git a/include/Engine/Core/EventBroker.h b/include/Engine/Core/EventBroker.h index 29d82c17..f04c7715 100644 --- a/include/Engine/Core/EventBroker.h +++ b/include/Engine/Core/EventBroker.h @@ -17,119 +17,119 @@ class EventBroker; class BaseEventRelay { -friend class EventBroker; + friend class EventBroker; protected: - BaseEventRelay(std::string contextTypeName, std::string eventTypeName) - : m_ContextTypeName(contextTypeName) - , m_EventTypeName(eventTypeName) - , m_Broker(nullptr) - { } - ~BaseEventRelay(); + BaseEventRelay(std::string contextTypeName, std::string eventTypeName) + : m_ContextTypeName(contextTypeName) + , m_EventTypeName(eventTypeName) + , m_Broker(nullptr) + { } + ~BaseEventRelay(); public: - virtual bool Receive(const std::shared_ptr event) = 0; + virtual bool Receive(const std::shared_ptr event) = 0; protected: - std::string m_ContextTypeName; - std::string m_EventTypeName; - EventBroker* m_Broker; + std::string m_ContextTypeName; + std::string m_EventTypeName; + EventBroker* m_Broker; }; template class EventRelay : public BaseEventRelay { public: - typedef std::function CallbackType; + typedef std::function CallbackType; - EventRelay() - : m_Callback(nullptr) - , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) - { } - EventRelay(CallbackType callback) - : m_Callback(callback) - , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) - { } + EventRelay() + : m_Callback(nullptr) + , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) + { } + EventRelay(CallbackType callback) + : m_Callback(callback) + , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) + { } protected: - bool Receive(const std::shared_ptr event) override; + bool Receive(const std::shared_ptr event) override; private: - CallbackType m_Callback; + CallbackType m_Callback; }; template bool EventRelay::Receive(const std::shared_ptr event) { - if (m_Callback != nullptr) { - return m_Callback(*static_cast(event.get())); - } else { - return false; - } + if (m_Callback != nullptr) { + return m_Callback(*static_cast(event.get())); + } else { + return false; + } } class EventBroker { -template friend class EventRelay; + template friend class EventRelay; public: - EventBroker() - { - m_EventQueueRead = std::make_shared(); - m_EventQueueWrite = std::make_shared(); - } + EventBroker() + { + m_EventQueueRead = std::make_shared(); + m_EventQueueWrite = std::make_shared(); + } - void Subscribe(BaseEventRelay &relay); - template - void Publish(const EventType &event); - /* - Process all events in a given context. - Returns: Number of events processed - */ - template - int Process(); - int Process(std::string contextTypeName); - void Swap(); - void Clear(); - void Unsubscribe(BaseEventRelay &relay); + void Subscribe(BaseEventRelay &relay); + template + void Publish(const EventType &event); + /* + Process all events in a given context. + Returns: Number of events processed + */ + template + int Process(); + int Process(std::string contextTypeName); + void Swap(); + void Clear(); + void Unsubscribe(BaseEventRelay &relay); private: - bool m_IsProcessing = false; + bool m_IsProcessing = false; - typedef std::string ContextTypeName_t; // typeid(ContextType).name() - typedef std::string EventTypeName_t; // typeid(EventType).name() + typedef std::string ContextTypeName_t; // typeid(ContextType).name() + typedef std::string EventTypeName_t; // typeid(EventType).name() - typedef std::unordered_multimap EventRelays_t; - typedef std::unordered_map ContextRelays_t; - ContextRelays_t m_ContextRelays; - std::vector m_RelaysToSubscribe; - std::vector m_RelaysToUnsubscribe; + typedef std::unordered_multimap EventRelays_t; + typedef std::unordered_map ContextRelays_t; + ContextRelays_t m_ContextRelays; + std::vector m_RelaysToSubscribe; + std::vector m_RelaysToUnsubscribe; - typedef std::list>> EventQueue_t; - std::shared_ptr m_EventQueueRead; - std::shared_ptr m_EventQueueWrite; + typedef std::list>> EventQueue_t; + std::shared_ptr m_EventQueueRead; + std::shared_ptr m_EventQueueWrite; - void subscribeImmediate(BaseEventRelay& relay); - void unsubscribeImmediate(BaseEventRelay& relay); + void subscribeImmediate(BaseEventRelay& relay); + void unsubscribeImmediate(BaseEventRelay& relay); }; template void EventBroker::Publish(const EventType &event) { - /*auto itpair = m_Subscribers.equal_range(typeid(EventType).name()); - for (auto it = itpair.first; it != itpair.second; ++it) - { - it->second->Receive(event); - }*/ + /*auto itpair = m_Subscribers.equal_range(typeid(EventType).name()); + for (auto it = itpair.first; it != itpair.second; ++it) + { + it->second->Receive(event); + }*/ - m_EventQueueWrite->push_back(std::make_pair(typeid(EventType).name(), std::shared_ptr(new EventType(event)))); + m_EventQueueWrite->push_back(std::make_pair(typeid(EventType).name(), std::shared_ptr(new EventType(event)))); } template int EventBroker::Process() { - const std::string contextTypeName = typeid(ContextType).name(); - return Process(contextTypeName); + const std::string contextTypeName = typeid(ContextType).name(); + return Process(contextTypeName); } #endif diff --git a/include/Engine/Core/System.h b/include/Engine/Core/System.h index cb4ccc26..37719c51 100644 --- a/include/Engine/Core/System.h +++ b/include/Engine/Core/System.h @@ -14,12 +14,12 @@ public: : m_EventBroker(eventBroker) , m_ComponentType(componentType) { } - + virtual void Update(World* world, ComponentWrapper& component, double dt) = 0; protected: std::string m_ComponentType; - EventBroker* m_EventBroker; + EventBroker* m_EventBroker; }; #endif \ No newline at end of file diff --git a/include/Game/PlayerSystem.h b/include/Game/PlayerSystem.h index 789b7549..18752ac6 100644 --- a/include/Game/PlayerSystem.h +++ b/include/Game/PlayerSystem.h @@ -12,33 +12,33 @@ struct KeyInput { - bool Forward = false; - bool Left = false; - bool Back = false; - bool Right = false; + bool Forward = false; + bool Left = false; + bool Back = false; + bool Right = false; }; class PlayerSystem : public System { public: - PlayerSystem(EventBroker* eventBroker) - : System(eventBroker, "Player") - { - EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PlayerSystem::OnKeyDown); - EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PlayerSystem::OnKeyUp); - } + PlayerSystem(EventBroker* eventBroker) + : System(eventBroker, "Player") + { + EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PlayerSystem::OnKeyDown); + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PlayerSystem::OnKeyUp); + } - virtual void Update(World* world, ComponentWrapper& player, double dt) override; + virtual void Update(World* world, ComponentWrapper& player, double dt) override; private: - float m_Speed = 5; - glm::vec3 m_Direction; - KeyInput input; + float m_Speed = 5; + glm::vec3 m_Direction; + KeyInput input; - EventRelay m_EKeyDown; - bool OnKeyDown(const Events::KeyDown &event); - EventRelay m_EKeyUp; - bool OnKeyUp(const Events::KeyUp &event); + EventRelay m_EKeyDown; + bool OnKeyDown(const Events::KeyDown &event); + EventRelay m_EKeyUp; + bool OnKeyUp(const Events::KeyUp &event); }; #endif \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 9eafd887..fa12bbc6 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -2,38 +2,38 @@ Game::Game(int argc, char* argv[]) { - ResourceManager::RegisterType("ConfigFile"); - ResourceManager::RegisterType("Model"); - ResourceManager::RegisterType("Texture"); + ResourceManager::RegisterType("ConfigFile"); + ResourceManager::RegisterType("Model"); + ResourceManager::RegisterType("Texture"); ResourceManager::RegisterType("EntityXMLFile"); - m_Config = ResourceManager::Load("Config.ini"); - LOG_LEVEL = static_cast<_LOG_LEVEL>(m_Config->Get("Debug.LogLevel", 1)); + m_Config = ResourceManager::Load("Config.ini"); + LOG_LEVEL = static_cast<_LOG_LEVEL>(m_Config->Get("Debug.LogLevel", 1)); - // Create the core event broker - m_EventBroker = new EventBroker(); + // Create the core event broker + m_EventBroker = new EventBroker(); m_RenderQueueFactory = new RenderQueueFactory(); - // Create the renderer - m_Renderer = new Renderer(m_EventBroker); - m_Renderer->SetFullscreen(m_Config->Get("Video.Fullscreen", false)); - m_Renderer->SetVSYNC(m_Config->Get("Video.VSYNC", false)); - m_Renderer->SetResolution(Rectangle( - 0, - 0, - m_Config->Get("Video.Width", 1280), - m_Config->Get("Video.Height", 720) - )); - m_Renderer->Initialize(); + // Create the renderer + m_Renderer = new Renderer(m_EventBroker); + m_Renderer->SetFullscreen(m_Config->Get("Video.Fullscreen", false)); + m_Renderer->SetVSYNC(m_Config->Get("Video.VSYNC", false)); + m_Renderer->SetResolution(Rectangle( + 0, + 0, + m_Config->Get("Video.Width", 1280), + m_Config->Get("Video.Height", 720) + )); + m_Renderer->Initialize(); - // Create input manager - m_InputManager = new InputManager(m_Renderer->Window(), m_EventBroker); + // Create input manager + m_InputManager = new InputManager(m_Renderer->Window(), m_EventBroker); - // Create the root level GUI frame - m_FrameStack = new GUI::Frame(m_EventBroker); - m_FrameStack->Width = m_Renderer->Resolution().Width; - m_FrameStack->Height = m_Renderer->Resolution().Height; + // Create the root level GUI frame + m_FrameStack = new GUI::Frame(m_EventBroker); + m_FrameStack->Width = m_Renderer->Resolution().Width; + m_FrameStack->Height = m_Renderer->Resolution().Height; // Create a world m_World = new World(); @@ -41,34 +41,34 @@ Game::Game(int argc, char* argv[]) if (!mapToLoad.empty()) { ResourceManager::Load(mapToLoad)->PopulateWorld(m_World); } - + // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); - m_SystemPipeline->AddSystem(); - m_SystemPipeline->AddSystem(); + m_SystemPipeline->AddSystem(); + m_SystemPipeline->AddSystem(); - m_LastTime = glfwGetTime(); + m_LastTime = glfwGetTime(); testIntialize(); } Game::~Game() { - delete m_FrameStack; - delete m_EventBroker; + delete m_FrameStack; + delete m_EventBroker; } void Game::Tick() { - double currentTime = glfwGetTime(); - double dt = currentTime - m_LastTime; - m_LastTime = currentTime; + double currentTime = glfwGetTime(); + double dt = currentTime - m_LastTime; + m_LastTime = currentTime; - m_EventBroker->Swap(); - m_InputManager->Update(dt); - m_EventBroker->Swap(); + m_EventBroker->Swap(); + m_InputManager->Update(dt); + m_EventBroker->Swap(); // Iterate through systems and update world! m_SystemPipeline->Update(m_World, dt); @@ -76,12 +76,12 @@ void Game::Tick() m_Renderer->Update(dt); m_RenderQueueFactory->Update(m_World); - m_Renderer->Draw(m_RenderQueueFactory->RenderQueues()); + m_Renderer->Draw(m_RenderQueueFactory->RenderQueues()); - m_EventBroker->Swap(); - m_EventBroker->Clear(); + m_EventBroker->Swap(); + m_EventBroker->Clear(); - glfwPollEvents(); + glfwPollEvents(); } diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index a7b60011..736ea105 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -3,60 +3,56 @@ void PlayerSystem::Update(World * world, ComponentWrapper & player, double dt) { - if (input.Forward) { - m_Direction.z = -1; - } - else if (input.Back) { - m_Direction.z = 1; - } - else { - m_Direction.z = 0; - } - if (input.Left) { - m_Direction.x = -1; - } - else if (input.Right) { - m_Direction.x = 1; - } - else { - m_Direction.x = 0; - } - m_EventBroker->Process(); - ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); - (glm::vec3&)player["Velocity"] = m_Speed * float(dt) * m_Direction; - (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; + if (input.Forward) { + m_Direction.z = -1; + } else if (input.Back) { + m_Direction.z = 1; + } else { + m_Direction.z = 0; + } + if (input.Left) { + m_Direction.x = -1; + } else if (input.Right) { + m_Direction.x = 1; + } else { + m_Direction.x = 0; + } + m_EventBroker->Process(); + ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); + (glm::vec3&)player["Velocity"] = m_Speed * float(dt) * m_Direction; + (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; } bool PlayerSystem::OnKeyDown(const Events::KeyDown & event) { - if (event.KeyCode == GLFW_KEY_W) { - input.Forward = true; - } - if (event.KeyCode == GLFW_KEY_A) { - input.Left = true; - } - if (event.KeyCode == GLFW_KEY_S) { - input.Back = true; - } - if (event.KeyCode == GLFW_KEY_D) { - input.Right = true; - } - return true; + if (event.KeyCode == GLFW_KEY_W) { + input.Forward = true; + } + if (event.KeyCode == GLFW_KEY_A) { + input.Left = true; + } + if (event.KeyCode == GLFW_KEY_S) { + input.Back = true; + } + if (event.KeyCode == GLFW_KEY_D) { + input.Right = true; + } + return true; } bool PlayerSystem::OnKeyUp(const Events::KeyUp & event) { - if (event.KeyCode == GLFW_KEY_W) { - input.Forward = false; - } - if (event.KeyCode == GLFW_KEY_A) { - input.Left = false; - } - if (event.KeyCode == GLFW_KEY_S) { - input.Back = false; - } - if (event.KeyCode == GLFW_KEY_D) { - input.Right = false; - } - return false; + if (event.KeyCode == GLFW_KEY_W) { + input.Forward = false; + } + if (event.KeyCode == GLFW_KEY_A) { + input.Left = false; + } + if (event.KeyCode == GLFW_KEY_S) { + input.Back = false; + } + if (event.KeyCode == GLFW_KEY_D) { + input.Right = false; + } + return false; } From 7464facab9f132867562705d24ba9ec46192313a Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Sat, 12 Dec 2015 03:38:17 +0100 Subject: [PATCH 10/10] Next generation raptor copter --- resources/Schema/Entities/Test.xml | 22 +++++---------------- src/Engine/Rendering/RenderQueueFactory.cpp | 2 +- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 4b8fb132..78494ce1 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -61,7 +61,7 @@ - + Models/Core/UnitRaptor.obj @@ -72,8 +72,8 @@ - - + + 20 @@ -84,19 +84,7 @@ - - - - - Models/Core/UnitCylinder.obj - - - - - - - - + @@ -109,7 +97,7 @@ - + diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 81d7391e..4b82647c 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -30,7 +30,7 @@ glm::vec3 RenderQueueFactory::AbsolutePosition(World* world, EntityID entity) do { ComponentWrapper transform = world->GetComponent(entity, "Transform"); - position += AbsoluteOrientation(world, entity) * (glm::vec3)transform["Position"]; + position += (glm::vec3)transform["Position"]; entity = world->GetParent(entity); } while (entity != 0);