diff --git a/include/Engine/Rendering/ModelJob.h b/include/Engine/Rendering/ModelJob.h
index 8801d2eb..c2a469d2 100644
--- a/include/Engine/Rendering/ModelJob.h
+++ b/include/Engine/Rendering/ModelJob.h
@@ -184,7 +184,7 @@ struct ModelJob : RenderJob
void CalculateHash() override
{
- Hash = TextureID + ModelID << 10 + ShaderID << 20;
+ Hash = ShaderID << 20 + ModelID << 10 + TextureID;
}
};
diff --git a/include/Engine/Rendering/SpriteJob.h b/include/Engine/Rendering/SpriteJob.h
index 4fe19dca..25c2d5cb 100644
--- a/include/Engine/Rendering/SpriteJob.h
+++ b/include/Engine/Rendering/SpriteJob.h
@@ -17,7 +17,7 @@
struct SpriteJob : RenderJob
{
- SpriteJob(ComponentWrapper cSprite, Camera* camera, glm::mat4 matrix, World* world, glm::vec4 fillColor, float fillPercentage, bool depthSorted)
+ SpriteJob(ComponentWrapper cSprite, Camera* camera, glm::mat4 matrix, World* world, glm::vec4 fillColor, float fillPercentage, bool depthSorted, bool isIndicator)
: RenderJob()
{
Model = ResourceManager::Load<::Model>("Models/Core/UnitQuad.mesh");
@@ -30,7 +30,7 @@ struct SpriteJob : RenderJob
StartIndex = matProp.material->StartIndex;
EndIndex = matProp.material->EndIndex;
- Matrix = matrix;
+ Matrix = matrix;
Color = cSprite["Color"];
Entity = cSprite.EntityID;
Position = Transform::AbsolutePosition(world, cSprite.EntityID);
@@ -41,7 +41,8 @@ struct SpriteJob : RenderJob
}
World = world;
Pickable = world->HasComponent(cSprite.EntityID, "Button");
-
+ IsIndicator = isIndicator;
+
FillColor = fillColor;
FillPercentage = fillPercentage;
};
@@ -61,7 +62,9 @@ struct SpriteJob : RenderJob
unsigned int StartIndex = 0;
unsigned int EndIndex = 0;
World* World;
+
bool Pickable;
+ bool IsIndicator = false;
glm::vec4 FillColor = glm::vec4(0);
float FillPercentage = 0.0;
diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd
index 74423f56..42abed82 100644
--- a/resources/Schema/Components.xsd
+++ b/resources/Schema/Components.xsd
@@ -44,5 +44,6 @@
+
\ No newline at end of file
diff --git a/resources/Schema/Components/SpriteIndicator.xml b/resources/Schema/Components/SpriteIndicator.xml
new file mode 100644
index 00000000..cbed22f0
--- /dev/null
+++ b/resources/Schema/Components/SpriteIndicator.xml
@@ -0,0 +1,5 @@
+
+
+ 10
+ false
+
\ No newline at end of file
diff --git a/resources/Schema/Components/SpriteIndicator.xsd b/resources/Schema/Components/SpriteIndicator.xsd
new file mode 100644
index 00000000..bd8c1038
--- /dev/null
+++ b/resources/Schema/Components/SpriteIndicator.xsd
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+ Billbord a Sprite around global Y axis
+
+
+
+
+
+ Add a Team component to this Entity or Parent to make it visible only for that team
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/Schema/Entities/Player.xml b/resources/Schema/Entities/Player.xml
index d4485112..48adffac 100644
--- a/resources/Schema/Entities/Player.xml
+++ b/resources/Schema/Entities/Player.xml
@@ -13,6 +13,7 @@
+
@@ -60,6 +61,7 @@
Textures/Weapons/Crosshair/SmallThickHoleDot.png
false
+
@@ -110,6 +112,7 @@
Textures/HealthHUD3.png
+
@@ -135,6 +138,7 @@
Textures/Core/UnitHexagon.png
+
@@ -152,6 +156,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -167,6 +172,7 @@
Textures/Core/UnitHexagon.png
+
@@ -185,6 +191,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -200,6 +207,7 @@
Textures/Core/UnitHexagon.png
+
@@ -217,6 +225,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -232,6 +241,7 @@
Textures/Core/UnitHexagon.png
+
@@ -249,6 +259,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -264,6 +275,7 @@
Textures/Core/UnitHexagon.png
+
@@ -279,6 +291,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -304,6 +317,7 @@
+
Fonts/DroidSans.ttf,64
@@ -316,6 +330,7 @@
+
Fonts/DroidSans.ttf,64
@@ -330,6 +345,7 @@
+
Fonts/DroidSans.ttf,64
@@ -349,8 +365,10 @@
Idle
- 1.8314163732853146
+ 0.97725610639912475
1
+
+
Models/Characters/Assault/FirstPerson.mesh
@@ -368,8 +386,8 @@
Models/Weapons/Blue/AssaultWeaponBlue.mesh
-
-
+
+
@@ -406,6 +424,7 @@
Textures/Core/UnitHexagon.png
+
@@ -475,8 +494,10 @@
Idle
- 0.16333512901638159
+ 0.87583812735846323
1
+
+
AimRifle
@@ -499,8 +520,8 @@
Models/Weapons/Blue/AssaultWeaponBlue.mesh
-
-
+
+
@@ -570,6 +591,26 @@
+
+
+
+ Textures/Icons/Arrow.png
+ false
+
+
+
+
+
+ 50
+ true
+
+
+
+
+
+
+
+
diff --git a/resources/Schema/Entities/PlayerRed.xml b/resources/Schema/Entities/PlayerRed.xml
index 4be8fc26..cd01632e 100644
--- a/resources/Schema/Entities/PlayerRed.xml
+++ b/resources/Schema/Entities/PlayerRed.xml
@@ -13,6 +13,7 @@
+
@@ -60,6 +61,7 @@
Textures/Weapons/Crosshair/SmallThickHoleDot.png
false
+
@@ -110,6 +112,7 @@
Textures/HealthHUD3.png
+
@@ -135,6 +138,7 @@
Textures/Core/UnitHexagon.png
+
@@ -152,6 +156,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -167,6 +172,7 @@
Textures/Core/UnitHexagon.png
+
@@ -185,6 +191,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -200,6 +207,7 @@
Textures/Core/UnitHexagon.png
+
@@ -217,6 +225,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -232,6 +241,7 @@
Textures/Core/UnitHexagon.png
+
@@ -249,6 +259,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -264,6 +275,7 @@
Textures/Core/UnitHexagon.png
+
@@ -279,6 +291,7 @@
Textures/Core/UnitHexagon_Rotated.png
+
@@ -304,6 +317,7 @@
+
Fonts/DroidSans.ttf,64
@@ -316,6 +330,7 @@
+
Fonts/DroidSans.ttf,64
@@ -330,6 +345,7 @@
+
Fonts/DroidSans.ttf,64
@@ -349,8 +365,10 @@
Idle
- 0.018170670865885086
+ 1.2667383999985162
1
+
+
Models/Characters/Assault/FirstPerson.mesh
@@ -368,8 +386,8 @@
Models/Weapons/Red/AssaultWeaponRed.mesh
-
-
+
+
@@ -406,6 +424,7 @@
Textures/Core/UnitHexagon.png
+
@@ -475,8 +494,10 @@
Idle
- 0.11675631578762591
+ 0.26532318661337229
1
+
+
AimRifle
@@ -499,8 +520,8 @@
Models/Weapons/Red/AssaultWeaponRed.mesh
-
-
+
+
@@ -570,6 +591,26 @@
+
+
+
+ Textures/Icons/Arrow.png
+ false
+
+
+
+
+
+ 50
+ true
+
+
+
+
+
+
+
+
diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp
index 665c4027..7b0ea84f 100644
--- a/src/Engine/Rendering/RenderSystem.cpp
+++ b/src/Engine/Rendering/RenderSystem.cpp
@@ -52,6 +52,101 @@ void RenderSystem::fillSprites(std::list>& jobs, Worl
continue;
}
+ glm::mat4 modelMatrix;
+
+ // See a sprite is an SpriteIndicator
+ bool isIndicator = false;
+ if (world->HasComponent(entity.ID, "SpriteIndicator"))
+ {
+ auto indicator = entity["SpriteIndicator"];
+
+ float minScale = (float)(double)indicator["MinScale"];
+ bool hasTeam = indicator["VisibleForSingleTeamOnly"];
+ isIndicator = true;
+ glm::vec3 pos = Transform::AbsolutePosition(entity);
+
+
+ EntityWrapper entityTeam;
+ if (hasTeam && (entity.HasComponent("Team") || entity.FirstParentWithComponent("Team").Valid()) && m_LocalPlayer.World != nullptr) {
+ if (!entity.HasComponent("Team")) {
+ entityTeam = entity.FirstParentWithComponent("Team");
+ }
+ else {
+ entityTeam = entity;
+ }
+
+ ComponentWrapper& entityTeamComponent = entityTeam["Team"];
+ ComponentWrapper& localComponent = m_LocalPlayer["Team"];
+ int entityTeamInt = entityTeamComponent["Team"];
+ int localComponentInt = localComponent["Team"];
+ int SpectatorInt = localComponent["Team"].Enum("Spectator");
+ if (entityTeamInt != localComponentInt && localComponentInt != SpectatorInt) {
+ continue;
+ }
+ }
+
+ // Code for check if sprite is inside or outside of screen
+ //glm::vec4 projectedPos = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix() * glm::vec4(pos, 1.0f);
+ //projectedPos /= projectedPos.w;
+ //// Check if inside of outside of screen.
+ //if (projectedPos.x < -1.0f || projectedPos.x > 1.0f || projectedPos.y < -1.0f || projectedPos.y > 1.0f) {
+ // // is outside of screen
+ //} else {
+ // // is inside of screen
+ //}
+
+
+ glm::vec3 zAxis = glm::vec3(0.0f, 1.0f, 0.0f);
+ glm::vec3 normal = pos - m_Camera->Position();
+
+ //float distance = glm::length(normal);
+ //if (distance < minDistance) {
+ // pos = pos - glm::normalize(normal) * (distance - minDistance);
+ //} else if (distance > maxDistance) {
+ // pos = pos - glm::normalize(normal) * (distance - maxDistance);
+ //}
+ normal.y = 0;
+ normal = glm::normalize(normal);
+ glm::vec3 right = glm::cross(normal, zAxis);
+ glm::vec3 up = glm::cross(right, normal);
+
+ modelMatrix[0][0] = right.x;
+ modelMatrix[0][1] = right.y;
+ modelMatrix[0][2] = right.z;
+ modelMatrix[0][3] = 0.0f;
+
+ modelMatrix[1][0] = zAxis.x;
+ modelMatrix[1][1] = zAxis.y;
+ modelMatrix[1][2] = zAxis.z;
+ modelMatrix[1][3] = 0.0f;
+
+ modelMatrix[2][0] = normal.x;
+ modelMatrix[2][1] = normal.y;
+ modelMatrix[2][2] = normal.z;
+ modelMatrix[2][3] = 0.0f;
+
+ modelMatrix[3][0] = pos.x;
+ modelMatrix[3][1] = pos.y;
+ modelMatrix[3][2] = pos.z;
+ modelMatrix[3][3] = 1.0f;
+
+ glm::mat4 tranformationMatrix = modelMatrix * glm::scale(Transform::AbsoluteScale(entity));
+ glm::vec4 tmp = tranformationMatrix * glm::vec4(glm::vec3(0.5, 0.5, 0), 1.0f);
+ glm::vec2 projectedTopRight = m_Camera->WorldToScreen(glm::vec3(tmp), m_Renderer->GetViewportSize());
+ tmp = tranformationMatrix * glm::vec4(glm::vec3(-0.5, -0.5, 0), 1.0f);
+ glm::vec2 projectedBottomLeft = m_Camera->WorldToScreen(glm::vec3(tmp), m_Renderer->GetViewportSize());
+
+ float diag = glm::length(projectedBottomLeft - projectedTopRight);
+ if (diag < minScale) {
+ tranformationMatrix = tranformationMatrix * glm::scale(glm::vec3(minScale / diag, minScale / diag, minScale / diag));
+ }
+ modelMatrix = tranformationMatrix;
+ }
+ else {
+ modelMatrix = Transform::ModelMatrix(entity.ID, world);
+ }
+
+
std::string diffuseResource = cSprite["DiffuseTexture"];
std::string glowResource = cSprite["GlowMap"];
bool depthSorted = cSprite["DepthSort"];
@@ -67,11 +162,7 @@ void RenderSystem::fillSprites(std::list>& jobs, Worl
fillColor = (glm::vec4)fillComponent["Color"];
}
- glm::mat4 modelMatrix = Transform::ModelMatrix(entity.ID, world);
- //modelMatrix *= m_Camera->BillboardMatrix();
-
-
- std::shared_ptr spriteJob = std::shared_ptr(new SpriteJob(cSprite, m_Camera, modelMatrix, world, fillColor, fillPercentage, depthSorted));
+ std::shared_ptr spriteJob = std::shared_ptr(new SpriteJob(cSprite, m_Camera, modelMatrix, world, fillColor, fillPercentage, depthSorted, isIndicator));
jobs.push_back(spriteJob);
}
@@ -93,7 +184,6 @@ bool RenderSystem::isEntityVisible(EntityWrapper& entity)
) {
return false;
}
-
return true;
}