From 0e6f65f32e98cc98b65b29fee430db0f7f40161c Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sun, 15 Feb 2026 20:12:01 -0600 Subject: [PATCH] feat(ui): implement CSimpleCamera::SetFacing with forward vector --- src/ui/simple/CSimpleCamera.cpp | 53 ++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/ui/simple/CSimpleCamera.cpp b/src/ui/simple/CSimpleCamera.cpp index db439c1..11f2ff5 100644 --- a/src/ui/simple/CSimpleCamera.cpp +++ b/src/ui/simple/CSimpleCamera.cpp @@ -1,4 +1,55 @@ #include "ui/simple/CSimpleCamera.hpp" +#include + +namespace { + +void FaceDirection(const C3Vector& direction, C3Vector& xPrime, C3Vector& yPrime, C3Vector& zPrime) { + STORM_ASSERT(CMath::fnotequal(direction.SquaredMag(), 0.0f)); + + // Forward + xPrime = direction; + + // Right + if (CMath::fequal(xPrime.SquaredMag(), 0.0f)) { + yPrime.x = 1.0f; + yPrime.y = 0.0f; + yPrime.z = 0.0f; + } else { + yPrime.x = -xPrime.y; + yPrime.y = xPrime.x; + yPrime.z = 0.0f; + + CMath::normalize(yPrime.x, yPrime.y); + } + + // Up (Forward cross Right) + zPrime = C3Vector::Cross(xPrime, yPrime); +} + +void BuildBillboardMatrix(const C3Vector& direction, C33Matrix& rotation) { + C3Vector xPrime = {}; + C3Vector yPrime = {}; + C3Vector zPrime = {}; + + FaceDirection(direction, xPrime, yPrime, zPrime); + + // Forward + rotation.a0 = xPrime.x; + rotation.a1 = xPrime.y; + rotation.a2 = xPrime.z; + + // Right + rotation.b0 = yPrime.x; + rotation.b1 = yPrime.y; + rotation.b2 = yPrime.z; + + // Up + rotation.c0 = zPrime.x; + rotation.c1 = zPrime.y; + rotation.c2 = zPrime.z; +} + +} CSimpleCamera::CSimpleCamera(float nearZ, float farZ, float fov) { this->float10 = 0.0f; @@ -24,7 +75,7 @@ C3Vector CSimpleCamera::Right() const { } void CSimpleCamera::SetFacing(const C3Vector& forward) { - // TODO + BuildBillboardMatrix(forward, this->m_facing); } void CSimpleCamera::SetFacing(const C3Vector& forward, const C3Vector& up) {