Skybox working, flag for averaging normals working.
This commit is contained in:
+171
-6
@@ -12,6 +12,7 @@ void Systems::TowerSystem::RegisterComponents( ComponentFactory* cf )
|
||||
void Systems::TowerSystem::Initialize()
|
||||
{
|
||||
//EVENT_SUBSCRIBE_MEMBER(m_eDamage, &Systems::TowerSystem::Damage);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_ECollision, &Systems::TowerSystem::OnCollision);
|
||||
Temp_m_TimeSinceLastShot = 0;
|
||||
}
|
||||
|
||||
@@ -41,6 +42,8 @@ void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID pa
|
||||
return;
|
||||
|
||||
auto players = m_World->GetComponentsOfType<Components::Player>();
|
||||
if (!players)
|
||||
return;
|
||||
|
||||
for(auto player : *players)
|
||||
{
|
||||
@@ -53,7 +56,9 @@ void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID pa
|
||||
continue;
|
||||
|
||||
Components::Transform absolutePlayerTransform = m_World->GetSystem<Systems::TransformSystem>()->AbsoluteTransform(player->Entity);
|
||||
|
||||
|
||||
if(glm::distance(absolutePlayerTransform.Position, absoluteTowerGunTransform.Position) > 45.f)
|
||||
continue;
|
||||
//Rotate the turret towards the enemy player
|
||||
glm::quat baseLookAt = glm::inverse(glm::quat_cast(glm::lookAt(absoluteTowerGunTransform.Position, glm::vec3(absolutePlayerTransform.Position.x, absoluteTowerGunTransform.Position.y, absolutePlayerTransform.Position.z), glm::vec3(0, 1, 0))));
|
||||
glm::quat gunLookAt = glm::inverse(glm::quat_cast(glm::lookAt(absoluteTowerGunTransform.Position, glm::vec3(absolutePlayerTransform.Position.x, absolutePlayerTransform.Position.y, absolutePlayerTransform.Position.z ), glm::vec3(0, 1, 0))));
|
||||
@@ -70,8 +75,9 @@ void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID pa
|
||||
EntityID clone = m_World->CloneEntity(turretComponent->ShotTemplate);
|
||||
auto templateAbsoluteTransform = m_World->GetSystem<Systems::TransformSystem>()->AbsoluteTransform(turretComponent->ShotTemplate);
|
||||
auto cloneTransform = m_World->GetComponent<Components::Transform>(clone);
|
||||
cloneTransform->Position = templateAbsoluteTransform.Position - glm::vec3(0.97163f, 0.f, 0.f);
|
||||
cloneTransform->Orientation = templateAbsoluteTransform.Orientation;
|
||||
cloneTransform->Position = templateAbsoluteTransform.Position - (cloneTransform->Orientation* glm::vec3(0.97163f, 0.f, 0.f));
|
||||
|
||||
|
||||
Events::SetVelocity eSetVelocity;
|
||||
eSetVelocity.Entity = clone;
|
||||
@@ -113,8 +119,9 @@ void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID pa
|
||||
EntityID clone = m_World->CloneEntity(turretComponent->ShotTemplate);
|
||||
auto templateAbsoluteTransform = m_World->GetSystem<Systems::TransformSystem>()->AbsoluteTransform(turretComponent->ShotTemplate);
|
||||
auto cloneTransform = m_World->GetComponent<Components::Transform>(clone);
|
||||
cloneTransform->Position = templateAbsoluteTransform.Position + glm::vec3(0.97163f, 0.f, 0.f);
|
||||
cloneTransform->Orientation = templateAbsoluteTransform.Orientation;
|
||||
cloneTransform->Position = templateAbsoluteTransform.Position + (cloneTransform->Orientation * glm::vec3(0.97163f, 0.f, 0.f));
|
||||
|
||||
|
||||
Events::SetVelocity eSetVelocity;
|
||||
eSetVelocity.Entity = clone;
|
||||
@@ -153,11 +160,169 @@ void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID pa
|
||||
}
|
||||
|
||||
Temp_m_TimeSinceLastShot = 0;
|
||||
|
||||
#pragma endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool Systems::TowerSystem::OnCollision(const Events::Collision &e)
|
||||
{
|
||||
if(m_World->ValidEntity(e.Entity1) && m_World->ValidEntity(e.Entity2))
|
||||
{
|
||||
auto tankShell1 = m_World->GetComponent<Components::TurretShot>(e.Entity1);
|
||||
auto tankShell2 = m_World->GetComponent<Components::TurretShot>(e.Entity2);
|
||||
|
||||
EntityID shellEntity = 0;
|
||||
Components::TurretShot* shellComponent;
|
||||
EntityID otherEntity = 0;
|
||||
|
||||
if (tankShell1)
|
||||
{
|
||||
shellEntity = e.Entity1;
|
||||
otherEntity = e.Entity2;
|
||||
shellComponent = tankShell1;
|
||||
}
|
||||
else if (tankShell2)
|
||||
{
|
||||
shellEntity = e.Entity2;
|
||||
otherEntity = e.Entity1;
|
||||
shellComponent = tankShell2;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if(m_World->GetComponent<Components::Template>(shellEntity))
|
||||
return false;
|
||||
|
||||
//auto physicsComponents = m_World->GetComponentsOfType<Components::Physics>();
|
||||
auto shellTransform = m_World->GetComponent<Components::Transform>(shellEntity);
|
||||
//auto otherTransform = m_World->GetComponent<Components::Transform>(otherEntity);
|
||||
|
||||
|
||||
{
|
||||
Events::CreateExplosion e;
|
||||
e.LifeTime = 2;
|
||||
e.ParticleScale.push_back(3);
|
||||
e.ParticlesToSpawn = 10;
|
||||
e.Position = shellTransform->Position;
|
||||
e.RelativeUpOrientation = glm::angleAxis(glm::pi<float>() / 2, glm::vec3(1, 0, 0));
|
||||
e.Speed = 3;
|
||||
e.SpreadAngle = glm::pi<float>();
|
||||
e.spritePath = "Textures/Sprites/Smoke1.png";
|
||||
e.Color = glm::vec4(0.6, 0.6, 0.6, 0.1);
|
||||
EventBroker->Publish(e);
|
||||
e.LifeTime = 0.7;
|
||||
e.ParticleScale.push_back(5);
|
||||
e.ParticlesToSpawn = 10;
|
||||
e.Position = shellTransform->Position;
|
||||
e.RelativeUpOrientation = glm::angleAxis(glm::pi<float>() / 2, glm::vec3(1, 0, 0));
|
||||
e.Speed = 17;
|
||||
e.SpreadAngle = glm::pi<float>();
|
||||
e.spritePath = "Textures/Sprites/Fire.png";
|
||||
EventBroker->Publish(e);
|
||||
e.LifeTime = 0.2;
|
||||
e.ParticleScale.push_back(1);
|
||||
e.ParticleScale.push_back(5);
|
||||
e.ParticlesToSpawn = 5;
|
||||
e.Position = shellTransform->Position;
|
||||
e.RelativeUpOrientation = glm::angleAxis(glm::pi<float>() / 2, glm::vec3(1, 0, 0));
|
||||
e.Speed = 6;
|
||||
e.SpreadAngle = glm::pi<float>();
|
||||
e.spritePath = "Textures/Sprites/Blast1.png";
|
||||
e.Color = glm::vec4(2, 2, 2, 0.2);
|
||||
EventBroker->Publish(e);
|
||||
}
|
||||
|
||||
//{
|
||||
// Events::CreateExplosion e;
|
||||
// e.LifeTime = 1.5;
|
||||
// e.ParticleScale.push_back(1);
|
||||
// e.ParticleScale.push_back(6);
|
||||
// e.ParticlesToSpawn = 20;
|
||||
// e.Position = shellTransform->Position;
|
||||
// e.SpreadAngle = glm::radians<float>(180) / 4;
|
||||
// e.RelativeUpOrientation = glm::angleAxis(glm::radians<float>(90), glm::vec3(1,0,0));
|
||||
// e.UseGoalVector = true;
|
||||
// e.GoalVelocity = glm::vec3(0,-12,0);
|
||||
// e.Speed = 12;
|
||||
// e.spritePath = "Textures/Sprites/Splash.png";
|
||||
// e.Color = glm::vec4(5.f,5.f,5.f,1);
|
||||
|
||||
// EventBroker->Publish(e);
|
||||
// e.LifeTime = 1.5;
|
||||
// e.ParticleScale.push_back(1);
|
||||
// e.ParticleScale.push_back(6);
|
||||
// e.ParticlesToSpawn = 20;
|
||||
// e.Position = shellTransform->Position;
|
||||
// e.SpreadAngle = glm::radians<float>(180)/ 4;
|
||||
// e.RelativeUpOrientation = glm::angleAxis(glm::radians<float>(90), glm::vec3(1,0,0));
|
||||
// e.UseGoalVector = true;
|
||||
// e.GoalVelocity = glm::vec3(0,-12,0);
|
||||
// e.Speed = 12;
|
||||
// e.spritePath = "Textures/Sprites/Splash.png";
|
||||
// e.Color = glm::vec4(1.f,1.f,1.f,1);
|
||||
// EventBroker->Publish(e);
|
||||
//}
|
||||
|
||||
|
||||
//{
|
||||
// Events::PlaySFX e;
|
||||
// e.MinDistance = 150.f;
|
||||
// e.Position = shellTransform->Position;
|
||||
// e.Resource = "Sounds/SFX/Explosion.wav";
|
||||
// EventBroker->Publish(e);
|
||||
//}
|
||||
|
||||
// Direct damage
|
||||
auto health = m_World->GetComponent<Components::Health>(otherEntity);
|
||||
if (health)
|
||||
{
|
||||
Events::Damage d;
|
||||
d.Entity = otherEntity;
|
||||
d.Amount = shellComponent->Damage;
|
||||
EventBroker->Publish(d);
|
||||
}
|
||||
|
||||
// Splash damage
|
||||
//for (auto &physComponent : *physicsComponents)
|
||||
//{
|
||||
// EntityID physicsEntity = physComponent->Entity;
|
||||
// // No splash damage to the direct hit target
|
||||
// if (physicsEntity == otherEntity)
|
||||
// continue;
|
||||
// auto physEntityTransform = m_World->GetSystem<Systems::TransformSystem>()->AbsoluteTransform(physicsEntity);
|
||||
|
||||
// float distance = glm::distance(physEntityTransform.Position, shellTransform->Position);
|
||||
// if (distance <= shellComponent->ExplosionRadius)
|
||||
// {
|
||||
// // DO STUFF! :D
|
||||
// float radius = shellComponent->ExplosionRadius;
|
||||
// float strength = (1.f - pow(distance / radius, 2)) * shellComponent->ExplosionStrength;
|
||||
// glm::vec3 direction = glm::normalize(physEntityTransform.Position - shellTransform->Position);
|
||||
|
||||
// Events::ApplyPointImpulse e;
|
||||
// e.Entity = physicsEntity;
|
||||
// e.Impulse = direction * strength;
|
||||
// e.Position = physEntityTransform.Position;
|
||||
// EventBroker->Publish(e);
|
||||
|
||||
// auto health = m_World->GetComponent<Components::Health>(physicsEntity);
|
||||
// if (health && health->VulnerableToSplash)
|
||||
// {
|
||||
// Events::Damage d;
|
||||
// d.Entity = physicsEntity;
|
||||
// d.Amount = (1.f - pow(distance / radius, 2)) * shellComponent->Damage;
|
||||
// EventBroker->Publish(d);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// }
|
||||
//}
|
||||
m_World->RemoveEntity(shellEntity);
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user