diff --git a/Source/Engine/Level/Actors/Camera.cpp b/Source/Engine/Level/Actors/Camera.cpp index a91074ab5..142baa745 100644 --- a/Source/Engine/Level/Actors/Camera.cpp +++ b/Source/Engine/Level/Actors/Camera.cpp @@ -120,6 +120,25 @@ void Camera::ProjectPoint(const Vector3& worldSpaceLocation, Float2& cameraViewp cameraViewportSpaceLocation = Float2(clipSpaceLocation); } +bool Camera::IsPointOnView(const Vector3& worldSpaceLocation) const +{ + Vector3 cameraUp = GetTransform().GetUp(); + Vector3 cameraForward = GetTransform().GetForward(); + Vector3 directionToPosition = (worldSpaceLocation - GetPosition()).GetNormalized(); + if (Vector3::Dot(cameraForward, directionToPosition) < 0) + return false; + + Quaternion lookAt = Quaternion::LookRotation(directionToPosition, cameraUp); + Vector3 lookAtDirection = lookAt * Vector3::Forward; + Vector3 newWorldLocation = GetPosition() + lookAtDirection; + + Float2 windowSpace; + const Viewport viewport = GetViewport(); + ProjectPoint(newWorldLocation, windowSpace, viewport); + + return windowSpace.X >= 0 && windowSpace.X <= viewport.Size.X && windowSpace.Y >= 0 && windowSpace.Y <= viewport.Size.Y; +} + Ray Camera::ConvertMouseToRay(const Float2& mousePosition) const { return ConvertMouseToRay(mousePosition, GetViewport()); diff --git a/Source/Engine/Level/Actors/Camera.h b/Source/Engine/Level/Actors/Camera.h index 2b59ab323..465130110 100644 --- a/Source/Engine/Level/Actors/Camera.h +++ b/Source/Engine/Level/Actors/Camera.h @@ -168,6 +168,13 @@ public: /// The viewport. API_FUNCTION() void ProjectPoint(const Vector3& worldSpaceLocation, API_PARAM(Out) Float2& cameraViewportSpaceLocation, API_PARAM(Ref) const Viewport& viewport) const; + /// + /// Checks if the 3d point of the world is in the camera's field of view. + /// + /// World Position (XYZ). + /// Returns true if the point is within the field of view. + API_FUNCTION() bool IsPointOnView(const Vector3& worldSpaceLocation) const; + /// /// Converts the mouse position to 3D ray. ///