diff --git a/assets/Textures/Particles/Cloud_Particle.png b/assets/Textures/Particles/Cloud_Particle.png new file mode 100644 index 0000000..68b8ac2 Binary files /dev/null and b/assets/Textures/Particles/Cloud_Particle.png differ diff --git a/assets/Textures/Particles/FadeBall.png b/assets/Textures/Particles/FadeBall.png new file mode 100644 index 0000000..4ab17dc Binary files /dev/null and b/assets/Textures/Particles/FadeBall.png differ diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 2f7d637..ec9e4dd 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -41,6 +41,8 @@ #include #include +#include "Physics/ECreateParticleSequence.h" + namespace dd { diff --git a/include/Physics/CParticleEmitter.h b/include/Physics/CParticleEmitter.h index 7809735..8b6029f 100755 --- a/include/Physics/CParticleEmitter.h +++ b/include/Physics/CParticleEmitter.h @@ -9,6 +9,7 @@ namespace Components struct ParticleEmitter : public Component { + EntityID Parent = 0; int NumberOfTicks = 10.f; float InitialSpeed = 1.f; double SpawnRate = 1; diff --git a/include/Physics/ECreateParticleSequence.h b/include/Physics/ECreateParticleSequence.h index 12e66a7..82731bc 100644 --- a/include/Physics/ECreateParticleSequence.h +++ b/include/Physics/ECreateParticleSequence.h @@ -23,6 +23,7 @@ struct CreateParticleSequence : public Event float EmittingAngle = 0.f; float MaxCount = 0; glm::vec4 Color = glm::vec4(0); + EntityID parent = 0; //Particle std::string SpriteFile = ""; diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index 7f33a53..8ae69cd 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -440,7 +440,7 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); - glUniform4fv(glGetUniformLocation(shaderProgramHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); + glUniform4fv(glGetUniformLocation(shaderProgramHandle, "Color"), 1, glm::value_ptr(spriteJob->Color)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, spriteJob->DiffuseTexture); diff --git a/src/game/Core/Shaders/Forward/Fragment.glsl b/src/game/Core/Shaders/Forward/Fragment.glsl index dc9d544..0c414fd 100755 --- a/src/game/Core/Shaders/Forward/Fragment.glsl +++ b/src/game/Core/Shaders/Forward/Fragment.glsl @@ -30,6 +30,7 @@ uniform vec3 LightPosition; uniform float LightRadius; uniform vec3 LightSpecular; uniform vec3 LightDiffuse; +uniform vec4 Color; in VertexData { @@ -86,5 +87,5 @@ void main() vec4 La = vec4(0.3, 0.3, 0.3, 1.0); vec4 light = phong(Input.Position, normalize(normal), specularTexel.rgb, specularTexel.a); //frag_Diffuse = light; - frag_Diffuse = diffuseTexel; + frag_Diffuse = diffuseTexel * Color; } \ No newline at end of file diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index bc6fcee..6e21a79 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -189,20 +189,20 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe m_World->RemoveComponent(brick); auto transform = m_World->GetComponent(brick); auto cBrick = m_World->GetComponent(brick); - if (typeInt == StandardBrick) { } else if (typeInt == MultiBallBrick) { cBrick->Type = MultiBallBrick; auto model = m_World->GetComponent(brick); model->ModelFile = "Models/Brick/IceBrick.obj"; + } else if (typeInt == LifebuoyBrick) { cBrick->Type = LifebuoyBrick; auto model = m_World->GetComponent(brick); - model->Color = glm::vec4(1.f, 0.f, 0.f, .0f); + model->Color = glm::vec4(1.f, 0.f, 0.f, 1.f); } else if (typeInt == StickyBrick) { cBrick->Type = StickyBrick; auto model = m_World->GetComponent(brick); - model->Color = glm::vec4(0.f, 0.f, 1.f, .0f); + model->Color = glm::vec4(0.f, 0.f, 1.f, 1.f); } float x = line * spacesBetweenBricks.x; float y = row * spacesBetweenBricks.y; @@ -273,6 +273,7 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) auto transformComponentBrick = m_World->GetComponent(entityBrick); auto transformComponentBall = m_World->GetComponent(entityBall); + auto brickModel = m_World->GetComponent(entityBrick); Events::SetImpulse e; e.Entity = entityBrick; @@ -291,6 +292,21 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) es.Score = brick->Score * ball->Combo; EventBroker->Publish(es); + Events::CreateParticleSequence ep; + ep.parent = entityBrick; + ep.EmitterLifeTime = 1.f; + ep.ParticleLifeTime = 1.5f; + ep.ParticlesPerTick = 1; + ep.SpawnRate = 0.2; + ep.EmittingAngle = glm::half_pi(); + ep.Spread = 1.5f; + ep.Position = transformComponentBrick->Position; + ep.Radius = 0.05; + ep.SpriteFile = "Textures/Particles/FadeBall.png"; + ep.Color = brickModel->Color + glm::vec4(1); + ep.Speed = 50; + EventBroker->Publish(ep); + //std::cout << "Combo: " << ball->Combo << std::endl; //std::cout << NumberOfBricks() << std::endl; //std::cout << "Brick Score: " << brick->Score << std::endl; diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 2fd7421..a0eee94 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -265,12 +265,9 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity auto particle = m_World->GetComponent(entity); auto pTemplate = m_World->GetComponent(entity); - if (particle && pTemplate) - LOG_ERROR("Particel + template finns"); + if (particle && !pTemplate) { - //LOG_ERROR("Particel - template finns"); - particle->LifeTime -= dt; if (particle->LifeTime <= 0) { for (int i = 0; i < m_EntitiesToParticleHandle.size(); i++) { @@ -285,11 +282,24 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity if (iter2 != m_ParticleHandleToEntities[i].end()) { m_ParticleHandleToEntities[i].erase(iter2); } - LOG_INFO("Deleteing particle!!."); m_World->RemoveEntity(entity); } } + auto sprite = m_World->GetComponent(entity); + sprite->Color.w = particle->LifeTime; } + + auto emitter = m_World->GetComponent(entity); + if (emitter) { + EntityID emitterParent = emitter->Parent; + if (emitterParent != 0) { + auto emitterTransform = m_World->GetComponent(entity); + auto parentTransform = m_World->GetComponent(emitterParent); + if (emitterTransform && parentTransform) { + emitterTransform->Position = parentTransform->Position; + } + } + } } bool dd::Systems::PhysicsSystem::OnPause(const dd::Events::Pause &event) @@ -344,6 +354,7 @@ void dd::Systems::PhysicsSystem::OnEntityRemoved(EntityID entity) m_BodiesToEntities.erase(it->second); m_EntitiesToBodies.erase(entity); } + } @@ -480,8 +491,8 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) LOG_INFO("ParticleTemplate Component is nil."); continue; } - auto TempTransform = m_World->GetComponent(e); - TempTransform->Orientation = glm::rotate(glm::quat(), 3.f, glm::vec3(0.f, 0.f, -1.f)); + auto emitterTransform = m_World->GetComponent(e); + emitterTransform->Orientation = glm::rotate(glm::quat(), 3.f, glm::vec3(0.f, 0.f, -1.f)); emitter->TimeSinceLastSpawn += dt; emitter->LifeTime -= dt; @@ -506,20 +517,22 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) std::uniform_real_distribution dis(eAngle - halfSpread, eAngle + halfSpread); float pAngle = dis(gen); + std::uniform_real_distribution dis2(0.3, 1.5); + float speedMultiplier = dis2(gen); glm::vec2 unitVec = glm::normalize(glm::vec2(glm::cos(pAngle), glm::sin(pAngle))); - glm::vec2 vel = unitVec * emitter->Speed * (float)dt; + glm::vec2 vel = unitVec * emitter->Speed * (float)dt * speedMultiplier * 0.5f; particleDef.velocity = b2Vec2(vel.x, vel.y); - particleDef.position = b2Vec2(templateTransform->Position.x, templateTransform->Position.y); + particleDef.position = b2Vec2(emitterTransform->Position.x, emitterTransform->Position.y); auto particle = m_World->CloneEntity(pt, 0); m_World->RemoveComponent(particle); - auto transform2 = m_World->GetComponent(particle); + auto transform2 = m_World->GetComponent(particle); std::uniform_real_distribution dist(0, 1); float zDistribution = dist(gen); - transform2->Position = glm::vec3(transform2->Position.x, transform2->Position.y, -9.5f + zDistribution); - transform2->Scale = glm::vec3(particleTemplate->Radius * 2.f, particleTemplate->Radius * 2.f, 1); + transform2->Position = glm::vec3(emitterTransform->Position.x, emitterTransform->Position.y, -9.5f + zDistribution); + transform2->Scale = glm::vec3(particleTemplate->Radius * 2.f / speedMultiplier, particleTemplate->Radius * 2.f / speedMultiplier, 1); auto b2Particle = ps->CreateParticle(particleDef); @@ -580,10 +593,15 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) bool dd::Systems::PhysicsSystem::CreateParticleSequence(const Events::CreateParticleSequence &event) { //Creating Emitter - auto emitter = m_World->CreateEntity(); + EntityID emitter = m_World->CreateEntity(); + auto emitterTransform = m_World->AddComponent(emitter); auto particleEmitter= m_World->AddComponent(emitter); + if (event.parent != 0) { + particleEmitter->Parent = event.parent; + } + emitterTransform->Position = event.Position; particleEmitter->GravityScale = event.GravityScale; particleEmitter->SpawnRate = event.SpawnRate; @@ -685,18 +703,18 @@ bool dd::Systems::PhysicsSystem::OnContact(const dd::Events::Contact &event) model = m_World->GetComponent(event.Entity1); } Events::CreateParticleSequence e; - e.EmitterLifeTime = 2; + e.EmitterLifeTime = 4; //- glm::atan(event.Normal.x, event.Normal.y e.EmittingAngle = glm::half_pi(); - e.Spread = 0; + e.Spread = 0.5f; e.NumberOfTicks = 1; e.ParticleLifeTime = 1.f; - e.ParticlesPerTick = 1; + e.ParticlesPerTick = 15; e.Position = glm::vec3(event.IntersectionPoint.x, event.IntersectionPoint.y, -10); - e.Radius = 0.1f; - e.SpriteFile = "Textures/Bricks/3.png"; - e.Color = model->Color; - e.Speed = 100.f; + e.Radius = 0.2f; + e.SpriteFile = "Textures/Particles/Cloud_Particle.png"; + e.Color = model->Color + glm::vec4(1); + e.Speed = 100; EventBroker->Publish(e); return true; }