From 239c90f75bc30decaa3ea672f70ca40f605a918a Mon Sep 17 00:00:00 2001 From: josh Date: Tue, 30 Jan 2024 21:29:01 -0500 Subject: [PATCH] Implement CreateFrustumFromCoordinateFrame() --- src/J3ML/Geometry/Frustum.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/J3ML/Geometry/Frustum.cpp b/src/J3ML/Geometry/Frustum.cpp index 23931a1..b0fd005 100644 --- a/src/J3ML/Geometry/Frustum.cpp +++ b/src/J3ML/Geometry/Frustum.cpp @@ -1 +1,20 @@ #include + +namespace Geometry +{ + Frustum Frustum::CreateFrustumFromCamera(const CoordinateFrame &cam, float aspect, float fovY, float zNear, float zFar) { + Frustum frustum; + const float halfVSide = zFar * tanf(fovY * 0.5f); + const float halfHSide = halfVSide * aspect; + + const Vector3 frontMultFar = cam.Front * zFar; + + frustum.NearFace = Plane{cam.Position + cam.Front * zNear, cam.Front}; + frustum.FarFace = Plane{cam.Position + frontMultFar, -cam.Front}; + frustum.RightFace = Plane{cam.Position, Vector3::Cross(frontMultFar - cam.Right * halfHSide, cam.Up)}; + frustum.LeftFace = Plane{cam.Position, Vector3::Cross(cam.Up, frontMultFar+cam.Right*halfHSide)}; + frustum.TopFace = Plane{cam.Position, Vector3::Cross(cam.Right, frontMultFar - cam.Up * halfVSide)}; + frustum.BottomFace = Plane{cam.Position, Vector3::Cross(frontMultFar + cam.Up * halfVSide, cam.Right)}; + return frustum; + } +} \ No newline at end of file