diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 16f651e8..a17a2132 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -182,7 +182,9 @@ namespace SHADE camera.offset = SHVec3{ 0.0f }; if (SHComponentManager::HasComponent(camera.GetEID())) { - camera.offset = SHComponentManager::GetComponent(camera.GetEID())->GetOffset(); + auto arm = SHComponentManager::GetComponent(camera.GetEID()); + camera.offset = arm->GetOffset(); + CameraLookAt(camera, camera.position); } SHVec3 view, right, UP; @@ -257,12 +259,7 @@ namespace SHADE SHVec3 target{ 0.0f,0.0f,-1.0f }; SHVec3 up = { 0.0f,1.0f,0.0f }; - if (SHComponentManager::HasComponent(camera.GetEID())) - { - auto arm = SHComponentManager::GetComponent(camera.GetEID()); - target = SHVec3::RotateX(target, SHMath::DegreesToRadians(camera.pitch + arm->GetPitch())); - target = SHVec3::RotateY(target, SHMath::DegreesToRadians(camera.yaw + arm->GetYaw())); - } + target = SHVec3::RotateX(target, SHMath::DegreesToRadians(camera.pitch)); @@ -387,4 +384,53 @@ namespace SHADE DecomposeViewMatrix(viewMatrix, camera.pitch, camera.yaw, camera.roll, camera.position); camera.dirtyView = true; } + + void SHCameraSystem::CameraLookAt(SHCameraComponent& camera, SHVec3 target) noexcept + { + + if (camera.position == target) + { + //lets off set it abit so the view is nt fked + target.z -= 0.0001f; + } + SHVec3 forward, right, upVec; + + SHVec3 up = { 0.0f,1.0f,0.0f }; + + + ////SHVec3::RotateZ(target, SHMath::DegreesToRadians(camera.roll)); + + //target = SHVec3::Normalise(target); + + SHVec3::RotateZ(up, camera.roll); + up = SHVec3::Normalise(up); + + + forward = target - (camera.position + camera.offset); forward = SHVec3::Normalise(forward); + right = SHVec3::Cross(forward, up); right = SHVec3::Normalise(right); + upVec = SHVec3::Cross(forward, right); + + + SHMatrix viewMtx; + viewMtx = SHMatrix::Identity; + viewMtx(0, 0) = right[0]; + viewMtx(0, 1) = right[1]; + viewMtx(0, 2) = right[2]; + + viewMtx(1, 0) = upVec[0]; + viewMtx(1, 1) = upVec[1]; + viewMtx(1, 2) = upVec[2]; + + viewMtx(2, 0) = forward[0]; + viewMtx(2, 1) = forward[1]; + viewMtx(2, 2) = forward[2]; + + viewMtx(0, 3) = -right.Dot(camera.position + camera.offset); + viewMtx(1, 3) = -upVec.Dot(camera.position + camera.offset); + viewMtx(2, 3) = -forward.Dot(camera.position + camera.offset); + + + SetCameraViewMatrix(camera, viewMtx); + } + } diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.h b/SHADE_Engine/src/Camera/SHCameraSystem.h index 6f7e7d1f..98fd442f 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.h +++ b/SHADE_Engine/src/Camera/SHCameraSystem.h @@ -62,7 +62,7 @@ namespace SHADE void SetMainCamera(EntityID eid, size_t directorIndex) noexcept; void DecomposeViewMatrix(SHMatrix const& matrix, float& pitch, float& yaw, float& roll, SHVec3& pos) noexcept; void SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept; - + void CameraLookAt(SHCameraComponent& camera, SHVec3 target) noexcept; };