diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 423f8c6..a4e7b38 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -37,6 +37,7 @@ #include "Rendering/CModel.h" #include "Rendering/CSprite.h" #include "Rendering/CPointLight.h" +#include "Rendering/CCamera.h" #include "Transform/TransformSystem.h" #include "Sound/SoundSystem.h" #include "Sound/CCollisionSound.h" @@ -67,6 +68,7 @@ #include "Game/BrickComponents.h" +#include "Game/ScreenShakeSystem.h" #include "Game/EScreenShake.h" #include "Physics/PhysicsSystem.h" @@ -147,6 +149,7 @@ public: m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); @@ -209,6 +212,9 @@ public: m_World->SystemFactory.Register( [this]() { return new Systems::LifeSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::ScreenShakeSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); @@ -271,8 +277,6 @@ public: TEMPAddToRenderQueue(); } - std::unique_ptr defaultCamera = nullptr; - // Render scene //TODO send renderqueue to draw. m_Renderer->Draw(m_RendererQueue); @@ -292,6 +296,20 @@ public: { if (!m_TransformSystem) m_TransformSystem = m_World->GetSystem(); + + // HACK: How do we handle multiple cameras? Maybe view and projection matrices in render queue... + auto cameras = m_World->GetComponentsOfType(); + if (cameras != nullptr) { + for (auto& component : *cameras) { + auto camera = static_cast(component.get()); + auto transform = m_World->GetComponent(camera->Entity); + m_Renderer->Camera()->SetPosition(transform->Position); + m_Renderer->Camera()->SetOrientation(transform->Orientation); + m_Renderer->Camera()->SetFOV(camera->FOV); + m_Renderer->Camera()->SetNearClip(camera->NearClip); + m_Renderer->Camera()->SetFarClip(camera->FarClip); + } + } for (auto &pair : *m_World->GetEntities()) { diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 901a8b7..ebbf28b 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -19,6 +19,7 @@ #include "Rendering/CSprite.h" #include "Rendering/CModel.h" #include "Rendering/CPointLight.h" +#include "Rendering/CCamera.h" #include "Transform/EMove.h" diff --git a/include/Rendering/BaseRenderer.h b/include/Rendering/BaseRenderer.h index 6ec23d8..b09cc37 100644 --- a/include/Rendering/BaseRenderer.h +++ b/include/Rendering/BaseRenderer.h @@ -37,8 +37,8 @@ public: void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; } bool VSYNC() const { return m_VSYNC; } void SetVSYNC(bool vsync) { m_VSYNC = vsync; } - const dd::Camera* Camera() const { return m_Camera; } - void SetCamera(const dd::Camera* camera) + dd::Camera* Camera() const { return m_Camera; } + void SetCamera(dd::Camera* camera) { if (camera == nullptr) { m_Camera = m_DefaultCamera.get(); @@ -55,7 +55,7 @@ protected: bool m_Fullscreen = false; bool m_VSYNC = false; std::unique_ptr m_DefaultCamera = nullptr; - const dd::Camera* m_Camera = nullptr; + dd::Camera* m_Camera = nullptr; GLFWwindow* m_Window = nullptr; }; diff --git a/include/Rendering/CCamera.h b/include/Rendering/CCamera.h index 7d0441c..ab7522d 100644 --- a/include/Rendering/CCamera.h +++ b/include/Rendering/CCamera.h @@ -30,14 +30,9 @@ namespace Components struct Camera : Component { - Camera() - : FOV(glm::radians(45.f)) - , NearClip(0.1f) - , FarClip(100.f) { } - - float FOV; - float NearClip; - float FarClip; + float FOV = glm::radians(45.f); + float NearClip = 0.01f; + float FarClip = 100.f; }; } diff --git a/include/Rendering/OpenGL/Rendering/Renderer.h b/include/Rendering/OpenGL/Rendering/Renderer.h index c806d0e..93a383e 100755 --- a/include/Rendering/OpenGL/Rendering/Renderer.h +++ b/include/Rendering/OpenGL/Rendering/Renderer.h @@ -43,7 +43,6 @@ class Renderer : public BaseRenderer public: void Initialize() override; void Draw(RenderQueueCollection& rq) override; - void PlaceCamera(glm::vec3 position); private: int m_GLVersion[2]; @@ -97,12 +96,6 @@ private: void DrawWater(RenderQueue &objects); void DrawGUI(RenderQueue& rq); void DebugKeys(); - - dd::EventRelay m_EScreenShake; - bool OnScreenShake(dd::Events::ScreenShake &event); - bool m_ScreenShake = false; - float m_ShakeIntensity = 0; - float m_ShakeTimer = 0; }; } diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index be38ca1..ff3bb8c 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -27,6 +27,15 @@ void dd::Systems::LevelSystem::Initialize() m_GodMode = ResourceManager::Load("Config.ini")->GetValue("Cheat.GodMode", false); + // Camera + { + auto ent = m_World->CreateEntity(); + auto transform = m_World->AddComponent(ent); + auto camera = m_World->AddComponent(ent); + camera->FOV = glm::radians(58.31f); + m_World->CommitEntity(ent); + } + //PointLightTest { auto t_Light = m_World->CreateEntity(); @@ -132,8 +141,8 @@ void dd::Systems::LevelSystem::Initialize() auto wall = m_World->AddComponent(BottomWall); transform->Position = glm::vec3(0.f, -6.f, -10.f); transform->Scale = glm::vec3(20.f, 0.5f, 1.f); - std::shared_ptr sprite = m_World->AddComponent(BottomWall); - sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + //std::shared_ptr sprite = m_World->AddComponent(BottomWall); + //sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; std::shared_ptr rectangleShape = m_World->AddComponent(BottomWall); rectangleShape->Dimensions = glm::vec2(20.f, 0.5f); std::shared_ptr physics = m_World->AddComponent(BottomWall); diff --git a/src/game/Rendering/OpenGL/Renderer.cpp b/src/game/Rendering/OpenGL/Renderer.cpp index 063d281..2e897b2 100644 --- a/src/game/Rendering/OpenGL/Renderer.cpp +++ b/src/game/Rendering/OpenGL/Renderer.cpp @@ -63,7 +63,7 @@ void dd::Renderer::Initialize() } // Create default camera - m_DefaultCamera = std::unique_ptr(new dd::Camera((float)m_Resolution.Width / m_Resolution.Height, 45.f, 0.01f, 5000.f)); + m_DefaultCamera = std::unique_ptr(new dd::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f)); m_DefaultCamera->SetPosition(glm::vec3(0, 0, 0)); if (m_Camera == nullptr) { m_Camera = m_DefaultCamera.get(); @@ -391,11 +391,6 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) DrawWater(objects); } -void dd::Renderer::PlaceCamera(glm::vec3 position) -{ - m_DefaultCamera->SetPosition(position); -} - void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) { GLuint shaderProgramHandle = program;