diff --git a/Source/Engine/Level/Actors/Camera.cpp b/Source/Engine/Level/Actors/Camera.cpp
index a91074ab5..81c0851a9 100644
--- a/Source/Engine/Level/Actors/Camera.cpp
+++ b/Source/Engine/Level/Actors/Camera.cpp
@@ -120,6 +120,30 @@ 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 = Float2();
+ Float2 screenSize = GetViewport().Size;
+
+ ProjectPoint(newWorldLocation, windowSpace);
+
+ return (windowSpace.X >= 0 && windowSpace.X <= screenSize.X) &&
+ (windowSpace.Y >= 0 && windowSpace.Y <= screenSize.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..bc412542e 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.
///