From db1ce08c42824ecf540e3c39b74bb47d84835188 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Sat, 30 Sep 2023 14:27:05 -0400 Subject: [PATCH] Added option for billboard to be position based instead of view based --- Nuake/src/Rendering/SceneRenderer.cpp | 34 ++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/Nuake/src/Rendering/SceneRenderer.cpp b/Nuake/src/Rendering/SceneRenderer.cpp index be6b55d8..988e3417 100644 --- a/Nuake/src/Rendering/SceneRenderer.cpp +++ b/Nuake/src/Rendering/SceneRenderer.cpp @@ -391,7 +391,19 @@ namespace Nuake auto finalQuadTransform = transform.GetGlobalTransform(); if (sprite.Billboard) { - finalQuadTransform = glm::inverse(mView); + if (sprite.PositionFacing) + { + const Matrix4& invView = glm::inverse(mView); + const Vector3& cameraPosition = Vector3(invView[3][0], invView[3][1], invView[3][2]); + const Vector3& spritePosition = Vector3(finalQuadTransform[3][0], finalQuadTransform[3][1], finalQuadTransform[3][2]); + const Vector3& direction = cameraPosition - spritePosition; + finalQuadTransform = glm::inverse(glm::lookAt(Vector3(), direction, Vector3(0, 1, 0))); + } + else + { + finalQuadTransform = glm::inverse(mView); + + } if (sprite.LockYRotation) { @@ -401,8 +413,7 @@ namespace Nuake finalQuadTransform = finalQuadTransform; } - // Translation - finalQuadTransform[3] = Vector4(transform.GetGlobalPosition(), 1.0f); + finalQuadTransform[3] = Vector4(Vector3(transform.GetGlobalTransform()[3]), 1.0f); // Scale finalQuadTransform = glm::scale(finalQuadTransform, transform.GetGlobalScale()); @@ -517,7 +528,19 @@ namespace Nuake auto finalQuadTransform = transform.GetGlobalTransform(); if (sprite.Billboard) { - finalQuadTransform = glm::inverse(mView); + if (sprite.PositionFacing) + { + const Matrix4& invView = glm::inverse(mView); + const Vector3& cameraPosition = Vector3(invView[3][0], invView[3][1], invView[3][2]); + const Vector3& spritePosition = Vector3(finalQuadTransform[3][0], finalQuadTransform[3][1], finalQuadTransform[3][2]); + const Vector3& direction = cameraPosition - spritePosition; + finalQuadTransform = glm::inverse(glm::lookAt(Vector3(), direction, Vector3(0, 1, 0))); + } + else + { + finalQuadTransform = glm::inverse(mView); + + } if (sprite.LockYRotation) { @@ -527,8 +550,7 @@ namespace Nuake finalQuadTransform = finalQuadTransform; } - // Translation - finalQuadTransform[3] = Vector4(transform.GetGlobalPosition(), 1.0f); + finalQuadTransform[3] = Vector4(Vector3(transform.GetGlobalTransform()[3]), 1.0f); // Scale finalQuadTransform = glm::scale(finalQuadTransform, transform.GetGlobalScale());