From 971fee4a0cfaa0b9017718a8a9e2ade928bc05f2 Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Tue, 9 Feb 2016 15:38:21 +0100 Subject: [PATCH] DamageIndicatorSystem code looking good. Test working well. Sprite display fixed by Viktor --- include/Game/Systems/DamageIndicatorSystem.h | 1 + .../Schema/Entities/SpriteTestTemporary.xml | 7 +--- resources/Shaders/Sprite.vert.glsl | 2 +- src/Game/Systems/DamageIndicatorSystem.cpp | 42 +++++++++++++++---- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/include/Game/Systems/DamageIndicatorSystem.h b/include/Game/Systems/DamageIndicatorSystem.h index 646887e2..561654d1 100644 --- a/include/Game/Systems/DamageIndicatorSystem.h +++ b/include/Game/Systems/DamageIndicatorSystem.h @@ -16,6 +16,7 @@ #include "Rendering/ESetCamera.h" #include +#include class DamageIndicatorSystem : public ImpureSystem { diff --git a/resources/Schema/Entities/SpriteTestTemporary.xml b/resources/Schema/Entities/SpriteTestTemporary.xml index f66e9158..2d02443c 100644 --- a/resources/Schema/Entities/SpriteTestTemporary.xml +++ b/resources/Schema/Entities/SpriteTestTemporary.xml @@ -3,13 +3,10 @@ - Textures/DefenderGunRedDiff.png - Textures/DefenderGunRedIncd.png + Textures/TempDamageIndicator.png + Textures/TempDamageIndicator.png - - Models/Core/UnitQuad.mesh - diff --git a/resources/Shaders/Sprite.vert.glsl b/resources/Shaders/Sprite.vert.glsl index e910a26a..61b387ad 100644 --- a/resources/Shaders/Sprite.vert.glsl +++ b/resources/Shaders/Sprite.vert.glsl @@ -16,7 +16,7 @@ out VertexData{ void main() { - gl_Position = P * M * vec4(Position, 1.0); + gl_Position = P * V * M * vec4(Position, 1.0); Output.Position = Position; Output.TextureCoordinate = TextureCoords; diff --git a/src/Game/Systems/DamageIndicatorSystem.cpp b/src/Game/Systems/DamageIndicatorSystem.cpp index 5f6ad725..24d1cfa4 100644 --- a/src/Game/Systems/DamageIndicatorSystem.cpp +++ b/src/Game/Systems/DamageIndicatorSystem.cpp @@ -21,22 +21,46 @@ bool DamageIndicatorSystem::OnPlayerDamageTaken(Events::PlayerDamage& e) { auto test1 = (glm::vec3)e.PlayerShooter["Transform"]["Orientation"]; auto test2 = (glm::vec3)e.Player["Transform"]["Orientation"]; - //calculate direction - auto enemyOrientation = glm::quat(((glm::vec3)e.PlayerShooter["Transform"]["Orientation"])); + + //grab players direction auto playerOrientation = glm::quat((glm::vec3)e.Player["Transform"]["Orientation"]); - //calculate difference in angle (quaternion math) - auto angle1 = glm::angle(playerOrientation); - auto angle2 = glm::angle(enemyOrientation); - auto quat = glm::angleAxis(angle2 - angle1, glm::vec3(0, 1, 0)); - auto vec3Orientation = glm::eulerAngles(quat); + + //get the position vectors, but ignore the y-height + auto enemyPosition = (glm::vec3) e.PlayerShooter["Transform"]["Position"]; + auto playerPosition = (glm::vec3) e.Player["Transform"]["Position"]; + enemyPosition.y = 0.0f; + playerPosition.y = 0.0f; + + //calculate the enemy to player vector + auto enemyPlayerVector = glm::normalize((glm::vec3) playerPosition - enemyPosition); + + //get angle from players current rotation, this angle is how much you rotate around the y-axis + auto playerAngle = glm::angle(playerOrientation); + auto playerRotationVector = glm::normalize(glm::rotateY(glm::vec3(0, 0, 1), playerAngle)); + + //dot product of players direction-vector and enemys-to-playervector will give the cos of the angle between the vectors + auto playerRotationDot = glm::dot(playerRotationVector, enemyPlayerVector); + //to get the angle between the vectors just do cos-inverse + auto angleBetweenVectors = glm::acos(playerRotationDot); + + //rotate the direction-vector 90 degrees to get the players side-vector + auto playerSideVector = glm::normalize(glm::rotateY(glm::vec3(0, 0, 1), playerAngle + 1.57f)); + //dot of sidevector positive = enemy is on the right side, dot sidevector negative = left side + auto playerSideVectorDot = glm::dot(playerSideVector, enemyPlayerVector); + if (playerSideVectorDot < 0) { + angleBetweenVectors = -angleBetweenVectors; + } + + //LOG_INFO("vector angle %f %f %f %f", t1, t3, t4, enemyPlayerVector.x); //load & set the "2d" sprite auto entityFile = ResourceManager::Load("Schema/Entities/SpriteTestTemporary.xml"); EntityFileParser parser(entityFile); EntityID spriteID = parser.MergeEntities(m_World); m_World->SetParent(spriteID, m_CurrentCamera); - auto cameraWrapper = EntityWrapper(m_World, spriteID); - cameraWrapper["Transform"]["Orientation"] = vec3Orientation; + auto spriteWrapper = EntityWrapper(m_World, spriteID); + //simply set the rotation z-wise to the angleBetweenVectors + spriteWrapper["Transform"]["Orientation"] = glm::vec3(0, 0, angleBetweenVectors); return true; }