diff --git a/assets b/assets index fe035e7..d5991da 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit fe035e74bd086cfa924003349711f31133337812 +Subproject commit d5991da346f2ee33353c74c243c2b2d72336c9ed diff --git a/src/EventBroker.h b/src/EventBroker.h index e29437a..5daa273 100644 --- a/src/EventBroker.h +++ b/src/EventBroker.h @@ -139,11 +139,7 @@ template void EventBroker::UnsubscribeAll() { const std::string contextTypeName = typeid(ContextType).name(); - auto contextIt = m_ContextRelays.find(contextTypeName); - if (contextIt != m_ContextRelays.end()) - { - m_ContextRelays.erase(contextIt); - } + m_ContextRelays.erase(contextTypeName); } #endif // MessageRelay_h__ diff --git a/src/GUI/Frame.h b/src/GUI/Frame.h index e502fea..2e01b48 100644 --- a/src/GUI/Frame.h +++ b/src/GUI/Frame.h @@ -33,14 +33,14 @@ public: , m_Name("UIParent") , m_Layer(0) , m_Hidden(false) - { } + { Initialize(); } // Create a frame as a child Frame(Frame* parent, std::string name) : m_Name(name) , m_Layer(0) , m_Hidden(false) - { SetParent(std::shared_ptr(parent)); } + { SetParent(std::shared_ptr(parent)); Initialize(); } ::RenderQueue RenderQueue; @@ -89,7 +89,10 @@ public: } int Right() const override { - return Left() + Width; + if (m_Parent) + return std::min(m_Parent->Right(), Left() + Width); + else + return Left() + Width; } int Top() const override { @@ -100,14 +103,26 @@ public: } int Bottom() const override { - return Top() + Height; + if (m_Parent) + return std::min(m_Parent->Bottom(), Top() + Height); + else + return Top() + Height; } Rectangle AbsoluteRectangle() { - return Rectangle(Left(), Top(), Width, Height); + int left = Left(); + int top = Top(); + int width = Right() - left; + int height = Bottom() - top; + return Rectangle(left, top, width, height); } + virtual bool OnKeyDown(const Events::KeyDown &event) { return false; } + virtual bool OnKeyUp(const Events::KeyUp &event) { return false; } + //virtual bool OnMouseDown(const Events::KeyDown &event) { } + //virtual bool OnMouseUp(const Events::KeyDown &event) { } + void UpdateLayered(double dt) { if (this->Hidden()) @@ -137,7 +152,7 @@ public: return; // Draw ourselves - renderer->SetViewport(AbsoluteRectangle()); + renderer->SetScissor(AbsoluteRectangle()); this->Draw(renderer); // Draw children @@ -150,7 +165,7 @@ public: if (child->Hidden()) continue; Rectangle rect = child->AbsoluteRectangle(); - renderer->SetViewport(rect); + renderer->SetScissor(rect); child->Draw(renderer); } } @@ -170,6 +185,15 @@ protected: typedef std::multimap> Children_t; // name -> frame std::map m_Children; // layer -> Children_t +private: + EventRelay m_EKeyDown; + EventRelay m_EKeyUp; + + void Initialize() + { + EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &Frame::OnKeyDown); + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &Frame::OnKeyUp); + } }; } diff --git a/src/GUI/GameFrame.h b/src/GUI/GameFrame.h index 19f66ac..a599fcb 100644 --- a/src/GUI/GameFrame.h +++ b/src/GUI/GameFrame.h @@ -6,6 +6,7 @@ #include "GUI/Viewport.h" #include "GUI/TextureFrame.h" #include "GUI/PlayerHUD.h" +#include "VehicleSelection.h" #include "GameWorld.h" @@ -26,7 +27,8 @@ public: vp1 = new Viewport(worldFrame, "Viewport1", m_World); vp1->X = 0; vp1->Width = 640; - new PlayerHUD(vp1, "PlayerHUD", m_World, 1); + //new PlayerHUD(vp1, "PlayerHUD", m_World, 1); + new VehicleSelection(vp1, "VehicleSelection", m_World, 1); vp2 = new Viewport(worldFrame, "Viewport2", m_World); vp2->X = vp1->Right(); diff --git a/src/GUI/PlayerHUD.h b/src/GUI/PlayerHUD.h index b094d4c..7ea4dda 100644 --- a/src/GUI/PlayerHUD.h +++ b/src/GUI/PlayerHUD.h @@ -1,9 +1,9 @@ -#include "GUI/Frame.h" -#include "GUI/HealthOverlay.h" - #ifndef GUI_PlayerHUD_h__ #define GUI_PlayerHUD_h__ +#include "GUI/Frame.h" +#include "GUI/HealthOverlay.h" + namespace GUI { diff --git a/src/GUI/TextureFrame.h b/src/GUI/TextureFrame.h index 6018478..f15dfd8 100644 --- a/src/GUI/TextureFrame.h +++ b/src/GUI/TextureFrame.h @@ -13,7 +13,10 @@ public: TextureFrame(Frame* parent, std::string name) : Frame(parent, name) , m_Texture(nullptr) + , m_FadeTexture(nullptr) , m_Color(glm::vec4(1.f, 1.f, 1.f, 1.f)) + , m_FadeDuration(0.f) + , m_CurrentFade(1.f) { } void Draw(std::shared_ptr renderer) override @@ -22,13 +25,28 @@ public: return; RenderQueue.Clear(); - SpriteJob job; - job.TextureID = m_Texture->ResourceID; - job.Texture = *m_Texture; - job.Color = m_Color; - RenderQueue.Add(job); + + // Main texture + { + SpriteJob job; + job.TextureID = m_Texture->ResourceID; + job.Texture = *m_Texture; + job.Color = glm::vec4(m_Color.r, m_Color.g, m_Color.b, m_Color.a * m_CurrentFade); + RenderQueue.Add(job); + } + + // Texture while fading + if (m_FadeTexture && m_CurrentFade < 1) + { + SpriteJob job; + job.TextureID = m_FadeTexture->ResourceID; + job.Texture = *m_FadeTexture; + job.Color = glm::vec4(m_Color.r, m_Color.g, m_Color.b, m_Color.a); + RenderQueue.Add(job); + } renderer->SetCamera(nullptr); + renderer->SetViewport(Rectangle(Left(), Top(), Width, Height)); renderer->DrawFrame(RenderQueue); } @@ -38,12 +56,37 @@ public: m_Texture = ResourceManager->Load<::Texture>("Texture", resourceName); } + void FadeToTexture(std::string resourceName, double duration) + { + m_FadeTexture = m_Texture; + SetTexture(resourceName); + m_FadeDuration = duration; + m_CurrentFade = 0.f; + } + + void Update(double dt) override + { + if (m_CurrentFade < 1) + { + m_CurrentFade += dt / m_FadeDuration; + if (m_CurrentFade > 1) + { + m_FadeTexture = nullptr; + m_CurrentFade = 1; + m_FadeDuration = 0; + } + } + } + glm::vec4 Color() const { return m_Color; } void SetColor(glm::vec4 val) { m_Color = val; } protected: ::Texture* m_Texture; + ::Texture* m_FadeTexture; glm::vec4 m_Color; + float m_FadeDuration; + float m_CurrentFade; }; diff --git a/src/GUI/VehicleSelection.h b/src/GUI/VehicleSelection.h new file mode 100644 index 0000000..bc13c92 --- /dev/null +++ b/src/GUI/VehicleSelection.h @@ -0,0 +1,106 @@ +#ifndef GUI_VehicleSelection_h__ +#define GUI_VehicleSelection_h__ + +#include "GUI/Frame.h" +#include "GUI/HealthOverlay.h" + +namespace GUI +{ + + class VehicleSelection : public Frame + { + public: + VehicleSelection(Frame* parent, std::string name, std::shared_ptr world, int playerID) + : Frame(parent, name) + , m_World(world) + , m_PlayerID(playerID) + { + m_CurrentSelection = 0; + + m_CurrentCoordinate = -m_SelectionCoordinates[0] + glm::vec2(Width / 2.f, Height / 2.f); + m_TargetCoordinate = m_CurrentCoordinate; + m_CurrentSize = m_SelectionSizes[0]; + m_TargetSize = m_CurrentSize; + m_CurrentAlpha = 0.f; + + m_Background = new TextureFrame(this, "VehicleSelectImage1"); + m_Background->X = m_CurrentCoordinate.x; + m_Background->Y = m_CurrentCoordinate.y; + m_Background->Width = m_CurrentSize.x; + m_Background->Height = m_CurrentSize.y; + m_Background->SetTexture("Textures/GUI/VehicleSelection/1.png"); + } + + bool OnKeyUp(const Events::KeyUp &event) override + { + if (event.KeyCode == GLFW_KEY_LEFT) + { + m_CurrentSelection--; + } + else if (event.KeyCode == GLFW_KEY_RIGHT) + { + m_CurrentSelection++; + } + m_CurrentSelection = (m_CurrentSelection < 0) ? 0 : ((m_CurrentSelection > 3) ? 3 : m_CurrentSelection); + + std::stringstream ss; + ss << "Textures/GUI/VehicleSelection/" << m_CurrentSelection + 1 << ".png"; + m_Background->FadeToTexture(ss.str(), 1.f); + glm::vec2 coord = -m_SelectionCoordinates[m_CurrentSelection]; + m_TargetCoordinate = coord + glm::vec2(Width / 2.f, Height / 2.f); + + glm::vec2 size = m_SelectionSizes[m_CurrentSelection]; + m_TargetSize = size; + + return true; + } + + void Update(double dt) override + { + glm::vec2 posDiff = m_TargetCoordinate - m_CurrentCoordinate; + m_CurrentCoordinate += posDiff * 2.f * (float)dt; + + glm::vec2 sizeDiff = m_TargetSize - m_CurrentSize; + m_CurrentSize += sizeDiff * 3.f * (float)dt; + + m_CurrentAlpha += (1 - m_CurrentAlpha) * 3.f * (float)dt; + + m_Background->X = m_CurrentCoordinate.x; + m_Background->Y = m_CurrentCoordinate.y; + m_Background->Width = m_CurrentSize.x; + m_Background->Height = m_CurrentSize.y; + } + + protected: + std::shared_ptr m_World; + int m_PlayerID; + int m_CurrentSelection; + static glm::vec2 m_SelectionCoordinates[4]; + static glm::vec2 m_SelectionSizes[4]; + + glm::vec2 m_CurrentCoordinate; + glm::vec2 m_TargetCoordinate; + glm::vec2 m_CurrentSize; + glm::vec2 m_TargetSize; + float m_CurrentAlpha; + + TextureFrame* m_Background; + }; + + glm::vec2 VehicleSelection::m_SelectionCoordinates[4] = { + glm::vec2(339, 506), + glm::vec2(639, 377), + glm::vec2(1249, 399), + glm::vec2(1535, 628) + }; + + glm::vec2 VehicleSelection::m_SelectionSizes[4] = { + glm::vec2(1632, 918), + glm::vec2(1793, 1009), + glm::vec2(1793, 1009), + glm::vec2(1854, 1043) + }; + +} + +#endif // GUI_VehicleSelection_h__ diff --git a/src/GUI/Viewport.h b/src/GUI/Viewport.h index 88af865..44c8e81 100644 --- a/src/GUI/Viewport.h +++ b/src/GUI/Viewport.h @@ -65,6 +65,7 @@ public: return; renderer->SetCamera(m_Camera); + renderer->SetViewport(AbsoluteRectangle()); renderer->DrawWorld(m_Parent->RenderQueue); } diff --git a/src/Renderer.cpp b/src/Renderer.cpp index 4769312..d82d851 100755 --- a/src/Renderer.cpp +++ b/src/Renderer.cpp @@ -260,7 +260,7 @@ void Renderer::DrawFrame(RenderQueue &rq) { glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height); - glScissor(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height); + glScissor(m_Scissor.X, m_Height - m_Scissor.Y - m_Scissor.Height, m_Scissor.Width, m_Scissor.Height); //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glClearColor(0.0f, 0.5f, 0.0f, 1.0f); @@ -364,7 +364,7 @@ void Renderer::DrawWorld(RenderQueue &rq) */ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbBasePass); glViewport(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height); - glScissor(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height); + glScissor(m_Scissor.X, m_Height - m_Scissor.Y - m_Scissor.Height, m_Scissor.Width, m_Scissor.Height); //glViewport(0, 0, m_Width, m_Height); // Clear G-buffer diff --git a/src/Renderer.h b/src/Renderer.h index ecdecfc..4f76f3a 100755 --- a/src/Renderer.h +++ b/src/Renderer.h @@ -48,6 +48,11 @@ public: m_Viewport = viewport; } + void SetScissor(const Rectangle &scissor) + { + m_Scissor = scissor; + } + void SetCamera(std::shared_ptr camera) { m_Camera = camera; @@ -109,6 +114,7 @@ private: std::unordered_map> m_Cameras; Rectangle m_Viewport; + Rectangle m_Scissor; std::shared_ptr m_Camera; struct Light diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 137e26e..5cf01a5 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -198,6 +198,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index 7238a0e..b45e724 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -482,6 +482,9 @@ Physics\Systems + + GUI +