From 8bf10d4517c3f259041398f75848a8c828604d76 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Thu, 24 Sep 2015 18:58:34 +0200 Subject: [PATCH 01/18] Removed Stage Reset and Life Display. --- include/Game/LevelSystem.h | 3 +++ src/game/Game/LevelSystem.cpp | 45 +++++++++++++++++++---------------- src/game/Game/PadSystem.cpp | 2 +- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index f7f9170..68ceb0d 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -104,6 +104,8 @@ public: void SetEdgeX(const float& edgeX) { m_EdgeX = edgeX; } float& EdgeY() { return m_EdgeY; } void SetEdgeY(const float& edgeY) { m_EdgeY = edgeY; } + float& NotResettingTheStage() { return m_NotResettingTheStage; } + void SetNotResettingTheStage(const float& notResettingTheStage) { m_NotResettingTheStage = notResettingTheStage; } private: bool m_Restarting = false; @@ -120,6 +122,7 @@ private: glm::vec2 m_SpaceBetweenBricks = glm::vec2(1, 0.4); float m_EdgeX = 3.2f; float m_EdgeY = 5.2f; + float m_NotResettingTheStage = 5.f; dd::EventRelay m_EContact; dd::EventRelay m_ELifeLost; diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index b4f5d7d..b7436cd 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -26,7 +26,7 @@ void dd::Systems::LevelSystem::Initialize() void dd::Systems::LevelSystem::CreateLife(int number) { - auto life = m_World->CreateEntity(); + /*auto life = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(life); transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); @@ -38,7 +38,7 @@ void dd::Systems::LevelSystem::CreateLife(int number) model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - m_World->CommitEntity(life); + m_World->CommitEntity(life);*/ } void dd::Systems::LevelSystem::Update(double dt) @@ -59,6 +59,7 @@ void dd::Systems::LevelSystem::Update(double dt) void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { auto ball = m_World->GetComponent(entity); + SetNotResettingTheStage(NotResettingTheStage() + 0.01 * dt); if (ball != nullptr) { auto transformBall = m_World->GetComponent(entity); @@ -104,27 +105,30 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID } if (Lives() != PastLives()) { - auto life = m_World->GetComponent(entity); + /*auto life = m_World->GetComponent(entity); if (life != nullptr) { if (life->Number + 1 == PastLives()) { - m_World->RemoveComponent(entity); + /*m_World->RemoveComponent(entity); m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); + m_World->RemoveEntity(entity);*/ SetPastLives(Lives()); - } - } + // } + //} } if (NumberOfBricks() <= 0) { /*SetRestarting(true); if (MultiBalls() <= 0 && PowerUps() <= 0) { - Events::ResetBall e; - EventBroker->Publish(e); - Events::ScoreEvent es; - es.Score = 500; - EventBroker->Publish(es); - Events::StageCleared ec; - EventBroker->Publish(ec); - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); + if (NotResettingTheStage() > 5) { + Events::ResetBall e; + EventBroker->Publish(e); + Events::ScoreEvent es; + es.Score = 500; + EventBroker->Publish(es); + Events::StageCleared ec; + EventBroker->Publish(ec); + SetNotResettingTheStage(0); + CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); + } } else { if (ball != nullptr && MultiBalls() > 0) { SetMultiBalls(MultiBalls() - 1); @@ -150,7 +154,7 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 spacesBetweenBricks, float spaceToEdge) { SetNumberOfBricks(rows * lines); - std::cout << "You're only doing this once, right?" << std::endl; + //std::cout << "You're only doing this once, right?" << std::endl; int num = 0; for (int i = 0; i < rows; i++) { num++; @@ -180,7 +184,7 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe fileName.append(".png"); //sprite->SpriteFile = fileName; model->ModelFile = "Models/Test/Brick/Brick.obj"; - if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 6 && row == 6)) { + if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 5 && row == 2)) { std::shared_ptr cPow = m_World->AddComponent(brick); } float x = line * spacesBetweenBricks.x; @@ -251,7 +255,7 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) } auto power = m_World->GetComponent(entityBrick); - if (power != nullptr) { + if (power != nullptr && NumberOfBricks() > 1) { Events::CreatePowerUp e; auto transform = m_World->GetComponent(entityBrick); e.Position = transform->Position; @@ -267,15 +271,16 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) m_World->RemoveComponent(entityBrick); m_World->RemoveEntity(entityBrick); + SetNumberOfBricks(NumberOfBricks() - 1); if (NumberOfBricks() <= 0) { - SetMultiBalls(MultiBalls() + 1); + //SetMultiBalls(MultiBalls() + 1); } Events::ScoreEvent es; es.Score = brick->Score; EventBroker->Publish(es); - std::cout << NumberOfBricks() << std::endl; + //std::cout << NumberOfBricks() << std::endl; //std::cout << "Score: " << Score() << std::endl; } diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 3c74624..7fe22fa 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -282,7 +282,7 @@ bool dd::Systems::PadSystem::OnMultiBall(const dd::Events::MultiBall &event) bool dd::Systems::PadSystem::OnStageCleared(const dd::Events::StageCleared &event) { - auto entity = CreateBall(); + //auto entity = CreateBall(); return true; } From fc41727a5dcb95e347d779d330878911fa35dc20 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Mon, 28 Sep 2015 17:24:58 +0200 Subject: [PATCH 02/18] Transferred Ball-stuff into BallSystem. --- include/Core/Engine.h.orig | 562 ------------------------ include/Game/BallSystem.h | 43 +- include/Game/EMultiBallLost.h | 26 ++ include/Game/LevelSystem.h | 17 +- include/Game/PadSystem.h | 13 +- include/Physics/PhysicsSystem.h.orig | 149 ------- src/game/CMakeLists.txt | 2 +- src/game/Game/BallSystem.cpp | 144 +++++- src/game/Game/LevelSystem.cpp | 92 +--- src/game/Game/LevelSystem.cpp.orig | 372 ---------------- src/game/Game/PadSystem.cpp | 81 +--- src/game/Game/PadSystem.cpp.orig | 313 ------------- src/game/Physics/PhysicsSystem.cpp.orig | 363 --------------- 13 files changed, 238 insertions(+), 1939 deletions(-) delete mode 100644 include/Core/Engine.h.orig create mode 100644 include/Game/EMultiBallLost.h delete mode 100755 include/Physics/PhysicsSystem.h.orig delete mode 100644 src/game/Game/LevelSystem.cpp.orig delete mode 100755 src/game/Game/PadSystem.cpp.orig delete mode 100755 src/game/Physics/PhysicsSystem.cpp.orig diff --git a/include/Core/Engine.h.orig b/include/Core/Engine.h.orig deleted file mode 100644 index f19102e..0000000 --- a/include/Core/Engine.h.orig +++ /dev/null @@ -1,562 +0,0 @@ -/* - This file is part of Daydream Engine. - Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung - - Daydream Engine is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Daydream Engine is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with Daydream Engine. If not, see . -*/ - -#include -#include -#include - -#include "ResourceManager.h" -#include "OBJ.h" -#include "Model.h" -#include "Texture.h" -#include "EventBroker.h" -#include "RenderQueue.h" -#include "Renderer.h" -#include "InputManager.h" -//TODO: Remove includes that are only here for the temporary draw solution. -#include "World.h" -#include "CTransform.h" -#include "Core/EventBroker.h" -#include "Rendering/CModel.h" -#include "Rendering/CSprite.h" -#include "CTemplate.h" -#include "Rendering/CPointLight.h" -#include "Transform/TransformSystem.h" -#include "Sound/SoundSystem.h" -#include "Sound/CCollisionSound.h" -#include "Game/LevelSystem.h" -#include "Game/PadSystem.h" -#include "Game/CBall.h" -#include "Game/CPad.h" -#include "Game/CBrick.h" -#include "Game/BallSystem.h" -#include "Game/Bricks/CPowerUpBrick.h" - -#include "Physics/PhysicsSystem.h" -#include "Physics/CPhysics.h" -#include "Physics/CRectangleShape.h" -#include "Physics/ESetImpulse.h" -#include "Physics/CWaterVolume.h" - -#include "Game/EGameStart.h" -#include "Sound/EPlaySound.h" - -#include "GUI/Frame.h" -#include "GUI/Button.h" -#include "Game/MainMenu.h" -#include "Game/HUD.h" - -namespace dd -{ - -class Engine -{ - -public: - Engine(int argc, char* argv[]) { - m_EventBroker = std::make_shared(); - - m_Renderer = std::make_shared(); - m_Renderer->SetFullscreen(false); - //m_Renderer->SetResolution(Rectangle(0, 0, 1920, 1080)); - m_Renderer->SetResolution(Rectangle(0, 0, 675, 1080)); - m_Renderer->Initialize(); - - m_FrameStack = new GUI::Frame(m_EventBroker.get()); - m_FrameStack->Width = 675; - m_FrameStack->Height = 1080; - auto hud = new GUI::HUD(m_FrameStack, "HUD"); - auto menu = new GUI::MainMenu(m_FrameStack, "MainMenu"); - - m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); - - m_World = std::make_shared(m_EventBroker); - - //TODO: Move this out of engine.h - m_World->ComponentFactory.Register(); - m_World->SystemFactory.Register( - [this]() { return new Systems::TransformSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - - m_World->ComponentFactory.Register(); - m_World->SystemFactory.Register( - [this]() { return new Systems::SoundSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - - m_World->ComponentFactory.Register(); - - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - - m_World->SystemFactory.Register( - [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - - m_World->SystemFactory.Register( - [this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - m_World->SystemFactory.Register( - [this]() { return new Systems::PadSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - m_World->SystemFactory.Register( - [this]() { return new Systems::BallSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->Initialize(); - - - //OctoBall - { - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(-0.f, 0.26f, -9.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - transform->Velocity = glm::vec3(0.0f, -10.f, 0.f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr ball = m_World->AddComponent(ent); - ball->Speed = 5.f; -<<<<<<< HEAD - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Ball; - physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; - physics->Calculate = true; -======= - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; ->>>>>>> origin/master - - auto plight = m_World->AddComponent(ent); - plight->Radius = 2.f; - - m_World->CommitEntity(ent); - } - - //PointLightTest - { - auto t_Light = m_World->CreateEntity(); - auto transform = m_World->AddComponent(t_Light); - transform->Position = glm::vec3(2.f, 1.5f, -9.f); - auto pl = m_World->AddComponent(t_Light); - pl->Radius = 8.f; - m_World->CommitEntity(t_Light); - } - - //Halfpipe background test model. - { - auto t_halfPipe = m_World->CreateEntity(); - auto transform = m_World->AddComponent(t_halfPipe); - transform->Position = glm::vec3(0.f, 0.f, -15.f); - transform->Scale = glm::vec3(15.f); - auto model = m_World->AddComponent(t_halfPipe); - model->ModelFile = "Models/Test/halfpipe/Halfpipe.obj"; - model->Color = glm::vec4(1.f, 1.f, 1.f, 0.3f); - m_World->CommitEntity(t_halfPipe); - } - - //Background - { - auto background = m_World->CreateEntity(); - auto transform = m_World->AddComponent(background); - transform->Position = glm::vec3(0.f, 0.f, -30.f); - transform->Scale = glm::vec3(2681.f / 50.f, 1080.f / 50.f, 1.f); - auto sprite = m_World->AddComponent(background); - sprite->SpriteFile = "Textures/Background.png"; - m_World->CommitEntity(background); - } - - //Water test - { - auto t_waterBody = m_World->CreateEntity(); - auto transform = m_World->AddComponent(t_waterBody); - transform->Position = glm::vec3(0.f, -4.5f, -10.f); - transform->Scale = glm::vec3(7.f, 1.5f, 1.f); - auto water = m_World->AddComponent(t_waterBody); - auto body = m_World->AddComponent(t_waterBody); - m_World->CommitEntity(t_waterBody); - } - //TODO: Why does the ball not collide with these bricks? - //BottomBox - { - auto topWall = m_World->CreateEntity(); - auto transform = m_World->AddComponent(topWall); - transform->Position = glm::vec3(0.f, -6.f, -9.9f); - transform->Scale = glm::vec3(10.f, 0.5f, 1.f); - std::shared_ptr sprite = m_World->AddComponent(topWall); - sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - std::shared_ptr boxShape = m_World->AddComponent( - topWall); - std::shared_ptr physics = m_World->AddComponent(topWall); - physics->Static = true; - m_World->CommitEntity(topWall); - } - //SideBox -// { -// auto topWall = m_World->CreateEntity(); -// std::shared_ptr transform = m_World->AddComponent(topWall); -// transform->Position = glm::vec3(3.f, -3.0f, -9.9f); -// transform->Scale = glm::vec3(0.5f, 3.f, 1.f); -// std::shared_ptr sprite = m_World->AddComponent(topWall); -// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; -// std::shared_ptr boxShape = m_World->AddComponent( -// topWall); -// std::shared_ptr physics = m_World->AddComponent(topWall); -// physics->Static = true; -// m_World->CommitEntity(topWall); -// } -// //OtherSideBox -// { -// auto topWall = m_World->CreateEntity(); -// std::shared_ptr transform = m_World->AddComponent(topWall); -// transform->Position = glm::vec3(-4.f, -3.0f, -9.9f); -// transform->Scale = glm::vec3(0.5f, 3.0f, 1.f); -// std::shared_ptr sprite = m_World->AddComponent(topWall); -// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; -// std::shared_ptr boxShape = m_World->AddComponent( -// topWall); -// std::shared_ptr physics = m_World->AddComponent(topWall); -// physics->Static = true; -// m_World->CommitEntity(topWall); -// } - - { - auto topWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent( - topWall); - 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(topWall); - sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - - std::shared_ptr boxShape = m_World->AddComponent( - topWall); - - std::shared_ptr physics = m_World->AddComponent(topWall); - physics->Static = true; - physics->Category = CollisionLayer::Type::Wall; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; - - m_World->CommitEntity(topWall); - } - - { - auto leftWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent( - leftWall); - transform->Position = glm::vec3(-4.f, 1.f, -10.f); - transform->Scale = glm::vec3(0.5f, 20.f, 1.f); - - std::shared_ptr sprite = m_World->AddComponent(leftWall); - sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - - std::shared_ptr boxShape = m_World->AddComponent( - leftWall); - - std::shared_ptr physics = m_World->AddComponent(leftWall); - physics->Static = true; - physics->Category = CollisionLayer::Type::Wall; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; - - m_World->CommitEntity(leftWall); - } - - { - auto rightWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent( - rightWall); - transform->Position = glm::vec3(4.f, 1.f, -10.f); - transform->Scale = glm::vec3(0.5f, 20.f, 1.f); - - std::shared_ptr sprite = m_World->AddComponent(rightWall); - sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - - std::shared_ptr boxShape = m_World->AddComponent( - rightWall); - - std::shared_ptr physics = m_World->AddComponent(rightWall); - physics->Static = true; - physics->Category = CollisionLayer::Type::Wall; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; - - m_World->CommitEntity(rightWall); - } - - { - auto ent = m_World->CreateEntity(); - m_World->SetProperty(ent, "Name", "Pad"); - auto ctransform = m_World->AddComponent(ent); - ctransform->Position = glm::vec3(0.f, -5.f, -10.f); - ctransform->Scale = glm::vec3(1.0f, 1.0f, 1.f); - auto rectangle = m_World->AddComponent(ent); - auto physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Pad; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::PowerUp; - physics->Calculate = true; - auto cModel = m_World->AddComponent(ent); - cModel->ModelFile = "Models/Submarine2.obj"; - - auto pad = m_World->AddComponent(ent); - m_World->CommitEntity(ent); - } - - - //EVENT_SUBSCRIBE_MEMBER(m_EGameStart, &Engine::OnGameStart); - m_EGameStart = decltype(m_EGameStart)(std::bind(&Engine::OnGameStart, this, std::placeholders::_1)); - m_EventBroker->Subscribe(m_EGameStart); - - m_LastTime = glfwGetTime(); - } - - bool Running() const { return !glfwWindowShouldClose(m_Renderer->Window()); } - - void Tick() - { - double currentTime = glfwGetTime(); - double dt = currentTime - m_LastTime; - m_LastTime = currentTime; - - // Update input - m_InputManager->Update(dt); - // Swap event queues to get fresh input data in the read queue - //m_EventBroker->Swap(); - - ResourceManager::Update(); - if (m_GameIsRunning) { - m_World->Update(dt); - } - m_EventBroker->Process(); - m_FrameStack->UpdateLayered(dt); - - m_RendererQueue.Clear(); - m_FrameStack->DrawLayered(m_RendererQueue); - //TODO Fill up the renderQueue with models (Temp fix) - if (m_GameIsRunning) { - TEMPAddToRenderQueue(); - } - - // Render scene - //TODO send renderqueue to draw. - m_Renderer->Draw(m_RendererQueue); - - m_EventBroker->Process(); - // Swap event queues - m_EventBroker->Swap(); - - glfwPollEvents(); - } - - std::shared_ptr m_TransformSystem; - std::shared_ptr m_LevelSystem; - - //TODO: Get this out of engine.h - void TEMPAddToRenderQueue() - { - if (!m_TransformSystem) - m_TransformSystem = m_World->GetSystem(); - - for (auto &pair : *m_World->GetEntities()) - { - EntityID entity = pair.first; - - auto templateComponent = m_World->GetComponent(entity); - if (templateComponent) - continue; - - auto transform = m_World->GetComponent(entity); - if (!transform) - continue; - - auto modelComponent = m_World->GetComponent(entity); - if (modelComponent) - { - Model* modelAsset = nullptr; - modelAsset = ResourceManager::Load(modelComponent->ModelFile); - - if (modelAsset) - { - Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); - glm::mat4 modelMatrix = glm::translate(glm::mat4(), absoluteTransform.Position) - * glm::toMat4(absoluteTransform.Orientation) - * glm::scale(absoluteTransform.Scale); - EnqueueModel(modelAsset, modelMatrix, modelComponent->Transparent, modelComponent->Color, modelComponent->ModelFile); - } - } - - auto pointLightComponent = m_World->GetComponent(entity); - if (pointLightComponent) - { - Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); - EnqueuePointLight(absoluteTransform.Position, - pointLightComponent->Diffuse, - pointLightComponent->Specular, - pointLightComponent->Radius); - } - - auto parent = m_World->GetEntityParent(entity); - if(parent != 0) { - auto waterParticleComponent = m_World->GetComponent(parent); - if (waterParticleComponent) { - //TODO: Remove hardcoded color. - //TODO: Do i even need modelMatrix? - Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); - glm::mat4 modelMatrix = glm::translate(absoluteTransform.Position) - * glm::scale(absoluteTransform.Scale); - EnqueueWaterParticles(absoluteTransform.Position, glm::vec4(1.f, 1.f, 1.f, 1.f), modelMatrix, absoluteTransform.Position.z); - } - } - - - auto spriteComponent = m_World->GetComponent(entity); - if (spriteComponent) - { - - std::string normal = spriteComponent->NormalTexture; - std::string spec = spriteComponent->SpecularTexture; - - if (normal.empty()) { - normal = "Textures/Core/NeutralNormalMap.png"; - } - if (spec.empty()) { - spec = "Textures/Core/NeutralSpecularMap.png"; - } - auto texturediff = ResourceManager::Load(spriteComponent->SpriteFile); - auto texturenorm = ResourceManager::Load(normal); - auto texturespec = ResourceManager::Load(spec); - - - Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); - glm::quat orientation2D = glm::angleAxis(glm::eulerAngles(absoluteTransform.Orientation).z, glm::vec3(0, 0, -1)); - glm::mat4 modelMatrix = glm::translate(absoluteTransform.Position) - * glm::toMat4(orientation2D) - * glm::scale(absoluteTransform.Scale); - EnqueueSprite(texturediff, texturenorm, texturespec, modelMatrix, spriteComponent->Color, absoluteTransform.Position.z); - } - } - - } - - //TODO: Get this out of engine.h - void EnqueueModel(Model* model, glm::mat4 modelMatrix, float transparent, glm::vec4 color, std::string fileName) - { - for (auto texGroup : model->TextureGroups) - { - ModelJob job; - job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; - job.DiffuseTexture = (texGroup.Texture) ? *texGroup.Texture : 0; - job.NormalTexture = (texGroup.NormalMap) ? *texGroup.NormalMap : 0; - job.SpecularTexture = (texGroup.SpecularMap) ? *texGroup.SpecularMap : 0; - job.VAO = model->VAO; - job.ElementBuffer = model->ElementBuffer; - job.StartIndex = texGroup.StartIndex; - job.EndIndex = texGroup.EndIndex; - job.ModelMatrix = modelMatrix; - job.Color = color; - - m_RendererQueue.Deferred.Add(job); - } - } - - // TODO: Get this out of engine.h - void EnqueueSprite(Texture* texture, Texture* normalTexture, Texture* specularTexture, glm::mat4 modelMatrix, glm::vec4 color, float depth) - { - SpriteJob job; - job.TextureID = texture->ResourceID; - job.DiffuseTexture = *texture; - job.NormalTexture = *normalTexture; - job.SpecularTexture = *specularTexture; - job.ModelMatrix = modelMatrix; - job.Color = color; - job.Depth = depth; - - - m_RendererQueue.Forward.Add(job); - } - - void EnqueuePointLight(glm::vec3 position, glm::vec3 diffuseColor, glm::vec3 specularColor, float radius) - { - PointLightJob job; - job.Position = position; - job.DiffuseColor = diffuseColor; - job.SpecularColor = specularColor; - job.Radius = radius; - - m_RendererQueue.Lights.Add(job); - - } - - void EnqueueWaterParticles(glm::vec3 position, glm::vec4 color, glm::mat4 modelMatrix, float depth) - { - WaterParticleJob job; - job.Position = position; - job.Color = color; - job.ModelMatrix = modelMatrix; - job.Depth = depth; - - m_RendererQueue.Forward.Add(job); - } - -private: - std::shared_ptr m_EventBroker; - GUI::Frame* m_FrameStack = nullptr; - std::shared_ptr m_Renderer; - RenderQueueCollection m_RendererQueue; - std::shared_ptr m_InputManager; - std::shared_ptr m_World; - - //TODO: Redo - bool m_GameIsRunning = false; - dd::EventRelay m_EGameStart; - bool OnGameStart(const dd::Events::GameStart &event) - { - m_GameIsRunning = true; - //Todo: Move this - { - dd::Events::PlaySound e; - e.path = "Sounds/BGM/under-the-sea-instrumental.wav"; - e.isAmbient = true; - m_EventBroker->Publish(e); - } - { - dd::Events::PlaySound e; - e.path = "Sounds/BGM/water-flowing.wav"; - e.volume = 0.3f; - e.isAmbient = true; - m_EventBroker->Publish(e); - } - }; - double m_LastTime; -}; - -} diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index 1069ede..e838076 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -5,9 +5,17 @@ #include "Core/World.h" #include "Core/EventBroker.h" #include "Core/CTransform.h" +#include "Physics/CPhysics.h" +#include "Physics/CCircleShape.h" #include "Physics/EContact.h" +#include "Rendering/CModel.h" #include "Game/CBall.h" #include "Game/CPowerUp.h" +#include "Game/ELifeLost.h" +#include "Game/EResetBall.h" +#include "Game/EMultiBall.h" +#include "Game/EMultiBallLost.h" +#include "Game/EGameOver.h" namespace dd { @@ -39,8 +47,41 @@ public: // Called when an entity is removed void OnEntityRemoved(EntityID entity) override; -private: + EntityID CreateBall(); + float& EdgeX() { return m_EdgeX; } + void SetEdgeX(const float& edgeX) { m_EdgeX = edgeX; } + float& EdgeY() { return m_EdgeY; } + void SetEdgeY(const float& edgeY) { m_EdgeY = edgeY; } + int& MultiBalls() { return m_MultiBalls; } + void SetMultiBalls(const int& multiBalls) { m_MultiBalls = multiBalls; } + int& Lives() { return m_Lives; } + void SetLives(const int& lives) { m_Lives = lives; } + int& PastLives() { return m_PastLives; } + void SetPastLives(const int& pastLives) { m_PastLives = pastLives; } + bool ReplaceBall() const { return m_ReplaceBall; } + void SetReplaceBall(const bool& replaceBall) { m_ReplaceBall = replaceBall; } + bool MultiBall() const { return m_MultiBall; } + void SetMultiBall(const bool& multiBall) { m_MultiBall = multiBall; } + +private: + float m_EdgeX = 3.2f; + float m_EdgeY = 5.2f; + int m_MultiBalls = 0; + int m_Lives = 3; + int m_PastLives = 3; + bool m_ReplaceBall = false; + bool m_MultiBall = false; + + dd::EventRelay m_ELifeLost; + dd::EventRelay m_EMultiBallLost; + dd::EventRelay m_EResetBall; + dd::EventRelay m_EMultiBall; + + bool OnLifeLost(const dd::Events::LifeLost &event); + bool OnMultiBallLost(const dd::Events::MultiBallLost &event); + bool OnResetBall(const dd::Events::ResetBall &event); + bool OnMultiBall(const dd::Events::MultiBall &event); }; } diff --git a/include/Game/EMultiBallLost.h b/include/Game/EMultiBallLost.h new file mode 100644 index 0000000..3d9c6d4 --- /dev/null +++ b/include/Game/EMultiBallLost.h @@ -0,0 +1,26 @@ +// +// Created by Adniklastrator on 2015-09-28. +// + +#ifndef DAYDREAM_EMULTIBALLLOST_H +#define DAYDREAM_EMULTIBALLLOST_H + +#include "Core/EventBroker.h" +#include "Core/Entity.h" + +namespace dd +{ + +namespace Events +{ + +struct MultiBallLost : Event +{ + +}; + +} + +} + +#endif //DAYDREAM_EMULTIBALLLOST_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 1d277ce..775d639 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -21,6 +21,7 @@ #include "Game/EScoreEvent.h" #include "Physics/CRectangleShape.h" #include "Game/EMultiBall.h" +#include "Game/EMultiBallLost.h" #include "Game/EGameOver.h" #include "Game/ECreatePowerUp.h" #include "Game/EPowerUpTaken.h" @@ -79,10 +80,6 @@ public: void SetRestarting(const bool& restarting) { m_Restarting = restarting; } bool Initialized() const { return m_Initialized; } void SetInitialized(const bool& initialized) { m_Initialized = initialized; } - int& Lives() { return m_Lives; } - void SetLives(const int& lives) { m_Lives = lives; } - int& PastLives() { return m_PastLives; } - void SetPastLives(const int& pastLives) { m_PastLives = pastLives; } int& MultiBalls() { return m_MultiBalls; } void SetMultiBalls(const int& multiBalls) { m_MultiBalls = multiBalls; } int& PowerUps() { return m_PowerUps; } @@ -100,18 +97,12 @@ public: glm::vec2& SpaceBetweenBricks() { return m_SpaceBetweenBricks; } void SetSpaceBetweenBricks(const glm::vec2& spaceBetweenBricks) { m_SpaceBetweenBricks = spaceBetweenBricks; } - float& EdgeX() { return m_EdgeX; } - void SetEdgeX(const float& edgeX) { m_EdgeX = edgeX; } - float& EdgeY() { return m_EdgeY; } - void SetEdgeY(const float& edgeY) { m_EdgeY = edgeY; } float& NotResettingTheStage() { return m_NotResettingTheStage; } void SetNotResettingTheStage(const float& notResettingTheStage) { m_NotResettingTheStage = notResettingTheStage; } private: bool m_Restarting = false; bool m_Initialized = false; - int m_Lives = 3; - int m_PastLives = 3; int m_MultiBalls = 0; int m_PowerUps = 0; int m_Score = 0; @@ -120,22 +111,20 @@ private: int m_Lines = 7; float m_SpaceToEdge = 0.25f; glm::vec2 m_SpaceBetweenBricks = glm::vec2(1, 0.4); - float m_EdgeX = 3.2f; - float m_EdgeY = 5.2f; float m_NotResettingTheStage = 5.f; dd::EventRelay m_EContact; - dd::EventRelay m_ELifeLost; dd::EventRelay m_EScoreEvent; dd::EventRelay m_EMultiBall; + dd::EventRelay m_EMultiBallLost; dd::EventRelay m_ECreatePowerUp; dd::EventRelay m_EPowerUpTaken; dd::EventRelay m_EStageCleared; bool OnContact(const dd::Events::Contact &event); - bool OnLifeLost(const dd::Events::LifeLost &event); bool OnScoreEvent(const dd::Events::ScoreEvent &event); bool OnMultiBall(const dd::Events::MultiBall &event); + bool OnMultiBallLost(const dd::Events::MultiBallLost &event); bool OnCreatePowerUp(const dd::Events::CreatePowerUp &event); bool OnPowerUpTaken(const dd::Events::PowerUpTaken &event); bool OnStageCleared(const dd::Events::StageCleared &event); diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 4a53907..ef9d9ef 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -45,8 +45,6 @@ public: void Update(double dt) override; void UpdateEntity(double dt, EntityID entity, EntityID parent) override; - EntityID CreateBall(); - EntityID& Entity() { return m_Entity; } void SetEntity(const EntityID& ent) { m_Entity = ent; } glm::vec3 Acceleration() const { return m_Acceleration; } @@ -56,10 +54,6 @@ public: void SetLeft(const bool& left) { m_Left = left; } bool Right() const { return m_Right; } void SetRight(const bool& right) { m_Right = right; } - bool ReplaceBall() const { return m_ReplaceBall; } - void SetReplaceBall(const bool& replaceBall) { m_ReplaceBall = replaceBall; } - bool MultiBall() const { return m_MultiBall; } - void SetMultiBall(const bool& multiBall) { m_MultiBall = multiBall; } Components::Transform* Transform() const { return m_Transform; } void SetTransform(Components::Transform* transform) { m_Transform = transform; } @@ -69,7 +63,8 @@ public: private: EntityID m_Entity = 0; glm::vec3 m_Acceleration = glm::vec3(0.f, 0.f, 0.f); - bool m_Left = false, m_Right = false, m_ReplaceBall = false, m_MultiBall = false; + bool m_Left = false; + bool m_Right = false; Components::Transform* m_Transform; Components::Pad* m_Pad; @@ -77,8 +72,6 @@ private: dd::EventRelay m_EKeyUp; dd::EventRelay m_EContact; dd::EventRelay m_EContactPowerUp; - dd::EventRelay m_EResetBall; - dd::EventRelay m_EMultiBall; dd::EventRelay m_EStageCleared; bool OnKeyDown(const dd::Events::KeyDown &event); @@ -86,8 +79,6 @@ private: bool OnContact(const dd::Events::Contact &event); bool OnContactPowerUp(const dd::Events::Contact &event); - bool OnResetBall(const dd::Events::ResetBall &event); - bool OnMultiBall(const dd::Events::MultiBall &event); bool OnStageCleared(const dd::Events::StageCleared &event); class PadSteeringInputController; diff --git a/include/Physics/PhysicsSystem.h.orig b/include/Physics/PhysicsSystem.h.orig deleted file mode 100755 index f1465aa..0000000 --- a/include/Physics/PhysicsSystem.h.orig +++ /dev/null @@ -1,149 +0,0 @@ -#ifndef DAYDREAM_PHYSICSSYSTEM_H -#define DAYDREAM_PHYSICSSYSTEM_H - -#include - -#include "Core/System.h" -#include "Core/World.h" -#include "CRectangleShape.h" -#include "Physics/CPhysics.h" -#include -#include "Core/CTransform.h" -#include "Transform/TransformSystem.h" -#include "Physics/EContact.h" -#include "Physics/ESetImpulse.h" -#include "Physics/CCircleShape.h" -#include "Core/EventBroker.h" -#include "Game/CPad.h" -<<<<<<< HEAD -#include "Game/CBall.h" -======= -#include "Physics/CWaterVolume.h" -#include "Rendering/CSprite.h" ->>>>>>> origin/master - - -namespace dd -{ - -namespace Systems -{ - - -class PhysicsSystem : public System -{ - friend class ContractListener; - -public: - PhysicsSystem(World* world, std::shared_ptr eventBroker) - : System(world, eventBroker) {} - - ~PhysicsSystem(); - - EventRelay m_SetImpulse; - bool SetImpulse(const Events::SetImpulse &event); - - void RegisterComponents(ComponentFactory* cf) override; - void Initialize() override; - - // Called once per system every tick - void Update(double dt) override; - // Called once for every entity in the world every tick - void UpdateEntity(double dt, EntityID entity, EntityID parent) override; - - // Called when components are committed to an entity - void OnEntityCommit(EntityID entity) override; - - // Called when an entity is removed - void OnEntityRemoved(EntityID entity) override; - -private: - b2Vec2 m_Gravity; - b2World* m_PhysicsWorld; - float m_TimeStep; - float m_Accumulator; - - int m_VelocityIterations, m_PositionIterations; - - std::unordered_map m_EntitiesToBodies; - std::unordered_map m_BodiesToEntities; - - void CreateBody(EntityID entity); - - b2ParticleSystem *m_ParticleSystem; - b2ParticleGroup* t_watergroup; - - std::unordered_map m_EntitiesToParticleHandle; - std::unordered_map m_ParticleHandleToEntities; - - void InitializeWater(); - void SyncWater(); //TODO: Probably remove this - void CreateParticleGroup(EntityID entity); - - struct Impulse - { - b2Body* Body; - b2Vec2 Impulse; - b2Vec2 Point; - }; - std::list m_Impulses; - - - - class ContactListener : public b2ContactListener - { - public: - ContactListener(PhysicsSystem* physicsSystem) - : m_PhysicsSystem(physicsSystem) { } - - void BeginContact(b2Contact* contact) - { - b2WorldManifold worldManifold; - - contact->GetWorldManifold(&worldManifold); - - Events::Contact e; - e.Entity1 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; - e.Entity2 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; - e.Normal = glm::normalize(glm::vec2(contact->GetManifold()->localNormal.x, contact->GetManifold()->localNormal.y)); - e.SignificantNormal = glm::normalize((glm::abs(e.Normal.x) > glm::abs(e.Normal.y)) ? glm::vec2(e.Normal.x, 0) : glm::vec2(0, e.Normal.y)); - - m_PhysicsSystem->EventBroker->Publish(e); - } - void EndContact(b2Contact* contact) - { - - } - void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) - { - EntityID entityA = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; - EntityID entityB = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; - - auto physicsComponentA = m_PhysicsSystem->m_World->GetComponent(entityA); - auto physicsComponentB = m_PhysicsSystem->m_World->GetComponent(entityB); - - if (physicsComponentA != nullptr && physicsComponentB != nullptr) { - if (physicsComponentA->Calculate || physicsComponentB->Calculate) { - // Turn of collisions - contact->SetEnabled(false); - } - } - - - } - void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) - { - - } - - private: - PhysicsSystem* m_PhysicsSystem; - }; - - ContactListener* m_ContactListener; -}; - -} -} - -#endif //DAYDREAM_PHYSICSSYSTEM_H diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 6834897..0c8978c 100755 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -95,7 +95,7 @@ set(SOURCE_FILES ${SOURCE_FILES_Game} ${SOURCE_FILES_Sound} ${SOURCE_FILES_GUI} -) + ../../include/Game/EMultiBallLost.h) if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 37df50a..2a54fc0 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -14,16 +14,89 @@ void dd::Systems::BallSystem::Initialize() { EVENT_SUBSCRIBE_MEMBER(m_Contact, BallSystem::Contact); + EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, BallSystem::OnLifeLost); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBallLost, BallSystem::OnMultiBallLost); + EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &BallSystem::OnResetBall); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &BallSystem::OnMultiBall); } void dd::Systems::BallSystem::Update(double dt) { - + if (Lives() < 0) + { + SetLives(3); + Events::GameOver e; + EventBroker->Publish(e); + } } void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { auto ballComponent = m_World->GetComponent(entity); + if (ballComponent != nullptr) { + if (ReplaceBall() == true) { + SetReplaceBall(false); + + auto transform = m_World->GetComponent(entity); + transform->Position = glm::vec3(0.0f, 0.26f, -10.f); + transform->Velocity = glm::vec3(0.0f, -ballComponent->Speed, 0.f); + } + + auto transformBall = m_World->GetComponent(entity); + if (glm::abs(transformBall->Velocity.y) < 2) { + if (transformBall->Velocity.y > 0) { + transformBall->Velocity.y = 2; + } else { + transformBall->Velocity.y = -2; + } + } + if (transformBall->Position.y < -EdgeY() - 4) { + if (MultiBalls() != 0) { +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); + m_World->RemoveEntity(entity); + Events::MultiBallLost e; + EventBroker->Publish(e); + } else if (Lives() == PastLives()) { + Events::ResetBall be; + EventBroker->Publish(be); + Events::LifeLost e; + e.Entity = entity; + EventBroker->Publish(e); + return; + } + } else if (transformBall->Position.x > EdgeX()) { + if (transformBall->Velocity.x > 0) { + glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(1, 0)); + transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); + } + } else if (transformBall->Position.x < -EdgeX()) { + if (transformBall->Velocity.x < 0) { + glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(-1, 0)); + transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); + } + } else if (transformBall->Position.y > EdgeY()) { + if (transformBall->Velocity.y > 0) { + glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(0, 1)); + transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); + } + } + } + + if (Lives() != PastLives()) { + /*auto life = m_World->GetComponent(entity); + if (life != nullptr) { + if (life->Number + 1 == PastLives()) { + /*m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); + m_World->RemoveEntity(entity);*/ + SetPastLives(Lives()); + // } + //} + } + if (ballComponent != nullptr) { auto transform = m_World->GetComponent(entity); glm::vec2 dir = glm::normalize(glm::vec2(transform->Velocity.x, transform->Velocity.y)); @@ -99,3 +172,72 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) return true; } + +EntityID dd::Systems::BallSystem::CreateBall() +{ + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(0.5f, 0.26f, -10.f); + transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); + auto model = m_World->AddComponent(ent); + model->ModelFile = "Models/Test/Ball/Ballopus.obj"; + //auto pointlight = m_World->AddComponent(ent); + std::shared_ptr circleShape = m_World->AddComponent(ent); + std::shared_ptr cball = m_World->AddComponent(ent); + std::shared_ptr physics = m_World->AddComponent(ent); + physics->Static = false; + physics->Category = CollisionLayer::Type::Ball; + physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; + physics->Calculate = true; + cball->Speed = 5.f; + + m_World->CommitEntity(ent); + + return ent; +} + +bool dd::Systems::BallSystem::OnLifeLost(const dd::Events::LifeLost &event) +{ + SetLives(Lives() - 1); + + return true; +} + +bool dd::Systems::BallSystem::OnMultiBallLost(const dd::Events::MultiBallLost &event) +{ + SetMultiBalls(MultiBalls()-1); + return true; +} + +bool dd::Systems::BallSystem::OnResetBall(const dd::Events::ResetBall &event) +{ + SetReplaceBall(true); + return true; +} + +bool dd::Systems::BallSystem::OnMultiBall(const dd::Events::MultiBall &event) +{ + auto ent1 = CreateBall(); + auto ent2 = CreateBall(); + auto transform1 = m_World->GetComponent(ent1); + auto transform2 = m_World->GetComponent(ent2); + auto ball1 = m_World->GetComponent(ent1); + auto ball2 = m_World->GetComponent(ent2); + auto padTransform = event.padTransform; + float x1 = padTransform->Position.x - 2, x2 = padTransform->Position.x + 2; + if (x1 < -3.1) { + x1 = 3; + } + if (x2 > 3.1) { + x2 = -3; + } + transform1->Position = glm::vec3(x1, -5.5, -10); + transform2->Position = glm::vec3(x2, -5.5, -10); + + transform1->Velocity = glm::normalize(glm::vec3(5, 5 ,0.f)) * ball1->Speed; + transform2->Velocity = glm::normalize(glm::vec3(-5, 5 ,0.f)) * ball2->Speed; + + SetMultiBalls(MultiBalls() + 2); + + return true; +} diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index 52d0b0a..2b70d20 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -10,16 +10,16 @@ void dd::Systems::LevelSystem::Initialize() { EVENT_SUBSCRIBE_MEMBER(m_EContact, LevelSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, LevelSystem::OnLifeLost); EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, LevelSystem::OnScoreEvent); EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, LevelSystem::OnMultiBall); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBallLost, LevelSystem::OnMultiBallLost); EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, LevelSystem::OnCreatePowerUp); EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, LevelSystem::OnPowerUpTaken); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, LevelSystem::OnStageCleared); - for (int i = 0; i < Lives(); i++) { + /*for (int i = 0; i < Lives(); i++) { CreateLife(i); - } + }*/ return; } @@ -47,13 +47,6 @@ void dd::Systems::LevelSystem::Update(double dt) CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); m_Initialized = true; } - - if (Lives() < 0) - { - SetLives(3); - Events::GameOver e; - EventBroker->Publish(e); - } } void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -61,64 +54,10 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID auto ball = m_World->GetComponent(entity); SetNotResettingTheStage(NotResettingTheStage() + 0.01 * dt); - if (ball != nullptr) { - auto transformBall = m_World->GetComponent(entity); - if (glm::abs(transformBall->Velocity.y) < 2) { - if (transformBall->Velocity.y > 0) { - transformBall->Velocity.y = 2; - } else { - transformBall->Velocity.y = -2; - } - } - if (transformBall->Position.y < -EdgeY() - 4) { - if (MultiBalls() != 0) { - SetMultiBalls(MultiBalls() - 1); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - } else if (Lives() == PastLives()) { - Events::ResetBall be; - EventBroker->Publish(be); - Events::LifeLost e; - e.Entity = entity; - EventBroker->Publish(e); - return; - } - } else if (transformBall->Position.x > EdgeX()) { - if (transformBall->Velocity.x > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.x < -EdgeX()) { - if (transformBall->Velocity.x < 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(-1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.y > EdgeY()) { - if (transformBall->Velocity.y > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(0, 1)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } - } - - if (Lives() != PastLives()) { - /*auto life = m_World->GetComponent(entity); - if (life != nullptr) { - if (life->Number + 1 == PastLives()) { - /*m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity);*/ - SetPastLives(Lives()); - // } - //} - } - if (NumberOfBricks() <= 0) { - /*SetRestarting(true); + if (NumberOfBricks() <= 0 && Restarting() == false) { if (MultiBalls() <= 0 && PowerUps() <= 0) { if (NotResettingTheStage() > 5) { + SetRestarting(true); Events::ResetBall e; EventBroker->Publish(e); Events::ScoreEvent es; @@ -127,11 +66,12 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID Events::StageCleared ec; EventBroker->Publish(ec); SetNotResettingTheStage(0); - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); + //CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); } } else { if (ball != nullptr && MultiBalls() > 0) { - SetMultiBalls(MultiBalls() - 1); + Events::MultiBallLost e; + EventBroker->Publish(e); m_World->RemoveComponent(entity); m_World->RemoveComponent(entity); m_World->RemoveComponent(entity); @@ -147,7 +87,7 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID m_World->RemoveEntity(entity); } } - }*/ + } } } @@ -309,13 +249,6 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) return true; } -bool dd::Systems::LevelSystem::OnLifeLost(const dd::Events::LifeLost &event) -{ - SetLives(Lives() - 1); - - return true; -} - bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) { SetScore(Score() += event.Score); @@ -326,6 +259,13 @@ bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) bool dd::Systems::LevelSystem::OnMultiBall(const dd::Events::MultiBall &event) { SetMultiBalls(MultiBalls()+2); + return true; +} + +bool dd::Systems::LevelSystem::OnMultiBallLost(const dd::Events::MultiBallLost &event) +{ + SetMultiBalls(MultiBalls()-1); + return true; } bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp &event) diff --git a/src/game/Game/LevelSystem.cpp.orig b/src/game/Game/LevelSystem.cpp.orig deleted file mode 100644 index b1d1139..0000000 --- a/src/game/Game/LevelSystem.cpp.orig +++ /dev/null @@ -1,372 +0,0 @@ -// -// Created by Adniklastrator on 2015-09-09. -// - - -#include "PrecompiledHeader.h" -#include "Game/LevelSystem.h" - - -void dd::Systems::LevelSystem::Initialize() -{ - EVENT_SUBSCRIBE_MEMBER(m_EContact, LevelSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, LevelSystem::OnLifeLost); - EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, LevelSystem::OnScoreEvent); - EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, LevelSystem::OnMultiBall); - EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, LevelSystem::OnCreatePowerUp); - EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, LevelSystem::OnPowerUpTaken); - EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, LevelSystem::OnStageCleared); - - for (int i = 0; i < Lives(); i++) { - CreateLife(i); - } - - return; -} - -void dd::Systems::LevelSystem::CreateLife(int number) -{ - auto life = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(life); - transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); - transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); - - std::shared_ptr lifeNr = m_World->AddComponent(life); - lifeNr->Number = number; - - auto model = m_World->AddComponent(life); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - - - m_World->CommitEntity(life); -} - -void dd::Systems::LevelSystem::Update(double dt) -{ - if (!m_Initialized) { - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); - m_Initialized = true; - } - - if (Lives() < 0) - { - SetLives(3); - Events::GameOver e; - EventBroker->Publish(e); - } -} - -void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) -{ - auto ball = m_World->GetComponent(entity); - - if (ball != nullptr) { - auto transformBall = m_World->GetComponent(entity); - if (glm::abs(transformBall->Velocity.y) < 2) { - if (transformBall->Velocity.y > 0) { - transformBall->Velocity.y = 2; - } else { - transformBall->Velocity.y = -2; - } - } - if (transformBall->Position.y < -EdgeY() - 4) { - if (MultiBalls() != 0) { - SetMultiBalls(MultiBalls() - 1); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - } else if (Lives() == PastLives()) { - Events::ResetBall be; - EventBroker->Publish(be); - Events::LifeLost e; - e.Entity = entity; - EventBroker->Publish(e); - return; - } - } else if (transformBall->Position.x > EdgeX()) { - if (transformBall->Velocity.x > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.x < -EdgeX()) { - if (transformBall->Velocity.x < 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(-1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.y > EdgeY()) { - if (transformBall->Velocity.y > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(0, 1)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } - } - - if (Lives() != PastLives()) { - auto life = m_World->GetComponent(entity); - if (life != nullptr) { - if (life->Number + 1 == PastLives()) { -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - SetPastLives(Lives()); - } - } - } - if (NumberOfBricks() <= 0) { - /*SetRestarting(true); - if (MultiBalls() <= 0 && PowerUps() <= 0) { - Events::ResetBall e; - EventBroker->Publish(e); - Events::ScoreEvent es; - es.Score = 500; - EventBroker->Publish(es); - Events::StageCleared ec; - EventBroker->Publish(ec); - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); - } else { - if (ball != nullptr && MultiBalls() > 0) { - SetMultiBalls(MultiBalls() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - auto transformBall = m_World->GetComponent(entity); - } else { - auto powerUp = m_World->GetComponent(entity); - if (powerUp != nullptr) { - SetPowerUps(PowerUps() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - } - } - }*/ - } -} - -void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 spacesBetweenBricks, float spaceToEdge) -{ - SetNumberOfBricks(rows * lines); - std::cout << "You're only doing this once, right?" << std::endl; - int num = 0; - for (int i = 0; i < rows; i++) { - num++; - for (int j = 0; j < Lines(); j++) { - CreateBrick(i, j, spacesBetweenBricks, spaceToEdge, num); - } - if (num == 7) - num = 0; - } - - SetNumberOfBricks(rows * lines); - SetRestarting(false); - return; -} - -void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBetweenBricks, float spaceToEdge, int num) -{ - auto brick = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(brick); - auto model = m_World->AddComponent(brick); - std::shared_ptr cBrick = m_World->AddComponent(brick); - std::shared_ptr cRec = m_World->AddComponent(brick); - std::shared_ptr cPhys = m_World->AddComponent(brick); - cPhys->Static = false; - cPhys->GravityScale = 0.f; - cPhys->Category = CollisionLayer::Type::Brick; - cPhys->Mask = CollisionLayer::Type::Ball; - - std::string fileName = "Textures/Bricks/"; - fileName.append(std::to_string(num)); - fileName.append(".png"); - //sprite->SpriteFile = fileName; - model->ModelFile = "Models/Test/Brick/Brick.obj"; - if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 6 && row == 6)) { - std::shared_ptr cPow = m_World->AddComponent(brick); - } - float x = line * spacesBetweenBricks.x; - float y = row * spacesBetweenBricks.y; - transform->Scale = glm::vec3(0.8, 0.2, 0.2); - transform->Position = glm::vec3(x - 3, 5 - spaceToEdge - y , -10.f); - cBrick->Score = 10 * num; - - //sound - auto collisionSound = m_World->AddComponent(brick); - collisionSound->filePath = "Sounds/Brick/shortbrickbreak.wav"; - - m_World->CommitEntity(brick); - return; -} - -void dd::Systems::LevelSystem::ProcessCollision() -{ - // Like, go into brick component and check what it does upon collision. Maybe not done here? - return; -} - -void dd::Systems::LevelSystem::OnEntityRemoved(EntityID entity) -{ - auto brick = m_World->GetComponent(entity); - if (brick != nullptr) { - SetNumberOfBricks(NumberOfBricks() - 1); - Events::ScoreEvent es; - es.Score = brick->Score; - EventBroker->Publish(es); - /*if (numberOfBricks < 1) { - EndLevel(); - }*/ - } - return; -} - -bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) -{ - EntityID entityBrick; - EntityID entityBall; - auto ball = m_World->GetComponent(event.Entity2); - auto brick = m_World->GetComponent(event.Entity1); - if (brick != nullptr) { - entityBrick = event.Entity1; - } else { - brick = m_World->GetComponent(event.Entity2); - if (brick != nullptr) { - entityBrick = event.Entity2; - } else { - return false; - } - } - if (ball != nullptr) { - entityBall = event.Entity2; - } else { - ball = m_World->GetComponent(event.Entity1); - if (ball != nullptr) { - entityBall = event.Entity1; - } else { - return false; - } - } - - brick = m_World->GetComponent(entityBrick); - if (brick == nullptr) { - return false; - } - - auto power = m_World->GetComponent(entityBrick); - if (power != nullptr) { - Events::CreatePowerUp e; - auto transform = m_World->GetComponent(entityBrick); - e.Position = transform->Position; - EventBroker->Publish(e); - } - - if (ball != nullptr && Restarting() == false) { - auto ballTransform = m_World->GetComponent(entityBall); - -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveEntity(entityBrick); - - auto physicsComponent = m_World->GetComponent(entityBrick); - physicsComponent->GravityScale = 1.f; - physicsComponent->Mask = CollisionLayer::Type::Water | CollisionLayer::Type::Wall; - - auto transformComponentBrick = m_World->GetComponent(entityBrick); - auto transformComponentBall = m_World->GetComponent(entityBall); - - Events::SetImpulse e; - e.Entity = entityBrick; - - glm::vec2 point = glm::vec2(transformComponentBrick->Position.x + ((transformComponentBrick->Position.x - transformComponentBall->Position.x)/4), transformComponentBrick->Position.y + ((transformComponentBrick->Position.y - transformComponentBall->Position.y )/4)); - - e.Impulse = glm::normalize(point)/2.f; - e.Point = point; - EventBroker->Publish(e); - //TODO: Bricks dont collide with walls D= - - SetNumberOfBricks(NumberOfBricks() - 1); - if (NumberOfBricks() <= 0) { - SetMultiBalls(MultiBalls() + 1); - } - Events::ScoreEvent es; - es.Score = brick->Score; - EventBroker->Publish(es); - -<<<<<<< HEAD - // std::cout << NumberOfBricks() << std::endl; -======= - //std::cout << NumberOfBricks() << std::endl; ->>>>>>> origin/master - //std::cout << "Score: " << Score() << std::endl; - } - - return true; -} - -bool dd::Systems::LevelSystem::OnLifeLost(const dd::Events::LifeLost &event) -{ - SetLives(Lives() - 1); - - return true; -} - -bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) -{ - SetScore(Score() += event.Score); - - return true; -} - -bool dd::Systems::LevelSystem::OnMultiBall(const dd::Events::MultiBall &event) -{ - SetMultiBalls(MultiBalls()+2); -} - -bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp &event) -{ - SetPowerUps(PowerUps() + 1); - auto powerUp = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(powerUp); - auto model = m_World->AddComponent(powerUp); - std::shared_ptr cRec = m_World->AddComponent(powerUp); - std::shared_ptr cPhys = m_World->AddComponent(powerUp); - cPhys->Static = false; - cPhys->Category = CollisionLayer::Type::PowerUp; - cPhys->Mask = CollisionLayer::Type::Pad; - - std::shared_ptr cPow = m_World->AddComponent(powerUp); - - - transform->Position = event.Position; - transform->Scale = glm::vec3(0.2, 0.2, 0.2); - transform->Velocity = glm::vec3(0, -4, 0); - - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - - m_World->CommitEntity(powerUp); - - return true; -} - -bool dd::Systems::LevelSystem::OnPowerUpTaken(const dd::Events::PowerUpTaken &event) -{ - SetPowerUps(PowerUps() - 1); - return true; -} - -bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &event) -{ - return true; -} - -void dd::Systems::LevelSystem::EndLevel() -{ - Events::StageCleared e; - EventBroker->Publish(e); - return; -} - diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index b72108b..b767c89 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -26,23 +26,12 @@ void dd::Systems::PadSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PadSystem::OnKeyUp); EVENT_SUBSCRIBE_MEMBER(m_EContact, &PadSystem::OnContact); EVENT_SUBSCRIBE_MEMBER(m_EContactPowerUp, &PadSystem::OnContactPowerUp); - EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); - EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &PadSystem::OnMultiBall); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &PadSystem::OnStageCleared); } void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { - auto ball = m_World->GetComponent(entity); - if (ball != nullptr) { - if (ReplaceBall() == true) { - SetReplaceBall(false); - auto transform = m_World->GetComponent(entity); - transform->Position = glm::vec3(0.0f, 0.26f, -10.f); - transform->Velocity = glm::vec3(0.0f, -ball->Speed, 0.f); - } - } } void dd::Systems::PadSystem::Update(double dt) @@ -72,7 +61,6 @@ void dd::Systems::PadSystem::Update(double dt) transform->Velocity += acceleration * (float)dt; transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float)dt; - if (Left()) { acceleration.x = -pad->AccelerationSpeed; } else if (Right()) { @@ -85,40 +73,9 @@ void dd::Systems::PadSystem::Update(double dt) SetPad(pad); SetAcceleration(acceleration); - if (MultiBall() == true) { - SetMultiBall(false); - - Events::MultiBall e; - e.padTransform = transform; - EventBroker->Publish(e); - } - return; } -EntityID dd::Systems::PadSystem::CreateBall() -{ - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.5f, 0.26f, -10.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - //auto pointlight = m_World->AddComponent(ent); - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr cball = m_World->AddComponent(ent); - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Ball; - physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; - physics->Calculate = true; - cball->Speed = 5.f; - - m_World->CommitEntity(ent); - - return ent; -} - bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { int val = event.KeyCode; @@ -135,9 +92,12 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) //acceleration.x = 0.01f; SetRight(true); } else if (val == GLFW_KEY_R) { - SetReplaceBall(true); + Events::ResetBall e; + EventBroker->Publish(e); } else if (val == GLFW_KEY_M) { - SetMultiBall(true); + Events::MultiBall e; + e.padTransform = Transform(); + EventBroker->Publish(e); } else if (val == GLFW_KEY_D) { return false; } @@ -251,37 +211,6 @@ bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) return true; } -bool dd::Systems::PadSystem::OnResetBall(const dd::Events::ResetBall &event) -{ - SetReplaceBall(true); - return true; -} - -bool dd::Systems::PadSystem::OnMultiBall(const dd::Events::MultiBall &event) -{ - auto ent1 = CreateBall(); - auto ent2 = CreateBall(); - auto transform1 = m_World->GetComponent(ent1); - auto transform2 = m_World->GetComponent(ent2); - auto ball1 = m_World->GetComponent(ent1); - auto ball2 = m_World->GetComponent(ent2); - auto padTransform = event.padTransform; - float x1 = padTransform->Position.x - 2, x2 = padTransform->Position.x + 2; - if (x1 < -3.1) { - x1 = 3; - } - if (x2 > 3.1) { - x2 = -3; - } - transform1->Position = glm::vec3(x1, -5.5, -10); - transform2->Position = glm::vec3(x2, -5.5, -10); - - transform1->Velocity = glm::normalize(glm::vec3(5, 5 ,0.f)) * ball1->Speed; - transform2->Velocity = glm::normalize(glm::vec3(-5, 5 ,0.f)) * ball2->Speed; - - return true; -} - bool dd::Systems::PadSystem::OnStageCleared(const dd::Events::StageCleared &event) { //auto entity = CreateBall(); diff --git a/src/game/Game/PadSystem.cpp.orig b/src/game/Game/PadSystem.cpp.orig deleted file mode 100755 index 7d21606..0000000 --- a/src/game/Game/PadSystem.cpp.orig +++ /dev/null @@ -1,313 +0,0 @@ -// -// Created by Adniklastrator on 2015-09-10. -// - -#include "PrecompiledHeader.h" -#include "Game/PadSystem.h" -#include "Core/World.h" -#include -#include -#include - - -void dd::Systems::PadSystem::Initialize() -{ - Events::BindKey r; - r.KeyCode = GLFW_KEY_RIGHT; - r.Command = "right"; - EventBroker->Publish(r); - - Events::BindKey l; - l.KeyCode = GLFW_KEY_LEFT; - l.Command = "left"; - EventBroker->Publish(l); - - EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PadSystem::OnKeyDown); - EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PadSystem::OnKeyUp); - EVENT_SUBSCRIBE_MEMBER(m_EContact, &PadSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_EContactPowerUp, &PadSystem::OnContactPowerUp); - EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); - EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &PadSystem::OnMultiBall); - EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &PadSystem::OnStageCleared); -} - -void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) -{ - auto ball = m_World->GetComponent(entity); - if (ball != nullptr) { - if (ReplaceBall() == true) { - SetReplaceBall(false); - - auto transform = m_World->GetComponent(entity); - transform->Position = glm::vec3(0.0f, 0.26f, -10.f); - transform->Velocity = glm::vec3(0.0f, -ball->Speed, 0.f); - } - } -} - -void dd::Systems::PadSystem::Update(double dt) -{ - if (Entity() == 0) { - for (auto it = m_World->GetEntities()->begin(); it != m_World->GetEntities()->end(); it++) { - if (m_World->GetProperty(it->first, "Name") == "Pad") { - SetEntity(it->first); - SetTransform(m_World->GetComponent(Entity())); - SetPad(m_World->GetComponent(Entity())); - break; - } - } - } - - auto transform = Transform(); - auto pad = Pad(); - auto acceleration = Acceleration(); - - if (transform->Velocity.x < -pad->MaxSpeed) { - transform->Velocity.x = -pad->MaxSpeed; - } - else if (transform->Velocity.x > pad->MaxSpeed) { - transform->Velocity.x = pad->MaxSpeed; - } - transform->Position += transform->Velocity * (float)dt; - transform->Velocity += acceleration * (float)dt; - transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float)dt; - - - if (Left()) { - acceleration.x = -pad->AccelerationSpeed; -<<<<<<< HEAD - } - else if (Right()) { -======= - } else if (Right()) { ->>>>>>> 72413dc0a93bd3a2f6ab9fa7e19bbc3b846232db - acceleration.x = pad->AccelerationSpeed; - } else { - acceleration.x = 0.f; - } - - SetTransform(transform); - SetPad(pad); - SetAcceleration(acceleration); - - if (MultiBall() == true) { - SetMultiBall(false); - - Events::MultiBall e; - e.padTransform = transform; - EventBroker->Publish(e); - } - - return; -} - -EntityID dd::Systems::PadSystem::CreateBall() -{ - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.5f, 0.26f, -10.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - //auto pointlight = m_World->AddComponent(ent); - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr cball = m_World->AddComponent(ent); - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - - cball->Speed = 10; - - m_World->CommitEntity(ent); - - return ent; -} - -bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) -{ - int val = event.KeyCode; - if (val == GLFW_KEY_UP) { - //std::cout << "Up!" << std::endl; - } else if (val == GLFW_KEY_DOWN) { - //std::cout << "Down!" << std::endl; - } else if (val == GLFW_KEY_LEFT) { - //std::cout << "Left!" << std::endl; - //acceleration.x = -0.01f; - SetLeft(true); - } else if (val == GLFW_KEY_RIGHT) { - //std::cout << "Right!" << std::endl; - //acceleration.x = 0.01f; - SetRight(true); - } else if (val == GLFW_KEY_R) { - SetReplaceBall(true); - } else if (val == GLFW_KEY_M) { - SetMultiBall(true); - } else if (val == GLFW_KEY_D) { - return false; - } - return true; -} - -bool dd::Systems::PadSystem::OnKeyUp(const dd::Events::KeyUp &event) -{ - int val = event.KeyCode; - if (val == GLFW_KEY_UP) { - - } else if (val == GLFW_KEY_DOWN) { - - } else if (val == GLFW_KEY_LEFT) { - SetLeft(false); - } else if (val == GLFW_KEY_RIGHT) { - SetRight(false); - } - return true; -} - -bool dd::Systems::PadSystem::OnContact(const dd::Events::Contact &event) -{ - /* - EntityID entityBall = event.Entity2; - auto ball = m_World->GetComponent(entityBall); - if (ball == NULL) { - return false; - } - EntityID entityPad = event.Entity1; - auto pad = m_World->GetComponent(entityPad); - if (pad == NULL) { - return false; - } - auto transformBall = m_World->GetComponent(entityBall); - auto transformPad = m_World->GetComponent(entityPad); - - float movementMultiplier = 0.5f; - - //float movementX = (event.ContactPoint.x - transformPad->Position.x) * movementMultiplier; - //float movementY = glm::cos((abs(movementX) / (3.2f * movementMultiplier)) * 3.14159265359f / 2) * 2.f; - if (whatX > 0) { - movementX = movementMultiplier * whatX; - //std::cout << "Right!" << std::endl; - } else { - movementX = movementMultiplier * whatX; - //std::cout << "Left!" << std::endl; - } - - // std::cout << movementX << " " << movementY << std::endl; - - //float movementX = (event.ContactPoint.x - transformPad->Position.x) * movementMultiplier; -<<<<<<< HEAD - float movementY = glm::cos((abs(movementX) / ((1.6f) * movementMultiplier)) * 3.14159265359f / 2) + 1; -======= - float movementY = glm::cos((abs(movementX) / ((1.6f) * movementMultiplier)) * 3.14159265359f / 2)+ 0.2; ->>>>>>> 72413dc0a93bd3a2f6ab9fa7e19bbc3b846232db - - //std::cout << movementX << " " << movementY << std::endl; - - float len = glm::length(transformBall->Velocity); - //auto pointlight = m_World->AddComponent(ent); - - - transformBall->Velocity += glm::vec3(transformPad->Velocity.x, 0, 0); - transformBall->Velocity = glm::normalize(transformBall->Velocity) * len; - - - //transform->Velocity = glm::vec3(movementX, movementY, 0.f); - */ -} - -bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) -{ - EntityID entityPower; - EntityID entityPad; - auto powerUp = m_World->GetComponent(event.Entity1); - auto pad = m_World->GetComponent(event.Entity2); - if (powerUp != nullptr) { - entityPower = event.Entity1; - } else { - powerUp = m_World->GetComponent(event.Entity2); - if (powerUp != nullptr) { - entityPower = event.Entity2; - } - } - if (pad != nullptr) { - entityPad = event.Entity2; - } else { - pad = m_World->GetComponent(event.Entity1); - if (pad != nullptr) { - entityPad = event.Entity1; - } - } - - if (entityPower == NULL || entityPad == NULL) { - return false; - } - - pad = m_World->GetComponent(entityPad); - if (pad == nullptr) { - return false; - } - - m_World->RemoveComponent(entityPower); - m_World->RemoveComponent(entityPower); - m_World->RemoveComponent(entityPower); - m_World->RemoveEntity(entityPower); - Events::PowerUpTaken ep; - ep.Name = "Something"; - EventBroker->Publish(ep); - - Events::MultiBall e; - auto transform = m_World->GetComponent(entityPad); - e.padTransform = transform; - EventBroker->Publish(e); - return true; -} - -bool dd::Systems::PadSystem::OnResetBall(const dd::Events::ResetBall &event) -{ - SetReplaceBall(true); - return true; -} - -bool dd::Systems::PadSystem::OnMultiBall(const dd::Events::MultiBall &event) -{ - auto ent1 = CreateBall(); - auto ent2 = CreateBall(); - auto transform1 = m_World->GetComponent(ent1); - auto transform2 = m_World->GetComponent(ent2); - auto ball1 = m_World->GetComponent(ent1); - auto ball2 = m_World->GetComponent(ent2); - auto padTransform = event.padTransform; - float x1 = padTransform->Position.x - 2, x2 = padTransform->Position.x + 2; - if (x1 < -3.1) { - x1 = 3; - } - if (x2 > 3.1) { - x2 = -3; - } - transform1->Position = glm::vec3(x1, -5.5, -10); - transform2->Position = glm::vec3(x2, -5.5, -10); - - transform1->Velocity = glm::normalize(glm::vec3(5, 5 ,0.f)) * ball1->Speed; - transform2->Velocity = glm::normalize(glm::vec3(-5, 5 ,0.f)) * ball2->Speed; - - return true; -} - -bool dd::Systems::PadSystem::OnStageCleared(const dd::Events::StageCleared &event) -{ - auto entity = CreateBall(); - return true; -} - -bool dd::Systems::PadSystem::PadSteeringInputController::OnCommand(const Events::InputCommand &event) -{ - std::string command = event.Command; - - std::cout << "Command!" << std::endl; - - if (command == "right") { - std::cout << "Right!" << std::endl; - } else if (command == "left") { - std::cout << "Left!" << std::endl; - } - - return true; -} \ No newline at end of file diff --git a/src/game/Physics/PhysicsSystem.cpp.orig b/src/game/Physics/PhysicsSystem.cpp.orig deleted file mode 100755 index 7fb8bc1..0000000 --- a/src/game/Physics/PhysicsSystem.cpp.orig +++ /dev/null @@ -1,363 +0,0 @@ -#include "PrecompiledHeader.h" -#include "Physics/PhysicsSystem.h" - - - -void dd::Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf) -{ - cf->Register(); -} - -void dd::Systems::PhysicsSystem::Initialize() -{ - m_ContactListener = new ContactListener(this); - - m_Gravity = b2Vec2(0.f, -9.82f); - m_PhysicsWorld = new b2World(m_Gravity); - - m_TimeStep = 1.f/60.f; - m_VelocityIterations = 6; - m_PositionIterations = 2; - m_Accumulator = 0.f; - - m_PhysicsWorld->SetContactListener(m_ContactListener); - - InitializeWater(); - - EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, PhysicsSystem::SetImpulse); -} - -void dd::Systems::PhysicsSystem::InitializeWater() -{ - b2ParticleSystemDef m_ParticleSystemDef; - m_ParticleSystemDef.radius = 0.13f; - - m_ParticleSystem = m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); -} - -bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) -{ - b2Body* body = m_EntitiesToBodies[event.Entity]; - - b2Vec2 impulse; - impulse.x = event.Impulse.x; - impulse.y = event.Impulse.y; - - b2Vec2 point; - point.x = event.Point.x; - point.y = event.Point.y; - - - Impulse i; - i.Body = body; - i.Impulse = impulse; - i.Point = point; - - m_Impulses.push_back(i); - - return true; -} - -void dd::Systems::PhysicsSystem::Update(double dt) -{ - - m_Accumulator += dt; - while(m_Accumulator >= m_TimeStep) - { - - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body* body = i.second; - - auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) { - continue; - LOG_ERROR("RigidBody with no TransformComponent"); - } - auto physicsComponent = m_World->GetComponent(entity); - if (! physicsComponent) { - continue; - LOG_ERROR("RigidBody with no PhysicsComponent"); - } - - - if (body == nullptr) { - LOG_ERROR("This body should not exist"); - continue; - } - - if (m_World->GetEntityParent(entity) == 0) { //TODO: Make this work with childs too - b2Vec2 position; - position.x = transformComponent->Position.x; - position.y = transformComponent->Position.y; - float angle = -glm::eulerAngles(transformComponent->Orientation).z; - body->SetTransform(position, angle); - body->SetLinearVelocity(b2Vec2(transformComponent->Velocity.x, transformComponent->Velocity.y)); - - body->SetGravityScale(physicsComponent->GravityScale); - -<<<<<<< HEAD - - b2Filter filter; - filter.categoryBits = physicsComponent->Category; - filter.maskBits = physicsComponent->Mask; - body->GetFixtureList()->SetFilterData(filter); - } - } - - for (auto i : m_Impulses) { - i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); -======= ->>>>>>> origin/master - } - m_Impulses.clear(); - - -<<<<<<< HEAD - - -======= - for (auto i : m_Impulses) { - i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); - } - m_Impulses.clear(); - m_Accumulator += dt; - while(m_Accumulator >= m_TimeStep) - { ->>>>>>> origin/master - m_PhysicsWorld->Step(m_TimeStep, m_VelocityIterations, m_PositionIterations); - m_Accumulator -= dt; - -<<<<<<< HEAD - -======= - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body* body = i.second; ->>>>>>> origin/master - - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body* body = i.second; - - if (body == nullptr) { - LOG_ERROR("This body should not exist"); - continue; - } - -<<<<<<< HEAD - auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) - continue; - if (m_World->GetEntityParent(entity) == 0) { - b2Vec2 position = body->GetPosition(); - transformComponent->Position.x = position.x; - transformComponent->Position.y = position.y; -======= - auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) - continue; - auto parent = m_World->GetEntityParent(entity); - if (parent == 0) { - b2Vec2 position = body->GetPosition(); - transformComponent->Position.x = position.x; - transformComponent->Position.y = position.y; ->>>>>>> origin/master - - float angle = body->GetAngle(); - - - transformComponent->Orientation = glm::quat(glm::vec3(0, 0, -angle)); - -<<<<<<< HEAD - b2Vec2 velocity = body->GetLinearVelocity(); - transformComponent->Velocity.x = velocity.x; - transformComponent->Velocity.y = velocity.y; - - } -======= ->>>>>>> origin/master - } - } - - b2Vec2* positionBuffer = m_ParticleSystem->GetPositionBuffer(); - for (auto i : m_EntitiesToParticleHandle) { - EntityID entity = i.first; - b2ParticleHandle* particleH = i.second; - - b2Vec2 positionB2 = positionBuffer[particleH->GetIndex()]; - glm::vec2 position = glm::vec2(positionB2.x, positionB2.y); - - - EntityID entityParent = m_World->GetEntityParent(entity); - auto transform = m_World->GetComponent(entity); - auto transformParent = m_World->GetComponent(entityParent); - - transform->Position = glm::vec3(position.x, position.y, -10) - transformParent->Position; - } -} - -void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) -{ - -} - -void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) -{ - auto physicsComponent = m_World->GetComponent(entity); - auto waterComponent = m_World->GetComponent(entity); - - if (physicsComponent && waterComponent) { - LOG_ERROR("Entity has both water and physics component, this is illegal. The police has been alerted."); - return; - } - if (physicsComponent) { - CreateBody(entity); - } else if (waterComponent) { - CreateParticleGroup(entity); - } -} - - -void dd::Systems::PhysicsSystem::OnEntityRemoved(EntityID entity) -{ - auto physics = m_World->GetComponent(entity); - if (physics == nullptr) { - return; - } - - b2Body* body = m_EntitiesToBodies[entity]; - - if (body != nullptr) { - m_EntitiesToBodies.erase(entity); - m_BodiesToEntities.erase(body); - - m_PhysicsWorld->DestroyBody(body); - } - -} - - -void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) -{ - auto physicsComponent = m_World->GetComponent(entity); - if(!physicsComponent){ - LOG_ERROR("No PhysicsComponent in CreateBody"); - return; - } - - - auto transformComponent = m_World->GetComponent(entity); - if(!transformComponent) { - LOG_ERROR("No TransformComponent in CreateBody"); - return; - } - - auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity); - - b2BodyDef bodyDef; - bodyDef.position.Set(absoluteTransform.Position.x, absoluteTransform.Position.y); - bodyDef.angle = -glm::eulerAngles(absoluteTransform.Orientation).z; - - if (physicsComponent->Static) { - bodyDef.type = b2_staticBody; - } else { - bodyDef.type = b2_dynamicBody; - - } - - b2Body* body = m_PhysicsWorld->CreateBody(&bodyDef); - - b2Shape* pShape; - - auto boxComponent = m_World->GetComponent(entity); - if (boxComponent) { - b2PolygonShape* bShape = new b2PolygonShape(); - bShape->SetAsBox(absoluteTransform.Scale.x/2, absoluteTransform.Scale.y/2); - pShape = bShape; - } else { - auto circleComponent = m_World->GetComponent(entity); - if (circleComponent) { - pShape = new b2CircleShape(); - pShape->m_radius = absoluteTransform.Scale.x; - - - if (absoluteTransform.Scale.x != absoluteTransform.Scale.y && absoluteTransform.Scale.y != absoluteTransform.Scale.z) { - LOG_WARNING("Circles has to be of uniform scale."); - } - pShape->m_radius = absoluteTransform.Scale.x/2; - - } - } - - b2FixtureDef fixtureDef; - fixtureDef.shape = pShape; - fixtureDef.filter.categoryBits = physicsComponent->Category; - fixtureDef.filter.maskBits = physicsComponent->Mask; - - - if(physicsComponent->Static) { - body->CreateFixture(&fixtureDef); //Density kanske ska vara 0 på statiska kroppar - } - else { - fixtureDef.shape = pShape; - fixtureDef.density = 1.f; - fixtureDef.restitution = 1.0f; - fixtureDef.friction = 0.0f; - body->CreateFixture(&fixtureDef); - - } - - delete pShape; - - - body->SetGravityScale(physicsComponent->GravityScale); - m_EntitiesToBodies.insert(std::make_pair(entity, body)); - m_BodiesToEntities.insert(std::make_pair(body, entity)); -} - -void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) -{ - //TODO: Lägg alla pd i en lista - auto transform = m_World->GetComponent(e); - if (!transform) { - LOG_ERROR("No Transform component in CreateParticleGroup"); - return; - } - - b2ParticleGroupDef pd; - b2PolygonShape shape; - - shape.SetAsBox(transform->Scale.x/2.f, transform->Scale.y/2.f); - pd.shape = &shape; - pd.flags = b2_tensileParticle; - pd.position.Set(transform->Position.x, transform->Position.y); - //TODO: PUT IN LIST - t_watergroup = m_ParticleSystem->CreateParticleGroup(pd); - b2Vec2* t_ParticlePositions = m_ParticleSystem->GetPositionBuffer(); - for(int i = 0; i < m_ParticleSystem->GetParticleCount(); i++){ - { - auto t_waterparticle = m_World->CreateEntity(e); - auto transformChild = m_World->AddComponent(t_waterparticle); - //auto sprite = m_World->AddComponent(t_waterparticle); - - transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); - transformChild->Scale = glm::vec3(m_ParticleSystem->GetRadius())/transform->Scale; - //sprite->SpriteFile = "Textures/Ball.png"; - m_World->CommitEntity(t_waterparticle); - - m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem->GetParticleHandleFromIndex(i))); - m_ParticleHandleToEntities.insert(std::make_pair( m_ParticleSystem->GetParticleHandleFromIndex(i), t_waterparticle)); - } - - } - LOG_INFO("ParticleCount: %i", m_ParticleSystem->GetParticleCount()); -} - -dd::Systems::PhysicsSystem::~PhysicsSystem() -{ - if (m_ContactListener != nullptr) { - delete m_ContactListener; - m_ContactListener = nullptr; - } -} From 7b7277509e051c44e7e5f99223593f478b246485 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Mon, 28 Sep 2015 18:09:55 +0200 Subject: [PATCH 03/18] CreateBall clones the original ball rather than create new balls. --- include/Core/Engine.h | 2 +- include/Game/BallSystem.h | 5 +++++ src/game/Game/BallSystem.cpp | 11 ++++++++++- src/game/Game/LevelSystem.cpp | 6 +++--- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 6820d0b..ad45379 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -136,7 +136,7 @@ public: { auto ent = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(-0.f, 0.26f, -9.f); + transform->Position = glm::vec3(-0.f, 0.26f, -10.f); transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); transform->Velocity = glm::vec3(0.0f, -10.f, 0.f); auto model = m_World->AddComponent(ent); diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index e838076..ac34ab0 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -9,6 +9,7 @@ #include "Physics/CCircleShape.h" #include "Physics/EContact.h" #include "Rendering/CModel.h" +#include "Rendering/CPointLight.h" #include "Game/CBall.h" #include "Game/CPowerUp.h" #include "Game/ELifeLost.h" @@ -48,6 +49,8 @@ public: void OnEntityRemoved(EntityID entity) override; EntityID CreateBall(); + EntityID Ball() { return m_Ball; }; + void SetBall(const EntityID& ball) { m_Ball = ball; } float& EdgeX() { return m_EdgeX; } void SetEdgeX(const float& edgeX) { m_EdgeX = edgeX; } @@ -73,6 +76,8 @@ private: bool m_ReplaceBall = false; bool m_MultiBall = false; + EntityID m_Ball; + dd::EventRelay m_ELifeLost; dd::EventRelay m_EMultiBallLost; dd::EventRelay m_EResetBall; diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 2a54fc0..6e32e52 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -34,6 +34,10 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID { auto ballComponent = m_World->GetComponent(entity); if (ballComponent != nullptr) { + if (Ball() == NULL) { + SetBall(entity); + } + if (ReplaceBall() == true) { SetReplaceBall(false); @@ -175,7 +179,9 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) EntityID dd::Systems::BallSystem::CreateBall() { - auto ent = m_World->CreateEntity(); + auto ent = m_World->CloneEntity(Ball()); + + /* auto ent = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(ent); transform->Position = glm::vec3(0.5f, 0.26f, -10.f); transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); @@ -191,6 +197,9 @@ EntityID dd::Systems::BallSystem::CreateBall() physics->Calculate = true; cball->Speed = 5.f; + auto plight = m_World->AddComponent(ent); + plight->Radius = 2.f;*/ + m_World->CommitEntity(ent); return ent; diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index 2b70d20..d3bfe34 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -70,14 +70,12 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID } } else { if (ball != nullptr && MultiBalls() > 0) { - Events::MultiBallLost e; - EventBroker->Publish(e); + SetMultiBalls(MultiBalls()-1); m_World->RemoveComponent(entity); m_World->RemoveComponent(entity); m_World->RemoveComponent(entity); m_World->RemoveComponent(entity); m_World->RemoveEntity(entity); - auto transformBall = m_World->GetComponent(entity); } else { auto powerUp = m_World->GetComponent(entity); if (powerUp != nullptr) { @@ -259,12 +257,14 @@ bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) bool dd::Systems::LevelSystem::OnMultiBall(const dd::Events::MultiBall &event) { SetMultiBalls(MultiBalls()+2); + std::cout << MultiBalls() << std::endl; return true; } bool dd::Systems::LevelSystem::OnMultiBallLost(const dd::Events::MultiBallLost &event) { SetMultiBalls(MultiBalls()-1); + std::cout << MultiBalls() << std::endl; return true; } From 38d3a8c99080da487fda62b6cb8a43717a78f0e6 Mon Sep 17 00:00:00 2001 From: tleety Date: Tue, 29 Sep 2015 10:27:57 +0200 Subject: [PATCH 04/18] Fixed a bug where you could not have more than one particle group --- include/Core/Engine.h | 11 +++ include/Core/Renderer.h | 43 ++++++------ include/Physics/PhysicsSystem.h | 4 +- src/game/Core/Renderer.cpp | 104 ++++++++++------------------- src/game/Physics/PhysicsSystem.cpp | 7 +- 5 files changed, 69 insertions(+), 100 deletions(-) mode change 100644 => 100755 include/Core/Engine.h mode change 100644 => 100755 include/Physics/PhysicsSystem.h mode change 100644 => 100755 src/game/Physics/PhysicsSystem.cpp diff --git a/include/Core/Engine.h b/include/Core/Engine.h old mode 100644 new mode 100755 index 6820d0b..45a9dcc --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -203,6 +203,16 @@ public: m_World->CommitEntity(background); } + //Water test + { + auto t_waterBody = m_World->CreateEntity(); + auto transform = m_World->AddComponent(t_waterBody); + transform->Position = glm::vec3(0.f, -0.5f, -10.f); + transform->Scale = glm::vec3(1.f, 1.f, 1.f); + auto water = m_World->AddComponent(t_waterBody); + auto body = m_World->AddComponent(t_waterBody); + m_World->CommitEntity(t_waterBody); + } //Water test { auto t_waterBody = m_World->CreateEntity(); @@ -213,6 +223,7 @@ public: auto body = m_World->AddComponent(t_waterBody); m_World->CommitEntity(t_waterBody); } + //TODO: Why does the ball not collide with these bricks? //BottomBox { diff --git a/include/Core/Renderer.h b/include/Core/Renderer.h index 5a2b03f..9b03627 100755 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -72,37 +72,32 @@ private: ShaderProgram* m_spDeferred3; ShaderProgram* m_spForward; ShaderProgram* m_spScreen; - ShaderProgram* t_m_spWater; - ShaderProgram* t_m_spWater2; + ShaderProgram*m_spWater; + ShaderProgram*m_spWater2; GLuint m_ScreenQuad = 0; Model* m_UnitSphere = nullptr; Model* m_UnitQuad = nullptr; Texture* m_StandardNormal; Texture* m_StandardSpecular; - Texture* t_m_WhiteSphereTexture; - - GLuint m_rbDepthBuffer = 0; - GLuint m_fbDeferred1 = 0; - GLuint m_GDiffuse = 0; - GLuint m_GPosition = 0; - GLuint m_GNormal = 0; - GLuint m_GSpecular = 0; - GLuint m_fbDeferred2 = 0; - GLuint m_tLighting = 0; - GLuint m_fbDeferred3 = 0; - GLuint m_tFinal = 0; - //Water GTexture - GLuint t_m_Gwater = 0; - //Water blur texture - GLuint t_m_BWater; - GLuint t_m_BWater2; - //WAterpass Framebuffer - GLuint t_m_fbWater; - //Waterpass Framebuffer - GLuint t_m_fbWaterBlur; - GLuint t_m_fbWaterBlur2; + Texture* m_WhiteSphereTexture; + GLuint m_rbDepthBuffer = 0; //DepthBuffer Texture + GLuint m_fbDeferred1 = 0; //Framebuffer for first pass + GLuint m_GDiffuse = 0; //Texture for diffuseColors + GLuint m_GPosition = 0; //Texture for positions + GLuint m_GNormal = 0; //Texture for normals + GLuint m_GSpecular = 0; //Texture for specular + GLuint m_fbDeferred2 = 0; //Framebuffer that handles the lighting pass + GLuint m_tLighting = 0; //Texture for the lighting pass + GLuint m_fbDeferred3 = 0; //Frambuffer for handling the last pass. + GLuint m_tFinal = 0; //Final Texture to be printed to screen + GLuint m_Gwater = 0; //Water Color Texture + GLuint m_BWater; //Water blur texture + GLuint m_BWater2; //Water blur texture + GLuint m_fbWater; //Waterpass Framebuffer + GLuint m_fbWaterBlur; //Waterpass Framebuffer + GLuint m_fbWaterBlur2; //Waterpass Framebuffer GLuint m_CurrentScreenBuffer = 0; void LoadShaders(); diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h old mode 100644 new mode 100755 index eaaf49e..412069d --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -67,8 +67,8 @@ private: void CreateBody(EntityID entity); - b2ParticleSystem *m_ParticleSystem; - b2ParticleGroup* t_watergroup; + b2ParticleSystem* m_ParticleSystem; + std::vector t_ParticleGroup; std::unordered_map m_EntitiesToParticleHandle; std::unordered_map m_ParticleHandleToEntities; diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index 2226ba2..cb997ce 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -92,10 +92,10 @@ void dd::Renderer::LoadShaders() m_spDeferred2->Link(); //Water Pass - t_m_spWater = ResourceManager::Load("Shaders/Deferred/water/"); - t_m_spWater->Link(); - t_m_spWater2 = ResourceManager::Load("Shaders/Deferred/water2/"); - t_m_spWater2->Link(); + m_spWater = ResourceManager::Load("Shaders/Deferred/water/"); + m_spWater->Link(); + m_spWater2 = ResourceManager::Load("Shaders/Deferred/water2/"); + m_spWater2->Link(); // Pass #3: Combining into final image m_spDeferred3 = ResourceManager::Load("Shaders/Deferred/3/"); @@ -122,7 +122,7 @@ void dd::Renderer::CreateBuffers() m_UnitSphere = ResourceManager::Load("Models/Core/UnitSphere.obj"); m_StandardNormal = ResourceManager::Load("Textures/Core/NeutralNormalMap.png"); m_StandardSpecular = ResourceManager::Load("Textures/Core/NeutralSpecularMap.png"); - t_m_WhiteSphereTexture = ResourceManager::Load("Textures/Test/Water.png"); + m_WhiteSphereTexture = ResourceManager::Load("Textures/Test/Water.png"); glGenRenderbuffers(1, &m_rbDepthBuffer); glBindRenderbuffer(GL_RENDERBUFFER, m_rbDepthBuffer); @@ -157,8 +157,8 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glGenTextures(1, &t_m_Gwater); - glBindTexture(GL_TEXTURE_2D, t_m_Gwater); + glGenTextures(1, &m_Gwater); + glBindTexture(GL_TEXTURE_2D, m_Gwater); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -201,8 +201,8 @@ void dd::Renderer::CreateBuffers() } //Fill Water Texture - glGenTextures(1, &t_m_Gwater); - glBindTexture(GL_TEXTURE_2D, t_m_Gwater); + glGenTextures(1, &m_Gwater); + glBindTexture(GL_TEXTURE_2D, m_Gwater); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -210,9 +210,9 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Fill water pass - glGenFramebuffers(1, &t_m_fbWater); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWater); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_Gwater, 0); + glGenFramebuffers(1, &m_fbWater); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWater); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_Gwater, 0); GLenum waterPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, waterPassDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -221,8 +221,8 @@ void dd::Renderer::CreateBuffers() } //water Blur texture - glGenTextures(1, &t_m_BWater); - glBindTexture(GL_TEXTURE_2D, t_m_BWater); + glGenTextures(1, &m_BWater); + glBindTexture(GL_TEXTURE_2D, m_BWater); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -230,9 +230,9 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //Fill waterBlur pass - glGenFramebuffers(1, &t_m_fbWaterBlur); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_BWater, 0); + glGenFramebuffers(1, &m_fbWaterBlur); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWaterBlur); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_BWater, 0); GLenum waterBlurDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, waterBlurDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -241,8 +241,8 @@ void dd::Renderer::CreateBuffers() } //water Blur texture2 - glGenTextures(1, &t_m_BWater2); - glBindTexture(GL_TEXTURE_2D, t_m_BWater2); + glGenTextures(1, &m_BWater2); + glBindTexture(GL_TEXTURE_2D, m_BWater2); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthBuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); @@ -251,9 +251,9 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //Fill waterBlur pass2 - glGenFramebuffers(1, &t_m_fbWaterBlur2); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur2); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_BWater2, 0); + glGenFramebuffers(1, &m_fbWaterBlur2); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWaterBlur2); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_BWater2, 0); GLenum waterBlur2DrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, waterBlur2DrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -379,10 +379,10 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWater); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWater); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); - t_m_spWater->Bind(); + m_spWater->Bind(); DrawWater(objects); } @@ -499,7 +499,7 @@ void dd::Renderer::DrawLightSpheres(RenderQueue &lights) void dd::Renderer::DrawWater(RenderQueue &rq) { - GLuint shaderProgramHandle = *t_m_spWater; + GLuint shaderProgramHandle = *m_spWater; glm::mat4 projectionMatrix = m_Camera->ProjectionMatrix(); glm::mat4 viewMatrix = m_Camera->ViewMatrix(); @@ -517,7 +517,7 @@ void dd::Renderer::DrawWater(RenderQueue &rq) glm::value_ptr(viewMatrix)); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, *t_m_WhiteSphereTexture); + glBindTexture(GL_TEXTURE_2D, *m_WhiteSphereTexture); glBindVertexArray(m_UnitQuad->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_UnitQuad->ElementBuffer); @@ -528,16 +528,17 @@ void dd::Renderer::DrawWater(RenderQueue &rq) //blur1 - shaderProgramHandle = *t_m_spWater2; + shaderProgramHandle = *m_spWater2; glDisable(GL_CULL_FACE); glDepthMask(GL_FALSE); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWaterBlur); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); - t_m_spWater2->Bind(); + m_spWater2->Bind(); + //TODO: Add this in water particle component. Blurradius float radius = 3.f; glUniform2fv(glGetUniformLocation(shaderProgramHandle, "dir"), 1, glm::value_ptr(glm::vec2(1.0f, 0.0f))); @@ -545,64 +546,31 @@ void dd::Renderer::DrawWater(RenderQueue &rq) glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), radius); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, t_m_Gwater); + glBindTexture(GL_TEXTURE_2D, m_Gwater); glBindVertexArray(m_ScreenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); //blur2 - shaderProgramHandle = *t_m_spWater2; + shaderProgramHandle = *m_spWater2; glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); - t_m_spWater2->Bind(); + m_spWater2->Bind(); glUniform2fv(glGetUniformLocation(shaderProgramHandle, "dir"), 1, glm::value_ptr(glm::vec2(0.0f, 1.0f))); glUniform1f(glGetUniformLocation(shaderProgramHandle, "res"), m_Resolution.Height); glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), radius); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, t_m_BWater); + glBindTexture(GL_TEXTURE_2D, m_BWater); glBindVertexArray(m_ScreenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); } - - -GLuint dd::Renderer::CreateWaterParticleVAO(RenderQueue &particles) -{ - float waterVerts[particles.Size()]; - int i = 0; - - for ( auto &job : particles ) { - auto waterJob = std::dynamic_pointer_cast(job); - if (!waterJob) - continue; - waterVerts[i ] = waterJob->Position.x; - waterVerts[i+1] = waterJob->Position.y; - waterVerts[i+2] = waterJob->Position.z; - i+3; - } - - GLuint vbo[1], vao; - glGenBuffers(1, vbo); - glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); - glBufferData(GL_ARRAY_BUFFER, 3 * particles.Size() * sizeof(float), waterVerts, GL_STATIC_DRAW); - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); - glEnableVertexAttribArray(0); - - glBindVertexArray(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - return vao; -} - GLuint dd::Renderer::CreateQuad() { float quadVertices[] = @@ -667,10 +635,10 @@ void dd::Renderer::DebugKeys() m_CurrentScreenBuffer = m_tLighting; } if (glfwGetKey(m_Window, GLFW_KEY_F7)) { - m_CurrentScreenBuffer = t_m_Gwater; + m_CurrentScreenBuffer = m_Gwater; } if (glfwGetKey(m_Window, GLFW_KEY_F8)) { - m_CurrentScreenBuffer = t_m_BWater; + m_CurrentScreenBuffer = m_BWater; } } diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp old mode 100644 new mode 100755 index 7d23110..2206079 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -289,7 +289,6 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) { - //TODO: Lägg alla pd i en lista auto transform = m_World->GetComponent(e); if (!transform) { LOG_ERROR("No Transform component in CreateParticleGroup"); @@ -303,18 +302,15 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) pd.shape = &shape; pd.flags = b2_tensileParticle; pd.position.Set(transform->Position.x, transform->Position.y); - //TODO: PUT IN LIST - t_watergroup = m_ParticleSystem->CreateParticleGroup(pd); + t_ParticleGroup.push_back(m_ParticleSystem->CreateParticleGroup(pd)); b2Vec2* t_ParticlePositions = m_ParticleSystem->GetPositionBuffer(); for(int i = 0; i < m_ParticleSystem->GetParticleCount(); i++){ { auto t_waterparticle = m_World->CreateEntity(e); auto transformChild = m_World->AddComponent(t_waterparticle); - //auto sprite = m_World->AddComponent(t_waterparticle); transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); transformChild->Scale = glm::vec3(m_ParticleSystem->GetRadius())/transform->Scale; - //sprite->SpriteFile = "Textures/Ball.png"; m_World->CommitEntity(t_waterparticle); m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem->GetParticleHandleFromIndex(i))); @@ -322,7 +318,6 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) } } - LOG_INFO("ParticleCount: %i", m_ParticleSystem->GetParticleCount()); } dd::Systems::PhysicsSystem::~PhysicsSystem() From a1c709a2db40f2f78b36c7a42c26a67686d9980f Mon Sep 17 00:00:00 2001 From: tleety Date: Tue, 29 Sep 2015 11:10:08 +0200 Subject: [PATCH 05/18] Removed wierd glow on water --- include/Physics/CWaterVolume.h | 2 +- src/game/Core/Shaders/Deferred/water2/Fragment.glsl | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/Physics/CWaterVolume.h b/include/Physics/CWaterVolume.h index 33adcae..29692f6 100755 --- a/include/Physics/CWaterVolume.h +++ b/include/Physics/CWaterVolume.h @@ -9,7 +9,7 @@ namespace Components struct WaterVolume : public Component { - + float Radius; }; } diff --git a/src/game/Core/Shaders/Deferred/water2/Fragment.glsl b/src/game/Core/Shaders/Deferred/water2/Fragment.glsl index b82af8f..44beeed 100755 --- a/src/game/Core/Shaders/Deferred/water2/Fragment.glsl +++ b/src/game/Core/Shaders/Deferred/water2/Fragment.glsl @@ -61,9 +61,9 @@ void main() sum += texture(WaterTexture, vec2(tc.x + 3.0*blur*hstep, tc.y + 3.0*blur*vstep)) * 0.0540540541; sum += texture(WaterTexture, vec2(tc.x + 4.0*blur*hstep, tc.y + 4.0*blur*vstep)) * 0.0162162162; - frag_Diffuse = vec4(sum.rgb, 1.0) * vec4(0.0, 0.6, 1.5, 1.0); - float avgColor = frag_Diffuse.r + frag_Diffuse.g + frag_Diffuse.b; + float avgColor = sum.r + sum.g + sum.b; avgColor = avgColor/3; + frag_Diffuse = vec4(sum.r, sum.g, sum.b, 1.0); if ( avgColor*dir.y > Threshhold ){ frag_Diffuse = vec4(0.0, 0.3, 1.0, 1.0); } From c3b54ef030866412db465adcd333a9d46361f2b3 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Tue, 29 Sep 2015 14:42:01 +0200 Subject: [PATCH 06/18] Implemented Combos which multiply score. Adjusted pad a bit. --- include/Core/Engine.h | 4 +- include/Game/BallSystem.h | 17 +++++++-- include/Game/CBall.h | 1 + include/Game/CPad.h | 2 +- include/Game/EComboEvent.h | 27 +++++++++++++ include/Game/LevelSystem.h | 5 ++- include/Game/PadSystem.h | 1 + src/game/CMakeLists.txt | 3 +- src/game/Game/BallSystem.cpp | 71 +++++++++++++++++++++++++++++------ src/game/Game/LevelSystem.cpp | 56 ++++++++++++--------------- src/game/Game/PadSystem.cpp | 7 +++- 11 files changed, 137 insertions(+), 57 deletions(-) create mode 100644 include/Game/EComboEvent.h diff --git a/include/Core/Engine.h b/include/Core/Engine.h index ad45379..e001289 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -150,8 +150,8 @@ public: physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; physics->Calculate = true; - auto plight = m_World->AddComponent(ent); - plight->Radius = 2.f; + //auto plight = m_World->AddComponent(ent); + //plight->Radius = 2.f; m_World->CommitEntity(ent); } diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index ac34ab0..3ead5d8 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -5,6 +5,7 @@ #include "Core/World.h" #include "Core/EventBroker.h" #include "Core/CTransform.h" +#include "Core/CTemplate.h" #include "Physics/CPhysics.h" #include "Physics/CCircleShape.h" #include "Physics/EContact.h" @@ -12,17 +13,22 @@ #include "Rendering/CPointLight.h" #include "Game/CBall.h" #include "Game/CPowerUp.h" +#include "Game/CLife.h" #include "Game/ELifeLost.h" +#include "Game/EComboEvent.h" #include "Game/EResetBall.h" #include "Game/EMultiBall.h" #include "Game/EMultiBallLost.h" #include "Game/EGameOver.h" -namespace dd { +namespace dd +{ -namespace Systems { +namespace Systems +{ -class BallSystem : public System { +class BallSystem : public System +{ public: BallSystem(World *world, std::shared_ptr eventBroker) : System(world, eventBroker) { } @@ -49,9 +55,12 @@ public: void OnEntityRemoved(EntityID entity) override; EntityID CreateBall(); + void CreateLife(int); EntityID Ball() { return m_Ball; }; void SetBall(const EntityID& ball) { m_Ball = ball; } + float& XMovementMultiplier() { return m_XMovementMultiplier; } + void SetXMovementMultiplier(const float& xMovementMultiplier) { m_XMovementMultiplier = xMovementMultiplier; } float& EdgeX() { return m_EdgeX; } void SetEdgeX(const float& edgeX) { m_EdgeX = edgeX; } float& EdgeY() { return m_EdgeY; } @@ -68,6 +77,7 @@ public: void SetMultiBall(const bool& multiBall) { m_MultiBall = multiBall; } private: + float m_XMovementMultiplier = 2.f; float m_EdgeX = 3.2f; float m_EdgeY = 5.2f; int m_MultiBalls = 0; @@ -90,6 +100,7 @@ private: }; } + } #endif diff --git a/include/Game/CBall.h b/include/Game/CBall.h index 2990a3a..5dd1405 100644 --- a/include/Game/CBall.h +++ b/include/Game/CBall.h @@ -17,6 +17,7 @@ struct Ball : Component { int Number = 0; float Speed = 5.f; + int Combo = 0; }; } diff --git a/include/Game/CPad.h b/include/Game/CPad.h index f71c756..15afebd 100644 --- a/include/Game/CPad.h +++ b/include/Game/CPad.h @@ -22,7 +22,7 @@ struct Pad : Component float SlowdownModifier = 5.f; float AccelerationSpeed = 40.f; - float MaxSpeed = 20.f; + float MaxSpeed = 5.f; }; } diff --git a/include/Game/EComboEvent.h b/include/Game/EComboEvent.h new file mode 100644 index 0000000..7253f55 --- /dev/null +++ b/include/Game/EComboEvent.h @@ -0,0 +1,27 @@ +// +// Created by Adniklastrator on 2015-09-29. +// + +#ifndef DAYDREAM_ECOMBOEVENT_H +#define DAYDREAM_ECOMBOEVENT_H + +#include "Core/Entity.h" +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct ComboEvent : Event +{ + EntityID Ball; + int Combo; +}; + +} + +} + +#endif //DAYDREAM_ECOMBOEVENT_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index acf0129..6849d4f 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -7,6 +7,7 @@ #include "Core/System.h" #include "Core/CTransform.h" +#include "Core/CTemplate.h" #include "Core/EventBroker.h" #include "Core/World.h" #include "Rendering/CSprite.h" @@ -19,7 +20,7 @@ #include "Game/ELifeLost.h" #include "Game/EResetBall.h" #include "Game/EScoreEvent.h" -#include "Physics/CRectangleShape.h" +#include "Game/EComboEvent.h" #include "Game/EMultiBall.h" #include "Game/EMultiBallLost.h" #include "Game/EGameOver.h" @@ -28,6 +29,7 @@ #include "Game/Bricks/CPowerUpBrick.h" #include "Physics/CPhysics.h" #include "Physics/CCircleShape.h" +#include "Physics/CRectangleShape.h" #include "Physics/ESetImpulse.h" #include "Physics/EContact.h" #include "Sound/CCollisionSound.h" @@ -62,7 +64,6 @@ public: void Initialize() override; void CreateBasicLevel(int, int, glm::vec2, float); - void CreateLife(int); void SaveLevel(int, int, glm::vec2, int); // Shouldn't be here, but I'm experimenting. void LoadLevel(char[20]); void CreateBrick(int, int, glm::vec2, float, int); diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index ef9d9ef..9162083 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -9,6 +9,7 @@ #include "Core/System.h" #include "Core/Component.h" #include "Core/CTransform.h" +#include "Core/CTemplate.h" #include "Core/EventBroker.h" #include "Core/EKeyDown.h" #include "Core/EKeyUp.h" diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 0c8978c..8a8cca5 100755 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -94,8 +94,7 @@ set(SOURCE_FILES ${SOURCE_FILES_Physics} ${SOURCE_FILES_Game} ${SOURCE_FILES_Sound} - ${SOURCE_FILES_GUI} - ../../include/Game/EMultiBallLost.h) + ${SOURCE_FILES_GUI}) if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 4a4ba17..53206fb 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -18,6 +18,30 @@ void dd::Systems::BallSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EMultiBallLost, &BallSystem::OnMultiBallLost); EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &BallSystem::OnResetBall); EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &BallSystem::OnMultiBall); + + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(-0.f, 50.f, -10.f); + transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); + transform->Velocity = glm::vec3(0.0f, 0.f, 0.f); + auto model = m_World->AddComponent(ent); + model->ModelFile = "Models/Test/Ball/Ballopus.obj"; + std::shared_ptr circleShape = m_World->AddComponent(ent); + std::shared_ptr ball = m_World->AddComponent(ent); + ball->Speed = 5.f; + std::shared_ptr physics = m_World->AddComponent(ent); + std::shared_ptr ballTemplate = m_World->AddComponent(ent); + physics->Static = false; + physics->Category = CollisionLayer::Type::Ball; + physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; + physics->Calculate = true; + m_World->CommitEntity(ent); + + SetBall(ent); + + for (int i = 0; i < Lives(); i++) { + CreateLife(i); + } } void dd::Systems::BallSystem::Update(double dt) @@ -32,12 +56,10 @@ void dd::Systems::BallSystem::Update(double dt) void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + auto templateCheck = m_World->GetComponent(entity); + if (templateCheck != nullptr){ return; } auto ballComponent = m_World->GetComponent(entity); if (ballComponent != nullptr) { - if (Ball() == NULL) { - SetBall(entity); - } - if (ReplaceBall() == true) { SetReplaceBall(false); @@ -90,15 +112,15 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID } if (Lives() != PastLives()) { - /*auto life = m_World->GetComponent(entity); + auto life = m_World->GetComponent(entity); if (life != nullptr) { if (life->Number + 1 == PastLives()) { - /*m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity);*/ - SetPastLives(Lives()); - // } - //} + m_World->RemoveComponent(entity); + m_World->RemoveComponent(entity); + m_World->RemoveEntity(entity); + SetPastLives(Lives()); + } + } } if (ballComponent != nullptr) { @@ -163,11 +185,17 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) if (m_World->GetProperty(otherEntitiy, "Name") == "Pad"){ auto padTransform = m_World->GetComponent(otherEntitiy); - float x = ballTransform->Position.x - padTransform->Position.x; + float x = (ballTransform->Position.x - padTransform->Position.x) * XMovementMultiplier(); float y = glm::cos((abs(x) / (1.6f)) * glm::pi() / 2.f) + 1.f; ballTransform->Velocity = glm::normalize(glm::vec3(x, y ,0.f)) * ballComponent->Speed; + ballComponent->Combo = 0; + Events::ComboEvent ec; + ec.Combo = ballComponent->Combo; + ec.Ball = ballEntity; + EventBroker->Publish(ec); + //std::cout << "Combo: " << ballComponent->Combo << std::endl; } else { glm::vec2 reflectedVelocity = glm::reflect(ballVelocity, event.Normal); @@ -181,6 +209,8 @@ EntityID dd::Systems::BallSystem::CreateBall() { auto ent = m_World->CloneEntity(Ball()); + m_World->RemoveComponent(ent); + /* auto ent = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(ent); transform->Position = glm::vec3(0.5f, 0.26f, -10.f); @@ -205,6 +235,23 @@ EntityID dd::Systems::BallSystem::CreateBall() return ent; } +void dd::Systems::BallSystem::CreateLife(int number) +{ + auto life = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(life); + transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); + transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); + + std::shared_ptr lifeNr = m_World->AddComponent(life); + lifeNr->Number = number; + + auto model = m_World->AddComponent(life); + model->ModelFile = "Models/Test/Ball/Ballopus.obj"; + + + m_World->CommitEntity(life); +} + bool dd::Systems::BallSystem::OnLifeLost(const dd::Events::LifeLost &event) { SetLives(Lives() - 1); diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index 92c7549..2f62a46 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -17,30 +17,9 @@ void dd::Systems::LevelSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, &LevelSystem::OnPowerUpTaken); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &LevelSystem::OnStageCleared); - /*for (int i = 0; i < Lives(); i++) { - CreateLife(i); - }*/ - return; } -void dd::Systems::LevelSystem::CreateLife(int number) -{ - /*auto life = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(life); - transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); - transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); - - std::shared_ptr lifeNr = m_World->AddComponent(life); - lifeNr->Number = number; - - auto model = m_World->AddComponent(life); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - - - m_World->CommitEntity(life);*/ -} - void dd::Systems::LevelSystem::Update(double dt) { if (!m_Initialized) { @@ -51,6 +30,9 @@ void dd::Systems::LevelSystem::Update(double dt) void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + auto templateCheck = m_World->GetComponent(entity); + if (templateCheck != nullptr){ return; } + auto ball = m_World->GetComponent(entity); SetNotResettingTheStage(NotResettingTheStage() + 0.01 * dt); @@ -93,14 +75,14 @@ void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 s { SetNumberOfBricks(rows * lines); //std::cout << "You're only doing this once, right?" << std::endl; - int num = 0; + int num = Lines(); for (int i = 0; i < rows; i++) { - num++; + num--; for (int j = 0; j < Lines(); j++) { CreateBrick(i, j, spacesBetweenBricks, spaceToEdge, num); } - if (num == 7) - num = 0; + if (num == 1) + num = Lines(); } SetNumberOfBricks(rows * lines); @@ -121,9 +103,9 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe cPhys->Category = CollisionLayer::Type::Brick; cPhys->Mask = CollisionLayer::Type::Ball; - std::string fileName = "Textures/Bricks/"; + /*std::string fileName = "Textures/Bricks/"; fileName.append(std::to_string(num)); - fileName.append(".png"); + fileName.append(".png");*/ //sprite->SpriteFile = fileName; model->ModelFile = "Models/Test/Brick/Brick.obj"; if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 5 && row == 2)) { @@ -151,17 +133,17 @@ void dd::Systems::LevelSystem::ProcessCollision() void dd::Systems::LevelSystem::OnEntityRemoved(EntityID entity) { - auto brick = m_World->GetComponent(entity); + /*auto brick = m_World->GetComponent(entity); if (brick != nullptr) { SetNumberOfBricks(NumberOfBricks() - 1); Events::ScoreEvent es; es.Score = brick->Score; EventBroker->Publish(es); - /*if (numberOfBricks < 1) { + if (numberOfBricks < 1) { EndLevel(); - }*/ + } } - return; + return;*/ } bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) @@ -205,6 +187,12 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) } if (ball != nullptr && Restarting() == false) { + ball->Combo += 1; + Events::ComboEvent ec; + ec.Combo = ball->Combo; + ec.Ball = entityBall; + EventBroker->Publish(ec); + auto ballTransform = m_World->GetComponent(entityBall); // m_World->RemoveComponent(entityBrick); @@ -237,11 +225,13 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) //SetMultiBalls(MultiBalls() + 1); } Events::ScoreEvent es; - es.Score = brick->Score; + es.Score = brick->Score * ball->Combo; EventBroker->Publish(es); + std::cout << "Combo: " << ball->Combo << std::endl; //std::cout << NumberOfBricks() << std::endl; - //std::cout << "Score: " << Score() << std::endl; + //std::cout << "Brick Score: " << brick->Score << std::endl; + std::cout << "Score: " << Score() << std::endl; } return true; diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index b767c89..43c71e7 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -31,7 +31,8 @@ void dd::Systems::PadSystem::Initialize() void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { - + auto templateCheck = m_World->GetComponent(entity); + if (templateCheck != nullptr){ return; } } void dd::Systems::PadSystem::Update(double dt) @@ -59,7 +60,9 @@ void dd::Systems::PadSystem::Update(double dt) } transform->Position += transform->Velocity * (float)dt; transform->Velocity += acceleration * (float)dt; - transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float)dt; + if (glm::abs(transform->Velocity.x) > 1 || (!Left() && !Right())) { + transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float) dt; + } if (Left()) { acceleration.x = -pad->AccelerationSpeed; From 2491dd8b74089a8a56a0f761fbe4e6f78ebed70a Mon Sep 17 00:00:00 2001 From: tleety Date: Wed, 30 Sep 2015 10:29:56 +0200 Subject: [PATCH 07/18] Fixed some things, code up to styleguide --- include/Core/Renderer.h | 43 ++++---- include/Physics/PhysicsSystem.h | 3 +- src/game/Core/Renderer.cpp | 156 ++++++++++++++--------------- src/game/Physics/PhysicsSystem.cpp | 29 ++++-- 4 files changed, 117 insertions(+), 114 deletions(-) diff --git a/include/Core/Renderer.h b/include/Core/Renderer.h index 9b03627..33fb83a 100755 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -16,8 +16,8 @@ along with Daydream Engine. If not, see . */ -#ifndef Renderer_h__ -#define Renderer_h__ +#ifndef DD_RENDERER_H__ +#define DD_RENDERER_H__ #include "Util/Rectangle.h" #include "Camera.h" @@ -30,8 +30,6 @@ namespace dd class Renderer { public: - //Render(); - GLFWwindow* Window() const { return m_Window; } Rectangle Resolution() const { return m_Resolution; } void SetResolution(const Rectangle& resolution) { m_Resolution = resolution; } @@ -39,8 +37,6 @@ public: void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; } bool VSYNC() const { return m_VSYNC; } void SetVSYNC(bool vsync) { m_VSYNC = vsync; } - //void SetViewport(const Rectangle& viewport) { m_Viewport = viewport; } - //void SetScissor(const Rectangle& scissor) { m_Scissor = scissor; } const dd::Camera* Camera() const { return m_Camera; } void SetCamera(const dd::Camera* camera) { @@ -50,7 +46,6 @@ public: m_Camera = camera; } } - void Initialize(); void Draw(RenderQueueCollection& rq); @@ -58,8 +53,6 @@ private: Rectangle m_Resolution = Rectangle(1280, 720); bool m_Fullscreen = false; bool m_VSYNC = false; - //Rectangle m_Viewport; - //Rectangle m_Scissor; std::unique_ptr m_DefaultCamera = nullptr; const dd::Camera* m_Camera = nullptr; @@ -67,13 +60,13 @@ private: std::string m_GLVendor; GLFWwindow* m_Window = nullptr; - ShaderProgram* m_spDeferred1; - ShaderProgram* m_spDeferred2; - ShaderProgram* m_spDeferred3; - ShaderProgram* m_spForward; - ShaderProgram* m_spScreen; - ShaderProgram*m_spWater; - ShaderProgram*m_spWater2; + ShaderProgram* m_SpDeferred1; + ShaderProgram* m_SpDeferred2; + ShaderProgram* m_SpDeferred3; + ShaderProgram* m_SpForward; + ShaderProgram* m_SpScreen; + ShaderProgram* m_SpWater; + ShaderProgram* m_SpWater2; GLuint m_ScreenQuad = 0; Model* m_UnitSphere = nullptr; @@ -82,22 +75,22 @@ private: Texture* m_StandardSpecular; Texture* m_WhiteSphereTexture; - GLuint m_rbDepthBuffer = 0; //DepthBuffer Texture - GLuint m_fbDeferred1 = 0; //Framebuffer for first pass + GLuint m_RbDepthBuffer = 0; //DepthBuffer Texture + GLuint m_FbDeferred1 = 0; //Framebuffer for first pass GLuint m_GDiffuse = 0; //Texture for diffuseColors GLuint m_GPosition = 0; //Texture for positions GLuint m_GNormal = 0; //Texture for normals GLuint m_GSpecular = 0; //Texture for specular - GLuint m_fbDeferred2 = 0; //Framebuffer that handles the lighting pass - GLuint m_tLighting = 0; //Texture for the lighting pass - GLuint m_fbDeferred3 = 0; //Frambuffer for handling the last pass. - GLuint m_tFinal = 0; //Final Texture to be printed to screen + GLuint m_FbDeferred2 = 0; //Framebuffer that handles the lighting pass + GLuint m_TLighting = 0; //Texture for the lighting pass + GLuint m_FbDeferred3 = 0; //Frambuffer for handling the last pass. + GLuint m_TFinal = 0; //Final Texture to be printed to screen GLuint m_Gwater = 0; //Water Color Texture GLuint m_BWater; //Water blur texture GLuint m_BWater2; //Water blur texture - GLuint m_fbWater; //Waterpass Framebuffer - GLuint m_fbWaterBlur; //Waterpass Framebuffer - GLuint m_fbWaterBlur2; //Waterpass Framebuffer + GLuint m_FbWater; //Waterpass Framebuffer + GLuint m_FbWaterBlur; //Waterpass Framebuffer + GLuint m_FbWaterBlur2; //Waterpass Framebuffer GLuint m_CurrentScreenBuffer = 0; void LoadShaders(); diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index 412069d..79e1205 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -66,8 +66,9 @@ private: std::unordered_map m_BodiesToEntities; void CreateBody(EntityID entity); + void CreateParticleSystem(float radius); - b2ParticleSystem* m_ParticleSystem; + std::vector m_ParticleSystem; std::vector t_ParticleGroup; std::unordered_map m_EntitiesToParticleHandle; diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index cb997ce..caf1160 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -70,7 +70,7 @@ void dd::Renderer::Initialize() LoadShaders(); CreateBuffers(); - m_CurrentScreenBuffer = m_tFinal; + m_CurrentScreenBuffer = m_TFinal; } void dd::Renderer::LoadShaders() { @@ -79,39 +79,39 @@ void dd::Renderer::LoadShaders() */ // Pass #1: Fill G-buffers - m_spDeferred1 = ResourceManager::Load("Shaders/Deferred/1/"); - m_spDeferred1->BindFragDataLocation(0, "GDiffuse"); - m_spDeferred1->BindFragDataLocation(1, "GPosition"); - m_spDeferred1->BindFragDataLocation(2, "GNormal"); - m_spDeferred1->BindFragDataLocation(3, "GSpecular"); - m_spDeferred1->Link(); + m_SpDeferred1 = ResourceManager::Load("Shaders/Deferred/1/"); + m_SpDeferred1->BindFragDataLocation(0, "GDiffuse"); + m_SpDeferred1->BindFragDataLocation(1, "GPosition"); + m_SpDeferred1->BindFragDataLocation(2, "GNormal"); + m_SpDeferred1->BindFragDataLocation(3, "GSpecular"); + m_SpDeferred1->Link(); // Pass #2: Lighting - m_spDeferred2 = ResourceManager::Load("Shaders/Deferred/2/"); + m_SpDeferred2 = ResourceManager::Load("Shaders/Deferred/2/"); //glBindFragDataLocation(m_SPDeferred2, 0, "FragmentLighting"); - m_spDeferred2->Link(); + m_SpDeferred2->Link(); //Water Pass - m_spWater = ResourceManager::Load("Shaders/Deferred/water/"); - m_spWater->Link(); - m_spWater2 = ResourceManager::Load("Shaders/Deferred/water2/"); - m_spWater2->Link(); + m_SpWater = ResourceManager::Load("Shaders/Deferred/water/"); + m_SpWater->Link(); + m_SpWater2 = ResourceManager::Load("Shaders/Deferred/water2/"); + m_SpWater2->Link(); // Pass #3: Combining into final image - m_spDeferred3 = ResourceManager::Load("Shaders/Deferred/3/"); - m_spDeferred3->Link(); + m_SpDeferred3 = ResourceManager::Load("Shaders/Deferred/3/"); + m_SpDeferred3->Link(); /* Forward rendering */ - m_spForward = ResourceManager::Load("Shaders/Forward/"); - m_spForward->Link(); + m_SpForward = ResourceManager::Load("Shaders/Forward/"); + m_SpForward->Link(); /* Screen draw */ - m_spScreen = ResourceManager::Load("Shaders/Screen/"); - m_spScreen->Link(); + m_SpScreen = ResourceManager::Load("Shaders/Screen/"); + m_SpScreen->Link(); } void dd::Renderer::CreateBuffers() @@ -124,8 +124,8 @@ void dd::Renderer::CreateBuffers() m_StandardSpecular = ResourceManager::Load("Textures/Core/NeutralSpecularMap.png"); m_WhiteSphereTexture = ResourceManager::Load("Textures/Test/Water.png"); - glGenRenderbuffers(1, &m_rbDepthBuffer); - glBindRenderbuffer(GL_RENDERBUFFER, m_rbDepthBuffer); + glGenRenderbuffers(1, &m_RbDepthBuffer); + glBindRenderbuffer(GL_RENDERBUFFER, m_RbDepthBuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height); // Generate G-buffer textures @@ -166,9 +166,9 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Create first pass framebuffer - glGenFramebuffers(1, &m_fbDeferred1); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred1); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthBuffer); + glGenFramebuffers(1, &m_FbDeferred1); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred1); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RbDepthBuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_GDiffuse, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_GPosition, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, m_GNormal, 0); @@ -176,13 +176,13 @@ void dd::Renderer::CreateBuffers() GLenum firstPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; glDrawBuffers(4, firstPassDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - LOG_ERROR("m_fbDeferred1 incomplete: 0x%x\n", fbStatus); + LOG_ERROR("m_FbDeferred1 incomplete: 0x%x\n", fbStatus); exit(EXIT_FAILURE); } // Generate lighting texture - glGenTextures(1, &m_tLighting); - glBindTexture(GL_TEXTURE_2D, m_tLighting); + glGenTextures(1, &m_TLighting); + glBindTexture(GL_TEXTURE_2D, m_TLighting); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -190,13 +190,13 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Create second pass framebuffer - glGenFramebuffers(1, &m_fbDeferred2); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred2); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_tLighting, 0); + glGenFramebuffers(1, &m_FbDeferred2); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred2); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TLighting, 0); GLenum secondPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, secondPassDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - LOG_ERROR("m_fbDeferred2 incomplete: 0x%x\n", fbStatus); + LOG_ERROR("m_FbDeferred2 incomplete: 0x%x\n", fbStatus); exit(EXIT_FAILURE); } @@ -210,13 +210,13 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Fill water pass - glGenFramebuffers(1, &m_fbWater); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbWater); + glGenFramebuffers(1, &m_FbWater); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbWater); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_Gwater, 0); GLenum waterPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, waterPassDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - LOG_ERROR("m_fbDeferred2 incomplete: 0x%x\n", fbStatus); + LOG_ERROR("m_FbDeferred2 incomplete: 0x%x\n", fbStatus); exit(EXIT_FAILURE); } @@ -230,20 +230,20 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //Fill waterBlur pass - glGenFramebuffers(1, &m_fbWaterBlur); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbWaterBlur); + glGenFramebuffers(1, &m_FbWaterBlur); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbWaterBlur); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_BWater, 0); GLenum waterBlurDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, waterBlurDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - LOG_ERROR("m_fbDeferred2 incomplete: 0x%x\n", fbStatus); + LOG_ERROR("m_FbDeferred2 incomplete: 0x%x\n", fbStatus); exit(EXIT_FAILURE); } //water Blur texture2 glGenTextures(1, &m_BWater2); glBindTexture(GL_TEXTURE_2D, m_BWater2); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthBuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RbDepthBuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -251,19 +251,19 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //Fill waterBlur pass2 - glGenFramebuffers(1, &m_fbWaterBlur2); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbWaterBlur2); + glGenFramebuffers(1, &m_FbWaterBlur2); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbWaterBlur2); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_BWater2, 0); GLenum waterBlur2DrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, waterBlur2DrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - LOG_ERROR("m_fbDeferred2 incomplete: 0x%x\n", fbStatus); + LOG_ERROR("m_FbDeferred2 incomplete: 0x%x\n", fbStatus); exit(EXIT_FAILURE); } // Generate final deferred texture - glGenTextures(1, &m_tFinal); - glBindTexture(GL_TEXTURE_2D, m_tFinal); + glGenTextures(1, &m_TFinal); + glBindTexture(GL_TEXTURE_2D, m_TFinal); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -271,14 +271,14 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Create third pass framebuffer - glGenFramebuffers(1, &m_fbDeferred3); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthBuffer); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_tFinal, 0); + glGenFramebuffers(1, &m_FbDeferred3); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred3); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RbDepthBuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TFinal, 0); GLenum thirdPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, thirdPassDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - LOG_ERROR("m_fbDeferred3 incomplete: 0x%x\n", fbStatus); + LOG_ERROR("m_FbDeferred3 incomplete: 0x%x\n", fbStatus); exit(EXIT_FAILURE); } } @@ -298,7 +298,7 @@ void dd::Renderer::Draw(RenderQueueCollection& rq) glBindFramebuffer(GL_FRAMEBUFFER, 0); glClearColor(1, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); - m_spScreen->Bind(); + m_SpScreen->Bind(); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_CurrentScreenBuffer); glBindVertexArray(m_ScreenQuad); @@ -317,12 +317,12 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred1); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred1); glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_spDeferred1->Bind(); - DrawScene(objects, *m_spDeferred1); + m_SpDeferred1->Bind(); + DrawScene(objects, *m_SpDeferred1); // Pass #2: Lighting glEnable(GL_CULL_FACE); @@ -332,24 +332,24 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) glBlendEquation(GL_FUNC_ADD); glBlendFunc(GL_ONE, GL_ONE); glDepthMask(GL_FALSE); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred2); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred2); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); - m_spDeferred2->Bind(); + m_SpDeferred2->Bind(); DrawLightSpheres(lights); // Pass #3: Combine into final deferred image glCullFace(GL_BACK); glDisable(GL_BLEND); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred3); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); - m_spDeferred3->Bind(); - glUniform3fv(glGetUniformLocation(*m_spDeferred3, "La"), 1, glm::value_ptr(glm::vec3(0.5f))); + m_SpDeferred3->Bind(); + glUniform3fv(glGetUniformLocation(*m_SpDeferred3, "La"), 1, glm::value_ptr(glm::vec3(0.5f))); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GDiffuse); glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, m_tLighting); + glBindTexture(GL_TEXTURE_2D, m_TLighting); glBindVertexArray(m_ScreenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); } @@ -365,12 +365,12 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) //glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred3); // glClearColor(1, 0.9, 0.8f, 1); // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_spForward->Bind(); - DrawScene(objects, *m_spForward); + m_SpForward->Bind(); + DrawScene(objects, *m_SpForward); //WaterPass glDisable(GL_CULL_FACE); @@ -379,10 +379,10 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbWater); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbWater); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); - m_spWater->Bind(); + m_SpWater->Bind(); DrawWater(objects); } @@ -462,7 +462,7 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) void dd::Renderer::DrawLightSpheres(RenderQueue &lights) { - GLuint shaderProgramHandle = *m_spDeferred2; + GLuint shaderProgramHandle = *m_SpDeferred2; glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GPosition); @@ -499,7 +499,7 @@ void dd::Renderer::DrawLightSpheres(RenderQueue &lights) void dd::Renderer::DrawWater(RenderQueue &rq) { - GLuint shaderProgramHandle = *m_spWater; + GLuint shaderProgramHandle = *m_SpWater; glm::mat4 projectionMatrix = m_Camera->ProjectionMatrix(); glm::mat4 viewMatrix = m_Camera->ViewMatrix(); @@ -528,16 +528,16 @@ void dd::Renderer::DrawWater(RenderQueue &rq) //blur1 - shaderProgramHandle = *m_spWater2; + shaderProgramHandle = *m_SpWater2; glDisable(GL_CULL_FACE); glDepthMask(GL_FALSE); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbWaterBlur); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbWaterBlur); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); - m_spWater2->Bind(); + m_SpWater2->Bind(); //TODO: Add this in water particle component. Blurradius float radius = 3.f; @@ -552,14 +552,14 @@ void dd::Renderer::DrawWater(RenderQueue &rq) //blur2 - shaderProgramHandle = *m_spWater2; + shaderProgramHandle = *m_SpWater2; glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); - glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); - m_spWater2->Bind(); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred3); + m_SpWater2->Bind(); glUniform2fv(glGetUniformLocation(shaderProgramHandle, "dir"), 1, glm::value_ptr(glm::vec2(0.0f, 1.0f))); glUniform1f(glGetUniformLocation(shaderProgramHandle, "res"), m_Resolution.Height); @@ -617,7 +617,7 @@ GLuint dd::Renderer::CreateQuad() void dd::Renderer::DebugKeys() { if (glfwGetKey(m_Window, GLFW_KEY_F1)) { - m_CurrentScreenBuffer = m_tFinal; + m_CurrentScreenBuffer = m_TFinal; } if (glfwGetKey(m_Window, GLFW_KEY_F2)) { m_CurrentScreenBuffer = m_GDiffuse; @@ -632,7 +632,7 @@ void dd::Renderer::DebugKeys() m_CurrentScreenBuffer = m_GSpecular; } if (glfwGetKey(m_Window, GLFW_KEY_F6)) { - m_CurrentScreenBuffer = m_tLighting; + m_CurrentScreenBuffer = m_TLighting; } if (glfwGetKey(m_Window, GLFW_KEY_F7)) { m_CurrentScreenBuffer = m_Gwater; @@ -644,7 +644,7 @@ void dd::Renderer::DebugKeys() void dd::Renderer::DrawGUI(dd::RenderQueue& rq) { - glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); + glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred3); glDisable(GL_CULL_FACE); glCullFace(GL_BACK); glDisable(GL_DEPTH_TEST); @@ -652,7 +652,7 @@ void dd::Renderer::DrawGUI(dd::RenderQueue& rq) //glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE); - m_spScreen->Bind(); + m_SpScreen->Bind(); glm::mat4 MVP; @@ -664,9 +664,9 @@ void dd::Renderer::DrawGUI(dd::RenderQueue& rq) glm::mat4 PV = glm::mat4(1); //frameJob->ProjectionMatrix * viewMatrix; glm::mat4 modelMatrix = glm::mat4(1); //frameJob->ModelMatrix; MVP = PV * modelMatrix; - glUniformMatrix4fv(glGetUniformLocation(*m_spScreen, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); - glUniformMatrix4fv(glGetUniformLocation(*m_spScreen, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); - glUniformMatrix4fv(glGetUniformLocation(*m_spScreen, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); + glUniformMatrix4fv(glGetUniformLocation(*m_SpScreen, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); + glUniformMatrix4fv(glGetUniformLocation(*m_SpScreen, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(*m_SpScreen, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, frameJob->DiffuseTexture); diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 2206079..c8623b4 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -29,10 +29,10 @@ void dd::Systems::PhysicsSystem::Initialize() void dd::Systems::PhysicsSystem::InitializeWater() { - b2ParticleSystemDef m_ParticleSystemDef; - m_ParticleSystemDef.radius = 0.13f; + float radius = 0.13f; - m_ParticleSystem = m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); + + CreateParticleSystem(radius); } bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) @@ -148,7 +148,7 @@ void dd::Systems::PhysicsSystem::Update(double dt) } - b2Vec2* positionBuffer = m_ParticleSystem->GetPositionBuffer(); + b2Vec2* positionBuffer = m_ParticleSystem[0]->GetPositionBuffer(); for (auto i : m_EntitiesToParticleHandle) { EntityID entity = i.first; b2ParticleHandle* particleH = i.second; @@ -297,29 +297,38 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) b2ParticleGroupDef pd; b2PolygonShape shape; + //TODO: FIX SO IT CAN NOTICE WHAT PARTICLE SYSTEM IS WATER! [0] IS A FUCKING BULLSHIT FIX. shape.SetAsBox(transform->Scale.x/2.f, transform->Scale.y/2.f); pd.shape = &shape; pd.flags = b2_tensileParticle; pd.position.Set(transform->Position.x, transform->Position.y); - t_ParticleGroup.push_back(m_ParticleSystem->CreateParticleGroup(pd)); - b2Vec2* t_ParticlePositions = m_ParticleSystem->GetPositionBuffer(); - for(int i = 0; i < m_ParticleSystem->GetParticleCount(); i++){ + t_ParticleGroup.push_back(m_ParticleSystem[0]->CreateParticleGroup(pd)); + b2Vec2* t_ParticlePositions = m_ParticleSystem[0]->GetPositionBuffer(); + for(int i = 0; i < m_ParticleSystem[0]->GetParticleCount(); i++){ { auto t_waterparticle = m_World->CreateEntity(e); auto transformChild = m_World->AddComponent(t_waterparticle); transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); - transformChild->Scale = glm::vec3(m_ParticleSystem->GetRadius())/transform->Scale; + transformChild->Scale = glm::vec3(m_ParticleSystem[0]->GetRadius())/transform->Scale; m_World->CommitEntity(t_waterparticle); - m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem->GetParticleHandleFromIndex(i))); - m_ParticleHandleToEntities.insert(std::make_pair( m_ParticleSystem->GetParticleHandleFromIndex(i), t_waterparticle)); + m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem[0]->GetParticleHandleFromIndex(i))); + m_ParticleHandleToEntities.insert(std::make_pair( m_ParticleSystem[0]->GetParticleHandleFromIndex(i), t_waterparticle)); } } } +void dd::Systems::PhysicsSystem::CreateParticleSystem(float radius) +{ + b2ParticleSystemDef m_ParticleSystemDef; + m_ParticleSystemDef.radius = radius; + + m_ParticleSystem.push_back(m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef)); +} + dd::Systems::PhysicsSystem::~PhysicsSystem() { if (m_ContactListener != nullptr) { From 2fb16357fa469363d6e902fc874a72b922484a7d Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Wed, 30 Sep 2015 10:32:17 +0200 Subject: [PATCH 08/18] Moved pad-creation to PadSystem. Pad now stops at sides. --- include/Core/Engine.h | 26 +++----------------------- include/Game/PadSystem.h | 3 +++ src/game/Game/PadSystem.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index d2e1519..f556bc5 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -111,10 +111,6 @@ public: m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); - m_World->SystemFactory.Register( - [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - m_World->SystemFactory.Register( [this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); @@ -124,6 +120,9 @@ public: m_World->SystemFactory.Register( [this]() { return new Systems::BallSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); @@ -320,25 +319,6 @@ public: m_World->CommitEntity(rightWall); } - { - auto ent = m_World->CreateEntity(); - m_World->SetProperty(ent, "Name", "Pad"); - auto ctransform = m_World->AddComponent(ent); - ctransform->Position = glm::vec3(0.f, -3.5f, -10.f); - ctransform->Scale = glm::vec3(1.0f, 1.0f, 1.f); - auto rectangle = m_World->AddComponent(ent); - auto physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Pad; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::PowerUp; - physics->Calculate = true; - auto cModel = m_World->AddComponent(ent); - cModel->ModelFile = "Models/Submarine2.obj"; - - auto pad = m_World->AddComponent(ent); - m_World->CommitEntity(ent); - } - //EVENT_SUBSCRIBE_MEMBER(m_EGameStart, &Engine::OnGameStart); m_EGameStart = decltype(m_EGameStart)(std::bind(&Engine::OnGameStart, this, std::placeholders::_1)); diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 9162083..6f2d13a 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -55,6 +55,8 @@ public: void SetLeft(const bool& left) { m_Left = left; } bool Right() const { return m_Right; } void SetRight(const bool& right) { m_Right = right; } + float Edge() const { return m_Edge; } + void SetEdge(const float& edge) { m_Edge = edge; } Components::Transform* Transform() const { return m_Transform; } void SetTransform(Components::Transform* transform) { m_Transform = transform; } @@ -66,6 +68,7 @@ private: glm::vec3 m_Acceleration = glm::vec3(0.f, 0.f, 0.f); bool m_Left = false; bool m_Right = false; + float m_Edge = 2.8f; Components::Transform* m_Transform; Components::Pad* m_Pad; diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 43c71e7..34e5bb9 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -27,6 +27,27 @@ void dd::Systems::PadSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EContact, &PadSystem::OnContact); EVENT_SUBSCRIBE_MEMBER(m_EContactPowerUp, &PadSystem::OnContactPowerUp); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &PadSystem::OnStageCleared); + + { + auto ent = m_World->CreateEntity(); + m_World->SetProperty(ent, "Name", "Pad"); + auto ctransform = m_World->AddComponent(ent); + ctransform->Position = glm::vec3(0.f, -3.5f, -10.f); + ctransform->Scale = glm::vec3(1.0f, 1.0f, 1.f); + auto rectangle = m_World->AddComponent(ent); + auto physics = m_World->AddComponent(ent); + physics->Static = false; + physics->Category = CollisionLayer::Type::Pad; + physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::PowerUp; + physics->Calculate = true; + auto cModel = m_World->AddComponent(ent); + cModel->ModelFile = "Models/Submarine2.obj"; + + auto pad = m_World->AddComponent(ent); + m_World->CommitEntity(ent); + + SetEdge(3.2 - (ctransform->Scale.x / 2)); + } } void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -59,6 +80,11 @@ void dd::Systems::PadSystem::Update(double dt) transform->Velocity.x = pad->MaxSpeed; } transform->Position += transform->Velocity * (float)dt; + if (transform->Position.x > Edge()) { + transform->Position.x = Edge(); + } else if (transform->Position.x < -Edge()) { + transform->Position.x = -Edge(); + } transform->Velocity += acceleration * (float)dt; if (glm::abs(transform->Velocity.x) > 1 || (!Left() && !Right())) { transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float) dt; From d1dde9459f43ec6d0e11d4c07bee02faaf678397 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 11:01:18 +0200 Subject: [PATCH 09/18] Added FPS counter --- include/Game/FPSCounter.h | 42 +++++++++++++++++++++++++++++++++++++++ include/Game/HUD.h | 4 ++++ 2 files changed, 46 insertions(+) create mode 100644 include/Game/FPSCounter.h diff --git a/include/Game/FPSCounter.h b/include/Game/FPSCounter.h new file mode 100644 index 0000000..6dd4b49 --- /dev/null +++ b/include/Game/FPSCounter.h @@ -0,0 +1,42 @@ +#ifndef GUI_FPSCOUNTER_H__ +#define GUI_FPSCOUNTER_H__ + +#include "GUI/Frame.h" +#include "GUI/NumberFrame.h" + +namespace dd +{ +namespace GUI +{ + +class FPSCounter : public Frame +{ +public: + FPSCounter(Frame* parent, std::string name) + : Frame(parent, name) + { + m_Numbers = new GUI::NumberFrame(this, "FPSCounterNumberFrame"); + } + + virtual void Update(double dt) + { + m_NumFrames++; + m_Accum += dt; + + m_Numbers->SetNumber(1.0/(m_Accum/m_NumFrames)); + if (m_NumFrames % 20) { + //LOG_INFO("FPS: %f", 1.0/(m_Accum/m_NumFrames)); + } + } + +private: + NumberFrame* m_Numbers = nullptr; + + double m_Accum = 0.0; + int m_NumFrames = 0; +}; + +} +} +#endif + diff --git a/include/Game/HUD.h b/include/Game/HUD.h index 2a240b3..30afcf6 100644 --- a/include/Game/HUD.h +++ b/include/Game/HUD.h @@ -6,6 +6,7 @@ #include "GUI/NumberFrame.h" #include "Core/EKeyUp.h" #include "Game/EScoreEvent.h" +#include "Game/FPSCounter.h" namespace dd { @@ -31,6 +32,8 @@ public: m_ScoreNumberFrame->X = 15; m_ScoreNumberFrame->Y = 21; + //m_FPSCounter = new GUI::FPSCounter(this, "FPSCounter"); + EVENT_SUBSCRIBE_MEMBER(m_EScore, &HUD::OnScore); } @@ -38,6 +41,7 @@ private: TextureFrame* m_LevelIndicator = nullptr; TextureFrame* m_ScoreIndicator = nullptr; NumberFrame* m_ScoreNumberFrame = nullptr; + FPSCounter* m_FPSCounter = nullptr; EventRelay m_EScore; From b42a09fce1843cab4b943e6377d1b165839eb9d7 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 11:01:33 +0200 Subject: [PATCH 10/18] Semi-working number frame --- include/GUI/NumberFrame.h | 118 ++++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 38 deletions(-) diff --git a/include/GUI/NumberFrame.h b/include/GUI/NumberFrame.h index ac51aed..dae825d 100644 --- a/include/GUI/NumberFrame.h +++ b/include/GUI/NumberFrame.h @@ -1,6 +1,8 @@ #ifndef GUI_NUMBERFRAME_H__ #define GUI_NUMBERFRAME_H__ +#include + #include "GUI/TextureFrame.h" namespace dd @@ -26,20 +28,20 @@ public: m_NumberTextures[9] = "Textures/GUI/Numbers/N9.png"; // Create number frame if missing - for (int i = 0; i < 10; i++) { - auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); - frame->SetTexture(m_NumberTextures[0]); - frame->DisableScissor(); - // Position frame based on alignment - if (i > 0) { - frame->X = i * 20; - } - Width += frame->Width; - if (Height < frame->Height) { - Height = frame->Height; - } - m_NumberFrames.push_front(frame); - } +// for (int i = 0; i < 10; i++) { +// auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); +// frame->SetTexture(m_NumberTextures[0]); +// frame->DisableScissor(); +// // Position frame based on alignment +// if (i > 0) { +// frame->SetLeft(m_NumberFrames[0]->Right()); +// } +// Width += frame->Width; +// if (Height < frame->Height) { +// Height = frame->Height; +// } +// m_NumberFrames.push_front(frame); +// } SetNumber(0); } @@ -50,41 +52,80 @@ public: m_Number = number; // Clear number textures - //for (auto& frame : m_NumberFrames) { - // frame->SetTexture(""); - //} + for (auto& frame : m_NumberFrames) { + frame->SetTexture(""); + } - //Width = 0; - //Height = 0; + Width = 0; + Height = 0; + + std::string digits = std::to_string(number); + + Width = 0; + Height = 0; + + std::string digits = std::to_string(number); + + + int i = 0; + for (char& c : digits) { + // Create number frame if missing + if (i >= m_NumberFrames.size()) { + auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); + if (i > 0) { + frame->SetLeft(m_NumberFrames[i - 1]->Right()); + } + frame->DisableScissor(); + m_NumberFrames.push_back(frame); + } + + // Update value + std::string texture = "Textures/Core/ErrorTexture.png"; + if (m_CharacterTextures.find(c) != m_CharacterTextures.end()) { + texture = m_CharacterTextures.at(c); + } + m_NumberFrames[i]->SetTexture(m_CharacterTextures.at(c)); + Width += m_NumberFrames[i]->Width; + if (Height < m_NumberFrames[i]->Height) { + Height = m_NumberFrames[i]->Height; + } + + i++; + } int n = 0; do { -// // Create number frame if missing -// if (m_NumberFrames.size() <= n) { -// auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); -// frame->DisableScissor(); -// m_NumberFrames.push_front(frame); -// } + // Create number frame if missing + if (m_NumberFrames.size() <= n) { + auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); + frame->DisableScissor(); + m_NumberFrames.push_back(frame); + } + + int digit = number % 10; // Update value - int digit = number % 10; m_NumberFrames[n]->SetTexture(m_NumberTextures[digit]); - //Width += m_NumberFrames[n]->Width; - //if (Height < m_NumberFrames[n]->Height) { - // Height = m_NumberFrames[n]->Height; - //} -// // Position frame based on alignment -// if (n > 0) { -// if (!m_LeftAligned) { -// m_NumberFrames[n]->SetLeft(m_NumberFrames[n - 1]->Right()); -// } else { -// m_NumberFrames[n]->SetRight(m_NumberFrames[n - 1]->Left()); -// } -// } + Width += m_NumberFrames[n]->Width; + if (Height < m_NumberFrames[n]->Height) { + Height = m_NumberFrames[n]->Height; + } + // Position frame based on alignment + if (n > 0) { + if (m_LeftAligned) { + m_NumberFrames[n]->SetLeft(m_NumberFrames[n - 1]->Right()); + } else { + m_NumberFrames[n]->SetRight(m_NumberFrames[n - 1]->Left()); + } + } + + ss << digit; number /= 10; n++; } while (number > 0); + + LOG_DEBUG("Number: %s", ss.str().c_str()); } void SetLeftAlign() { m_LeftAligned = true; } @@ -100,6 +141,7 @@ private: bool m_LeftAligned = true; std::string m_NumberTextures[10]; + std::unordered_map m_CharacterTextures; std::deque m_NumberFrames; }; From ff27eafccffc7137dec13c9fa1f00d211725fa46 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 13:09:27 +0200 Subject: [PATCH 11/18] WORKING number frame --- include/GUI/NumberFrame.h | 60 +++++++-------------------------------- 1 file changed, 10 insertions(+), 50 deletions(-) diff --git a/include/GUI/NumberFrame.h b/include/GUI/NumberFrame.h index dae825d..d1717b1 100644 --- a/include/GUI/NumberFrame.h +++ b/include/GUI/NumberFrame.h @@ -16,16 +16,16 @@ public: NumberFrame(Frame* parent, std::string name) : Frame(parent, name) { - m_NumberTextures[0] = "Textures/GUI/Numbers/N0.png"; - m_NumberTextures[1] = "Textures/GUI/Numbers/N1.png"; - m_NumberTextures[2] = "Textures/GUI/Numbers/N2.png"; - m_NumberTextures[3] = "Textures/GUI/Numbers/N3.png"; - m_NumberTextures[4] = "Textures/GUI/Numbers/N4.png"; - m_NumberTextures[5] = "Textures/GUI/Numbers/N5.png"; - m_NumberTextures[6] = "Textures/GUI/Numbers/N6.png"; - m_NumberTextures[7] = "Textures/GUI/Numbers/N7.png"; - m_NumberTextures[8] = "Textures/GUI/Numbers/N8.png"; - m_NumberTextures[9] = "Textures/GUI/Numbers/N9.png"; + m_CharacterTextures['0'] = "Textures/GUI/Numbers/N0.png"; + m_CharacterTextures['1'] = "Textures/GUI/Numbers/N1.png"; + m_CharacterTextures['2'] = "Textures/GUI/Numbers/N2.png"; + m_CharacterTextures['3'] = "Textures/GUI/Numbers/N3.png"; + m_CharacterTextures['4'] = "Textures/GUI/Numbers/N4.png"; + m_CharacterTextures['5'] = "Textures/GUI/Numbers/N5.png"; + m_CharacterTextures['6'] = "Textures/GUI/Numbers/N6.png"; + m_CharacterTextures['7'] = "Textures/GUI/Numbers/N7.png"; + m_CharacterTextures['8'] = "Textures/GUI/Numbers/N8.png"; + m_CharacterTextures['9'] = "Textures/GUI/Numbers/N9.png"; // Create number frame if missing // for (int i = 0; i < 10; i++) { @@ -61,12 +61,6 @@ public: std::string digits = std::to_string(number); - Width = 0; - Height = 0; - - std::string digits = std::to_string(number); - - int i = 0; for (char& c : digits) { // Create number frame if missing @@ -92,40 +86,6 @@ public: i++; } - - int n = 0; - do { - // Create number frame if missing - if (m_NumberFrames.size() <= n) { - auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); - frame->DisableScissor(); - m_NumberFrames.push_back(frame); - } - - int digit = number % 10; - - // Update value - m_NumberFrames[n]->SetTexture(m_NumberTextures[digit]); - Width += m_NumberFrames[n]->Width; - if (Height < m_NumberFrames[n]->Height) { - Height = m_NumberFrames[n]->Height; - } - // Position frame based on alignment - if (n > 0) { - if (m_LeftAligned) { - m_NumberFrames[n]->SetLeft(m_NumberFrames[n - 1]->Right()); - } else { - m_NumberFrames[n]->SetRight(m_NumberFrames[n - 1]->Left()); - } - } - - ss << digit; - - number /= 10; - n++; - } while (number > 0); - - LOG_DEBUG("Number: %s", ss.str().c_str()); } void SetLeftAlign() { m_LeftAligned = true; } From 52dec869256153b7e35125641a3c1eebf2b2259b Mon Sep 17 00:00:00 2001 From: tleety Date: Thu, 1 Oct 2015 14:14:51 +0200 Subject: [PATCH 12/18] Particle system up and running, but with bugged rendering --- include/Core/Engine.h | 62 ++++++--- include/Physics/CParticle.h | 65 ++++++++++ include/Physics/CParticleEmitter.h | 25 ++++ include/Physics/PhysicsSystem.h | 22 +++- src/game/Core/Renderer.cpp | 3 +- src/game/Physics/PhysicsSystem.cpp | 201 +++++++++++++++++++++-------- 6 files changed, 306 insertions(+), 72 deletions(-) create mode 100755 include/Physics/CParticle.h create mode 100755 include/Physics/CParticleEmitter.h diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 45a9dcc..8245052 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -52,6 +52,8 @@ #include "Physics/CRectangleShape.h" #include "Physics/ESetImpulse.h" #include "Physics/CWaterVolume.h" +#include "Physics/CParticle.h" +#include "Physics/CParticleEmitter.h" #include "Game/EGameStart.h" #include "Sound/EPlaySound.h" @@ -129,6 +131,8 @@ public: m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); m_World->Initialize(); @@ -165,7 +169,7 @@ public: pl->Radius = 20.f; pl->Diffuse = glm::vec3(0.8f, 0.7f, 0.05f); auto model = m_World->AddComponent(t_Light); - model->ModelFile = "Core/UnitSphere.obj"; + model->ModelFile = "Models/Core/UnitSphere.obj"; m_World->CommitEntity(t_Light); } { @@ -176,7 +180,7 @@ public: pl->Radius = 15.f; pl->Diffuse = glm::vec3(0.1f, 0.5f, 0.8f); auto model = m_World->AddComponent(t_Light); - model->ModelFile = "Core/UnitSphere.obj"; + model->ModelFile = "Models/Core/UnitSphere.obj"; m_World->CommitEntity(t_Light); } @@ -188,7 +192,7 @@ public: transform->Scale = glm::vec3(6.f, 6.f, 10.f); auto model = m_World->AddComponent(t_halfPipe); model->ModelFile = "Models/Test/halfpipe/Halfpipe.obj"; - model->Color = glm::vec4(1.f, 1.f, 1.f, 0.3f); + model->Color = glm::vec4(1.f, 0.f, 0.f, 0.3f); m_World->CommitEntity(t_halfPipe); } @@ -203,16 +207,44 @@ public: m_World->CommitEntity(background); } - //Water test - { - auto t_waterBody = m_World->CreateEntity(); - auto transform = m_World->AddComponent(t_waterBody); - transform->Position = glm::vec3(0.f, -0.5f, -10.f); - transform->Scale = glm::vec3(1.f, 1.f, 1.f); - auto water = m_World->AddComponent(t_waterBody); - auto body = m_World->AddComponent(t_waterBody); - m_World->CommitEntity(t_waterBody); - } + //ParticleTest +// { +// auto Pe = m_World->CreateEntity(); +// auto transform = m_World->AddComponent(Pe); +// auto particleEmitter= m_World->AddComponent(Pe); +// +// transform->Position = glm::vec3(0.f, -5.f, -10.f); +// particleEmitter->GravityScale = 0.0f; +// particleEmitter->SpawnRate = 1.0f; +// +// { +// auto Pt = m_World->CreateEntity(Pe); +// auto PtTransform = m_World->AddComponent(Pt); +// auto PtSprite = m_World->AddComponent(Pt); +// //auto PtModel = m_World->AddComponent(Pt); +// auto PtParticle = m_World->AddComponent(Pt); +// auto PtTemplate = m_World->AddComponent(Pt); +// +// PtTransform->Velocity = glm::vec3(1.0f, 0.f, 0.f); +// PtTransform->Position = transform->Position; +// PtSprite->SpriteFile = "Textures/Ball.png"; +// +// //PtModel->ModelFile = "Models/Brick/Brick.obj"; +// PtParticle->LifeTime = 1000.f; +// PtParticle->Flags = ParticleFlags::Type::powderParticle; +// } +// m_World->CommitEntity(Pe); +// } + +// { +// auto Pt = m_World->CreateEntity(); +// auto PtTransform = m_World->AddComponent(Pt); +// auto PtSprite = m_World->AddComponent(Pt); +// +// PtTransform->Position = glm::vec3(2.f, 0.f, -10.f); +// PtSprite->SpriteFile = "Textures/Ball.png"; +// } + //Water test { auto t_waterBody = m_World->CreateEntity(); @@ -371,7 +403,7 @@ public: // Swap event queues to get fresh input data in the read queue //m_EventBroker->Swap(); - ResourceManager::Update(); + //ResourceManager::Update(); if (m_GameIsRunning) { m_World->Update(dt); } @@ -460,7 +492,6 @@ public: auto spriteComponent = m_World->GetComponent(entity); if (spriteComponent) { - std::string normal = spriteComponent->NormalTexture; std::string spec = spriteComponent->SpecularTexture; @@ -483,7 +514,6 @@ public: EnqueueSprite(texturediff, texturenorm, texturespec, modelMatrix, spriteComponent->Color, absoluteTransform.Position.z); } } - } //TODO: Get this out of engine.h diff --git a/include/Physics/CParticle.h b/include/Physics/CParticle.h new file mode 100755 index 0000000..baec66d --- /dev/null +++ b/include/Physics/CParticle.h @@ -0,0 +1,65 @@ +#ifndef COMPONENTS_PARTICLE_H__ +#define COMPONENTS_PARTICLE_H__ +#include "Core/Component.h" + +namespace dd { + +namespace ParticleFlags { + +enum Type { + waterParticle = 0, + zombieParticle = 1 << 1, + wallParticle = 1 << 2, + springParticle = 1 << 3, + elasticParticle = 1 << 4, + viscousParticle = 1 << 5, + powderParticle = 1 << 6, + tensileParticle = 1 << 7, + colorMixingParticle = 1 << 8, + destructionListenerParticle = 1 << 9, + barrierParticle = 1 << 10, + staticPressureParticle = 1 << 11, + reactiveParticle = 1 << 12, + repulsiveParticle = 1 << 13, + fixtureContactListenerParticle = 1 << 14, + particleContactListenerParticle = 1 << 15, + fixtureContactFilterParticle = 1 << 16, + particleContactFilterParticle = 1 << 17 +}; +} + +namespace Components +{ + +struct Particle : public Component +{ + float Radius = 0.5f; + float LifeTime = 5.0f; + + ParticleFlags::Type Flags = + ParticleFlags::Type::waterParticle | + ParticleFlags::Type::zombieParticle | + ParticleFlags::Type::wallParticle | + ParticleFlags::Type::springParticle | + ParticleFlags::Type::elasticParticle | + ParticleFlags::Type::viscousParticle | + ParticleFlags::Type::powderParticle | + ParticleFlags::Type::tensileParticle | + ParticleFlags::Type::colorMixingParticle | + ParticleFlags::Type::destructionListenerParticle | + ParticleFlags::Type::barrierParticle | + ParticleFlags::Type::staticPressureParticle | + ParticleFlags::Type::reactiveParticle | + ParticleFlags::Type::repulsiveParticle | + ParticleFlags::Type::fixtureContactListenerParticle | + ParticleFlags::Type::particleContactListenerParticle | + ParticleFlags::Type::fixtureContactFilterParticle | + ParticleFlags::Type::particleContactFilterParticle; + +}; + +} + +} + +#endif \ No newline at end of file diff --git a/include/Physics/CParticleEmitter.h b/include/Physics/CParticleEmitter.h new file mode 100755 index 0000000..a965a84 --- /dev/null +++ b/include/Physics/CParticleEmitter.h @@ -0,0 +1,25 @@ +#ifndef COMPONENTS_PARTICLEEMITTER_H__ +#define COMPONENTS_PARTICLEEMITTER_H__ +#include "Core/Component.h" + +namespace dd +{ +namespace Components +{ + +struct ParticleEmitter : public Component +{ + int Amount = 10.f; + float InitialSpeed = 1.f; + double SpawnRate = 1.f; + double TimeSinceLastSpawn = 0; + + //ParticleSystem variables + float GravityScale = 1.0f; +}; + +} + +} + +#endif \ No newline at end of file diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index 79e1205..02e3e06 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -18,6 +18,9 @@ #include "Physics/CWaterVolume.h" #include "Game/CBall.h" #include "Rendering/CSprite.h" +#include "Physics/CParticle.h" +#include "Physics/CParticleEmitter.h" +#include "Core/CTemplate.h" namespace dd @@ -66,18 +69,29 @@ private: std::unordered_map m_BodiesToEntities; void CreateBody(EntityID entity); - void CreateParticleSystem(float radius); std::vector m_ParticleSystem; std::vector t_ParticleGroup; - std::unordered_map m_EntitiesToParticleHandle; - std::unordered_map m_ParticleHandleToEntities; + std::vector> m_EntitiesToParticleHandle; + std::vector> m_ParticleHandleToEntities; + b2ParticleSystem* CreateParticleSystem(float radius, float gravityScale); void InitializeWater(); - void SyncWater(); //TODO: Probably remove this void CreateParticleGroup(EntityID entity); + void CreateParticleEmitter(EntityID entity); + void UpdateParticleEmitters(double dt); //TODO: Remove them and particles if needed. + //TODO: Fill struct with info needed. + struct ParticleEmitter + { + std::vector ParticleSystem; + std::vector ParticleEmitter; + std::vector ParticleTemplate; + }; + ParticleEmitter m_ParticleEmitters; + + //TODO: Struct med listor är bättre än en lista med structs struct Impulse { b2Body* Body; diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index caf1160..6abf221 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -312,7 +312,7 @@ void dd::Renderer::Draw(RenderQueueCollection& rq) void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) { // Pass #1: Fill G-buffers - glDisable(GL_CULL_FACE); + glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); @@ -444,6 +444,7 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); glUniform4fv(glGetUniformLocation(shaderProgramHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, spriteJob->DiffuseTexture); glActiveTexture(GL_TEXTURE1); diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index c8623b4..e13d374 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -30,9 +30,8 @@ void dd::Systems::PhysicsSystem::Initialize() void dd::Systems::PhysicsSystem::InitializeWater() { float radius = 0.13f; - - - CreateParticleSystem(radius); + float gravityScale = 1.0f; + CreateParticleSystem(radius, gravityScale); } bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) @@ -58,24 +57,22 @@ bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) return true; } -void dd::Systems::PhysicsSystem::Update(double dt) -{ +void dd::Systems::PhysicsSystem::Update(double dt) { m_Accumulator += dt; - while(m_Accumulator >= m_TimeStep) - { + while (m_Accumulator >= m_TimeStep) { for (auto i : m_EntitiesToBodies) { EntityID entity = i.first; - b2Body* body = i.second; + b2Body *body = i.second; auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) { + if (!transformComponent) { continue; LOG_ERROR("RigidBody with no TransformComponent"); } auto physicsComponent = m_World->GetComponent(entity); - if (! physicsComponent) { + if (!physicsComponent) { continue; LOG_ERROR("RigidBody with no PhysicsComponent"); } @@ -102,19 +99,19 @@ void dd::Systems::PhysicsSystem::Update(double dt) } } + UpdateParticleEmitters(dt); + for (auto i : m_Impulses) { i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); } m_Impulses.clear(); - m_PhysicsWorld->Step(m_TimeStep, m_VelocityIterations, m_PositionIterations); - for (auto i : m_EntitiesToBodies) { EntityID entity = i.first; - b2Body* body = i.second; + b2Body *body = i.second; if (body == nullptr) { LOG_ERROR("This body should not exist"); @@ -122,15 +119,17 @@ void dd::Systems::PhysicsSystem::Update(double dt) } auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) + if (!transformComponent) continue; - auto parent = m_World->GetEntityParent(entity); - if (parent == 0) { + auto parent = m_World->GetEntityParent(entity); + if (parent == 0) { auto physicsComponent = m_World->GetComponent(entity); if (physicsComponent->Calculate) { //TODO: REPLACE THIS WITH PARTICLE COLLISION FILTERS - transformComponent->Position.x = transformComponent->Position.x + (transformComponent->Velocity.x * m_TimeStep); - transformComponent->Position.y = transformComponent->Position.y + (transformComponent->Velocity.y * m_TimeStep); + transformComponent->Position.x = + transformComponent->Position.x + (transformComponent->Velocity.x * m_TimeStep); + transformComponent->Position.y = + transformComponent->Position.y + (transformComponent->Velocity.y * m_TimeStep); } else { b2Vec2 position = body->GetPosition(); @@ -138,36 +137,42 @@ void dd::Systems::PhysicsSystem::Update(double dt) transformComponent->Position.y = position.y; float angle = body->GetAngle(); - transformComponent->Orientation = glm::quat(glm::vec3(0, 0, angle)); + transformComponent->Orientation = glm::quat(glm::vec3(0, 0, angle)); b2Vec2 velocity = body->GetLinearVelocity(); transformComponent->Velocity.x = velocity.x; transformComponent->Velocity.y = velocity.y; } } - } - b2Vec2* positionBuffer = m_ParticleSystem[0]->GetPositionBuffer(); - for (auto i : m_EntitiesToParticleHandle) { - EntityID entity = i.first; - b2ParticleHandle* particleH = i.second; + for ( int e = 0; e < m_EntitiesToParticleHandle.size(); e++) { + b2Vec2 *positionBuffer = m_ParticleSystem[e]->GetPositionBuffer(); + for (auto i : m_EntitiesToParticleHandle[e]){ + EntityID entity = i.first; + b2ParticleHandle *particleH = i.second; - b2Vec2 positionB2 = positionBuffer[particleH->GetIndex()]; - glm::vec2 position = glm::vec2(positionB2.x, positionB2.y); + b2Vec2 positionB2 = positionBuffer[particleH->GetIndex()]; + glm::vec2 position = glm::vec2(positionB2.x, positionB2.y); + EntityID entityParent = m_World->GetEntityParent(entity); + glm::vec3 parentTransform = glm::vec3(0.f); + if(entityParent) { + auto tp = m_World->GetComponent(entityParent); + parentTransform = tp->Position; + } + auto transform = m_World->GetComponent(entity); - EntityID entityParent = m_World->GetEntityParent(entity); - auto transform = m_World->GetComponent(entity); - auto transformParent = m_World->GetComponent(entityParent); + transform->Position = glm::vec3(position.x, position.y, -10) - parentTransform; - transform->Position = glm::vec3(position.x, position.y, -10) - transformParent->Position; - } + } + } m_Accumulator -= dt; } } + void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { @@ -177,15 +182,23 @@ void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) { auto physicsComponent = m_World->GetComponent(entity); auto waterComponent = m_World->GetComponent(entity); + auto particleEmitterComponent = m_World->GetComponent(entity); if (physicsComponent && waterComponent) { LOG_ERROR("Entity has both water and physics component, this is illegal. The police has been alerted."); return; } + if (physicsComponent && particleEmitterComponent) { + LOG_ERROR("Entity has both particle and physics component, this is illegal. The police has been alerted."); + return; + } + if (physicsComponent) { CreateBody(entity); } else if (waterComponent) { CreateParticleGroup(entity); + } else if (particleEmitterComponent) { + CreateParticleEmitter(entity); } } @@ -208,7 +221,6 @@ void dd::Systems::PhysicsSystem::OnEntityRemoved(EntityID entity) } - void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) { auto physicsComponent = m_World->GetComponent(entity); @@ -292,41 +304,128 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) auto transform = m_World->GetComponent(e); if (!transform) { LOG_ERROR("No Transform component in CreateParticleGroup"); - return; } - b2ParticleGroupDef pd; b2PolygonShape shape; - //TODO: FIX SO IT CAN NOTICE WHAT PARTICLE SYSTEM IS WATER! [0] IS A FUCKING BULLSHIT FIX. + auto water = m_World->GetComponent(e); + if (water) { - shape.SetAsBox(transform->Scale.x/2.f, transform->Scale.y/2.f); - pd.shape = &shape; - pd.flags = b2_tensileParticle; - pd.position.Set(transform->Position.x, transform->Position.y); - t_ParticleGroup.push_back(m_ParticleSystem[0]->CreateParticleGroup(pd)); - b2Vec2* t_ParticlePositions = m_ParticleSystem[0]->GetPositionBuffer(); - for(int i = 0; i < m_ParticleSystem[0]->GetParticleCount(); i++){ - { - auto t_waterparticle = m_World->CreateEntity(e); - auto transformChild = m_World->AddComponent(t_waterparticle); + shape.SetAsBox(transform->Scale.x/2.f, transform->Scale.y/2.f); + pd.shape = &shape; + pd.flags = b2_tensileParticle; + pd.position.Set(transform->Position.x, transform->Position.y); + t_ParticleGroup.push_back(m_ParticleSystem[0]->CreateParticleGroup(pd)); + b2Vec2* t_ParticlePositions = m_ParticleSystem[0]->GetPositionBuffer(); + for(int i = 0; i < m_ParticleSystem[0]->GetParticleCount(); i++){ + { + auto t_waterparticle = m_World->CreateEntity(e); + auto transformChild = m_World->AddComponent(t_waterparticle); - transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); - transformChild->Scale = glm::vec3(m_ParticleSystem[0]->GetRadius())/transform->Scale; - m_World->CommitEntity(t_waterparticle); + transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); + transformChild->Scale = glm::vec3(m_ParticleSystem[0]->GetRadius())/transform->Scale; + m_World->CommitEntity(t_waterparticle); + + m_EntitiesToParticleHandle[0].insert(std::make_pair(t_waterparticle, m_ParticleSystem[0]->GetParticleHandleFromIndex(i))); + m_ParticleHandleToEntities[0].insert(std::make_pair( m_ParticleSystem[0]->GetParticleHandleFromIndex(i), t_waterparticle)); + } - m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem[0]->GetParticleHandleFromIndex(i))); - m_ParticleHandleToEntities.insert(std::make_pair( m_ParticleSystem[0]->GetParticleHandleFromIndex(i), t_waterparticle)); } } } -void dd::Systems::PhysicsSystem::CreateParticleSystem(float radius) +void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) { + for (int i = 0; i < m_ParticleEmitters.ParticleSystem.size(); i++) { + auto e = m_ParticleEmitters.ParticleEmitter[i]; + auto pt = m_ParticleEmitters.ParticleTemplate[i]; + auto ps = m_ParticleEmitters.ParticleSystem[i]; + + + auto emitter = m_World->GetComponent(e); + auto particleTemplate = m_World->GetComponent(pt); + emitter->TimeSinceLastSpawn += dt; + if(emitter->TimeSinceLastSpawn < emitter->SpawnRate) { + continue; + } + emitter->TimeSinceLastSpawn -= emitter->SpawnRate; + auto templateTransform = m_World->GetComponent(pt); + + b2ParticleDef particleDef; + particleDef.flags = particleTemplate->Flags; + //particleDef.color TODO: Implement this if we want color mixing and shit. + particleDef.lifetime = particleTemplate->LifeTime; + particleDef.velocity = b2Vec2(templateTransform->Velocity.x, templateTransform->Velocity.y); + particleDef.position = b2Vec2(templateTransform->Position.x, templateTransform->Position.y); + + auto particle = m_World->CloneEntity(pt, 0); + m_World->RemoveComponent(particle); + + auto b2Particle = ps->CreateParticle(particleDef); + auto b2ParticleHandle = ps->GetParticleHandleFromIndex(b2Particle); + m_EntitiesToParticleHandle[i].insert(std::make_pair(particle, b2ParticleHandle)); + m_ParticleHandleToEntities[i].insert(std::make_pair(b2ParticleHandle, particle)); + + //TODO: Ta bort detta + int particles = 0; + for (auto i : m_EntitiesToParticleHandle) + { + particles += i.size(); + } + LOG_INFO("--I have %i particles.", particles); + } +} + +void dd::Systems::PhysicsSystem::CreateParticleEmitter(EntityID entity) +{ + auto childEntities = m_World->GetEntityChildren(entity); + if (childEntities.empty()) { + LOG_ERROR("Particle Emitter does not have any child. Please adopt one or this will not work."); + return; + } + int pf = 0; + dd::Components::Particle* particle; + EntityID childEntity; + for ( auto c : childEntities ) { + auto p = m_World->GetComponent(c); + auto particleTemplate = m_World->GetComponent(c); + if (!p) { + continue; + LOG_WARNING("--ParticleEmitter's Child is not a particle."); + } + if(!particleTemplate) { + LOG_ERROR("ParticleEmitter's particleChild is not a template."); + continue; + } + if (pf != 0) { + LOG_WARNING("ParticleEmitter has more than one child that is a particleTemplate, only the first one is used."); + break; + } + childEntity = c; + particle = p; + pf++; + } + //TODO: Skicka med fler flaggor till particlesystemet; + m_ParticleEmitters.ParticleSystem.push_back(CreateParticleSystem(particle->Radius, 0.f)); + m_ParticleEmitters.ParticleEmitter.push_back(entity); + m_ParticleEmitters.ParticleTemplate.push_back(childEntity); +} + + +b2ParticleSystem* dd::Systems::PhysicsSystem::CreateParticleSystem(float radius, float gravityScale) +{ + std::unordered_map m1; + std::unordered_map m2; + m_EntitiesToParticleHandle.push_back(m1); + m_ParticleHandleToEntities.push_back(m2); + b2ParticleSystemDef m_ParticleSystemDef; m_ParticleSystemDef.radius = radius; + m_ParticleSystemDef.gravityScale = gravityScale; m_ParticleSystem.push_back(m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef)); + + return m_ParticleSystem.back(); } dd::Systems::PhysicsSystem::~PhysicsSystem() From c821fbfc255051d47478c119b17554a65dbd2e5a Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 16:12:53 +0200 Subject: [PATCH 13/18] Futile attempts to fix memory corruption bug --- include/Core/Engine.h | 2 +- include/GUI/NumberFrame.h | 17 ----------------- include/Game/PadSystem.h | 9 ++++++--- src/game/Core/EventBroker.cpp | 5 +++-- 4 files changed, 10 insertions(+), 23 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index f7842ed..eedd53a 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -360,7 +360,7 @@ public: // Swap event queues to get fresh input data in the read queue //m_EventBroker->Swap(); - ResourceManager::Update(); + //ResourceManager::Update(); if (m_GameIsRunning) { m_World->Update(dt); } diff --git a/include/GUI/NumberFrame.h b/include/GUI/NumberFrame.h index d1717b1..7241b82 100644 --- a/include/GUI/NumberFrame.h +++ b/include/GUI/NumberFrame.h @@ -27,22 +27,6 @@ public: m_CharacterTextures['8'] = "Textures/GUI/Numbers/N8.png"; m_CharacterTextures['9'] = "Textures/GUI/Numbers/N9.png"; - // Create number frame if missing -// for (int i = 0; i < 10; i++) { -// auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); -// frame->SetTexture(m_NumberTextures[0]); -// frame->DisableScissor(); -// // Position frame based on alignment -// if (i > 0) { -// frame->SetLeft(m_NumberFrames[0]->Right()); -// } -// Width += frame->Width; -// if (Height < frame->Height) { -// Height = frame->Height; -// } -// m_NumberFrames.push_front(frame); -// } - SetNumber(0); } @@ -100,7 +84,6 @@ private: int m_Number = 0; bool m_LeftAligned = true; - std::string m_NumberTextures[10]; std::unordered_map m_CharacterTextures; std::deque m_NumberFrames; }; diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 4a53907..549e0f6 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -69,9 +69,12 @@ public: private: EntityID m_Entity = 0; glm::vec3 m_Acceleration = glm::vec3(0.f, 0.f, 0.f); - bool m_Left = false, m_Right = false, m_ReplaceBall = false, m_MultiBall = false; - Components::Transform* m_Transform; - Components::Pad* m_Pad; + bool m_Left = false; + bool m_Right = false; + bool m_ReplaceBall = false; + bool m_MultiBall = false; + Components::Transform* m_Transform = nullptr; + Components::Pad* m_Pad = nullptr; dd::EventRelay m_EKeyDown; dd::EventRelay m_EKeyUp; diff --git a/src/game/Core/EventBroker.cpp b/src/game/Core/EventBroker.cpp index 2c68fd0..c8015c1 100644 --- a/src/game/Core/EventBroker.cpp +++ b/src/game/Core/EventBroker.cpp @@ -68,9 +68,10 @@ int dd::EventBroker::Process(std::string contextTypeName) std::shared_ptr event = pair.second; auto itpair = relays.equal_range(eventTypeName); - for (auto it2 = itpair.first; it2 != itpair.second; ++it2) + for (auto it2 = itpair.first; it2 != itpair.second; it2++) { - auto relay = it2->second; + std::string name = it2->first; + BaseEventRelay* relay = it2->second; relay->Receive(event); eventsProcessed++; } From 45f1d882ad1ac41cc90f417f49dd62295da620b2 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 14:41:55 +0200 Subject: [PATCH 14/18] Adding these two additional frames make the event broker break --- include/Game/HUD.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/Game/HUD.h b/include/Game/HUD.h index 30afcf6..5f61bb0 100644 --- a/include/Game/HUD.h +++ b/include/Game/HUD.h @@ -25,6 +25,13 @@ public: m_LevelIndicator = new GUI::TextureFrame(this, "HUDLevelIndicator"); m_LevelIndicator->SetTexture("Textures/GUI/HUD/LevelIndicatorBG.png"); + m_A1 = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_A1->X = 40; + m_A1->SetNumber(1); + m_A2 = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_A2->X = 60; + m_A2->SetNumber(1); + m_ScoreIndicator = new GUI::TextureFrame(this, "HUDScoreIndicator"); m_ScoreIndicator->SetTexture("Textures/GUI/HUD/ScoreIndicatorBG.png"); m_ScoreIndicator->SetRight(Right()); @@ -40,6 +47,8 @@ public: private: TextureFrame* m_LevelIndicator = nullptr; TextureFrame* m_ScoreIndicator = nullptr; + NumberFrame* m_A1 = nullptr; + NumberFrame* m_A2 = nullptr; NumberFrame* m_ScoreNumberFrame = nullptr; FPSCounter* m_FPSCounter = nullptr; From e74f1092c7844190ac67b7fdcf4fe821f8278b81 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Fri, 2 Oct 2015 18:12:00 +0200 Subject: [PATCH 15/18] Fixed crash when events were (un)subscribed while events were processing --- include/Core/EventBroker.h | 8 +++++ src/game/Core/EventBroker.cpp | 67 ++++++++++++++++++++++++++--------- src/tests/EventFixture.h | 2 +- 3 files changed, 59 insertions(+), 18 deletions(-) diff --git a/include/Core/EventBroker.h b/include/Core/EventBroker.h index cb5e39c..ce2a5a4 100644 --- a/include/Core/EventBroker.h +++ b/include/Core/EventBroker.h @@ -24,6 +24,7 @@ #include #include #include +#include #define EVENT_SUBSCRIBE_MEMBER(relay, handler) \ relay = decltype(relay)(std::bind(handler, this, std::placeholders::_1)); \ @@ -123,16 +124,23 @@ public: void Unsubscribe(BaseEventRelay &relay); private: + bool m_IsProcessing = false; + 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::list>> EventQueue_t; std::shared_ptr m_EventQueueRead; std::shared_ptr m_EventQueueWrite; + + void subscribeImmediate(BaseEventRelay& relay); + void unsubscribeImmediate(BaseEventRelay& relay); }; template diff --git a/src/game/Core/EventBroker.cpp b/src/game/Core/EventBroker.cpp index c8015c1..ce91fd9 100644 --- a/src/game/Core/EventBroker.cpp +++ b/src/game/Core/EventBroker.cpp @@ -29,32 +29,26 @@ dd::BaseEventRelay::~BaseEventRelay() void dd::EventBroker::Unsubscribe(BaseEventRelay &relay) // ? { - auto contextIt = m_ContextRelays.find(relay.m_ContextTypeName); - if (contextIt == m_ContextRelays.end()) - return; - - auto eventRelays = contextIt->second; - - auto itpair = eventRelays.equal_range(relay.m_EventTypeName); - for (auto it = itpair.first; it != itpair.second; ++it) - { - if (it->second == &relay) - { - relay.m_Broker = nullptr; - eventRelays.erase(it); - break; - } + if (m_IsProcessing) { + m_RelaysToUnsubscribe.push_back(&relay); + } else { + unsubscribeImmediate(relay); } } void dd::EventBroker::Subscribe(BaseEventRelay &relay) { - relay.m_Broker = this; - m_ContextRelays[relay.m_ContextTypeName].insert(std::make_pair(relay.m_EventTypeName, &relay)); + if (m_IsProcessing) { + m_RelaysToSubscribe.push_back(&relay); + } else { + subscribeImmediate(relay); + } } int dd::EventBroker::Process(std::string contextTypeName) { + m_IsProcessing = true; + auto it = m_ContextRelays.find(contextTypeName); if (it == m_ContextRelays.end()) return 0; @@ -77,6 +71,20 @@ int dd::EventBroker::Process(std::string contextTypeName) } } + m_IsProcessing = false; + + // Process pending subscriptions + for (auto& r : m_RelaysToSubscribe) { + subscribeImmediate(*r); + } + m_RelaysToSubscribe.clear(); + + // Process pending unsubscriptions + for (auto& r : m_RelaysToUnsubscribe) { + unsubscribeImmediate(*r); + } + m_RelaysToUnsubscribe.clear(); + return eventsProcessed; } @@ -84,4 +92,29 @@ void dd::EventBroker::Swap() { std::swap(m_EventQueueRead, m_EventQueueWrite); m_EventQueueWrite->clear(); + +} + +void dd::EventBroker::subscribeImmediate(dd::BaseEventRelay& relay) +{ + relay.m_Broker = this; + m_ContextRelays[relay.m_ContextTypeName].insert(std::make_pair(relay.m_EventTypeName, &relay)); +} + +void dd::EventBroker::unsubscribeImmediate(dd::BaseEventRelay& relay) +{ + auto contextIt = m_ContextRelays.find(relay.m_ContextTypeName); + if (contextIt == m_ContextRelays.end()) { + return; + } + + auto eventRelays = contextIt->second; + auto itpair = eventRelays.equal_range(relay.m_EventTypeName); + for (auto it = itpair.first; it != itpair.second; ++it) { + if (it->second == &relay) { + relay.m_Broker = nullptr; + eventRelays.erase(it); + break; + } + } } diff --git a/src/tests/EventFixture.h b/src/tests/EventFixture.h index 1548a08..4f78080 100644 --- a/src/tests/EventFixture.h +++ b/src/tests/EventFixture.h @@ -10,7 +10,7 @@ struct EventFixture EventFixture() { this->EventBroker = new dd::EventBroker(); - m_EEventType = decltype(m_EEventType)(std::bind(&OnEvent, this, std::placeholders::_1)); + m_EEventType = decltype(m_EEventType)(std::bind(&EventFixture::OnEvent, this, std::placeholders::_1)); this->EventBroker->Subscribe(m_EEventType); Run(); Check(); From b38580f468ac0cbc1a644baea576ef9a0d4e534e Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Fri, 2 Oct 2015 18:30:36 +0200 Subject: [PATCH 16/18] Area and Stage numbers in the right place --- include/Game/HUD.h | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/include/Game/HUD.h b/include/Game/HUD.h index 5f61bb0..52711e8 100644 --- a/include/Game/HUD.h +++ b/include/Game/HUD.h @@ -25,12 +25,14 @@ public: m_LevelIndicator = new GUI::TextureFrame(this, "HUDLevelIndicator"); m_LevelIndicator->SetTexture("Textures/GUI/HUD/LevelIndicatorBG.png"); - m_A1 = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); - m_A1->X = 40; - m_A1->SetNumber(1); - m_A2 = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); - m_A2->X = 60; - m_A2->SetNumber(1); + m_AreaNumberFrame = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_AreaNumberFrame->X = 132; + m_AreaNumberFrame->Y = 19; + m_AreaNumberFrame->SetNumber(6); + m_StageNumberFrame = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_StageNumberFrame->X = 165; + m_StageNumberFrame->Y = 19; + m_StageNumberFrame->SetNumber(5); m_ScoreIndicator = new GUI::TextureFrame(this, "HUDScoreIndicator"); m_ScoreIndicator->SetTexture("Textures/GUI/HUD/ScoreIndicatorBG.png"); @@ -39,7 +41,7 @@ public: m_ScoreNumberFrame->X = 15; m_ScoreNumberFrame->Y = 21; - //m_FPSCounter = new GUI::FPSCounter(this, "FPSCounter"); + m_FPSCounter = new GUI::FPSCounter(this, "FPSCounter"); EVENT_SUBSCRIBE_MEMBER(m_EScore, &HUD::OnScore); } @@ -47,8 +49,8 @@ public: private: TextureFrame* m_LevelIndicator = nullptr; TextureFrame* m_ScoreIndicator = nullptr; - NumberFrame* m_A1 = nullptr; - NumberFrame* m_A2 = nullptr; + NumberFrame* m_AreaNumberFrame = nullptr; + NumberFrame* m_StageNumberFrame = nullptr; NumberFrame* m_ScoreNumberFrame = nullptr; FPSCounter* m_FPSCounter = nullptr; From a8b0631379c206abac892bcec705b51d1c4e1461 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Fri, 2 Oct 2015 19:01:08 +0200 Subject: [PATCH 17/18] Improved FPS counter with averaging --- include/Game/FPSCounter.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/include/Game/FPSCounter.h b/include/Game/FPSCounter.h index 6dd4b49..0f7f303 100644 --- a/include/Game/FPSCounter.h +++ b/include/Game/FPSCounter.h @@ -15,25 +15,26 @@ public: FPSCounter(Frame* parent, std::string name) : Frame(parent, name) { + m_FrameTimes.resize(m_MaxSamples); m_Numbers = new GUI::NumberFrame(this, "FPSCounterNumberFrame"); } virtual void Update(double dt) { - m_NumFrames++; - m_Accum += dt; + m_FrameTimes[m_CurrentFrame % m_MaxSamples] = dt; + double sum = std::accumulate(m_FrameTimes.begin(), m_FrameTimes.end(), 0.0); + sum /= std::min(m_CurrentFrame, m_MaxSamples); + m_Numbers->SetNumber(std::round(1.0 / sum)); - m_Numbers->SetNumber(1.0/(m_Accum/m_NumFrames)); - if (m_NumFrames % 20) { - //LOG_INFO("FPS: %f", 1.0/(m_Accum/m_NumFrames)); - } + m_CurrentFrame++; } private: NumberFrame* m_Numbers = nullptr; - double m_Accum = 0.0; - int m_NumFrames = 0; + int m_MaxSamples = 100; + int m_CurrentFrame = 0; + std::vector m_FrameTimes; }; } From 371d21cb35febd29db73e87c5b3de1c46e18a01e Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Mon, 5 Oct 2015 14:27:27 +0200 Subject: [PATCH 18/18] Buttons are now not clickable when they're hidden --- include/GUI/Button.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/GUI/Button.h b/include/GUI/Button.h index b2a665d..d46d929 100644 --- a/include/GUI/Button.h +++ b/include/GUI/Button.h @@ -60,6 +60,10 @@ protected: virtual bool OnMouseMove(const Events::MouseMove& event) { + if (Hidden()) { + return false; + } + bool isOver = Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1)); if (isOver && !m_MouseIsOver) { // Enter if (!m_IsDown) { @@ -88,6 +92,11 @@ protected: } virtual bool OnMousePress(const Events::MousePress& event) { + if (Hidden()) { + LOG_DEBUG("Pressed hidden button"); + return false; + } + if (!Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1))) { return false; } @@ -107,6 +116,11 @@ protected: } virtual bool OnMouseRelease(const Events::MouseRelease& event) { + if (Hidden()) { + LOG_DEBUG("Released hidden button"); + return false; + } + bool isOver = Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1)); if (!isOver && !m_IsDown) { return false;