DamageIndicatorSystem code looking good. Test working well. Sprite display fixed by Viktor
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
#include "Rendering/ESetCamera.h"
|
#include "Rendering/ESetCamera.h"
|
||||||
|
|
||||||
#include <glm/gtc/quaternion.hpp>
|
#include <glm/gtc/quaternion.hpp>
|
||||||
|
#include <glm/gtx/vector_angle.hpp>
|
||||||
|
|
||||||
class DamageIndicatorSystem : public ImpureSystem
|
class DamageIndicatorSystem : public ImpureSystem
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,13 +3,10 @@
|
|||||||
|
|
||||||
<Components>
|
<Components>
|
||||||
<c:Sprite>
|
<c:Sprite>
|
||||||
<DiffuseTexture>Textures/DefenderGunRedDiff.png</DiffuseTexture>
|
<DiffuseTexture>Textures/TempDamageIndicator.png</DiffuseTexture>
|
||||||
<GlowMap>Textures/DefenderGunRedIncd.png</GlowMap>
|
<GlowMap>Textures/TempDamageIndicator.png</GlowMap>
|
||||||
<Color A="1" B="0.721568644" G="1" R="0.839215696"/>
|
<Color A="1" B="0.721568644" G="1" R="0.839215696"/>
|
||||||
</c:Sprite>
|
</c:Sprite>
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Core/UnitQuad.mesh</Resource>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="0" Y="0" Z="-0.472000033"/>
|
<Position X="0" Y="0" Z="-0.472000033"/>
|
||||||
<Scale X="0.100000001" Y="0.200000003" Z="0.5"/>
|
<Scale X="0.100000001" Y="0.200000003" Z="0.5"/>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ out VertexData{
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = P * M * vec4(Position, 1.0);
|
gl_Position = P * V * M * vec4(Position, 1.0);
|
||||||
|
|
||||||
Output.Position = Position;
|
Output.Position = Position;
|
||||||
Output.TextureCoordinate = TextureCoords;
|
Output.TextureCoordinate = TextureCoords;
|
||||||
|
|||||||
@@ -21,22 +21,46 @@ bool DamageIndicatorSystem::OnPlayerDamageTaken(Events::PlayerDamage& e)
|
|||||||
{
|
{
|
||||||
auto test1 = (glm::vec3)e.PlayerShooter["Transform"]["Orientation"];
|
auto test1 = (glm::vec3)e.PlayerShooter["Transform"]["Orientation"];
|
||||||
auto test2 = (glm::vec3)e.Player["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"]);
|
auto playerOrientation = glm::quat((glm::vec3)e.Player["Transform"]["Orientation"]);
|
||||||
//calculate difference in angle (quaternion math)
|
|
||||||
auto angle1 = glm::angle(playerOrientation);
|
//get the position vectors, but ignore the y-height
|
||||||
auto angle2 = glm::angle(enemyOrientation);
|
auto enemyPosition = (glm::vec3) e.PlayerShooter["Transform"]["Position"];
|
||||||
auto quat = glm::angleAxis(angle2 - angle1, glm::vec3(0, 1, 0));
|
auto playerPosition = (glm::vec3) e.Player["Transform"]["Position"];
|
||||||
auto vec3Orientation = glm::eulerAngles(quat);
|
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
|
//load & set the "2d" sprite
|
||||||
auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/SpriteTestTemporary.xml");
|
auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/SpriteTestTemporary.xml");
|
||||||
EntityFileParser parser(entityFile);
|
EntityFileParser parser(entityFile);
|
||||||
EntityID spriteID = parser.MergeEntities(m_World);
|
EntityID spriteID = parser.MergeEntities(m_World);
|
||||||
m_World->SetParent(spriteID, m_CurrentCamera);
|
m_World->SetParent(spriteID, m_CurrentCamera);
|
||||||
auto cameraWrapper = EntityWrapper(m_World, spriteID);
|
auto spriteWrapper = EntityWrapper(m_World, spriteID);
|
||||||
cameraWrapper["Transform"]["Orientation"] = vec3Orientation;
|
//simply set the rotation z-wise to the angleBetweenVectors
|
||||||
|
spriteWrapper["Transform"]["Orientation"] = glm::vec3(0, 0, angleBetweenVectors);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user