diff --git a/include/omath/projection/camera.hpp b/include/omath/projection/camera.hpp index 1678d4bf..013a9471 100644 --- a/include/omath/projection/camera.hpp +++ b/include/omath/projection/camera.hpp @@ -204,9 +204,9 @@ namespace omath::projection template [[nodiscard]] std::expected, Error> - world_to_screen(const Vector3& world_position) const noexcept + world_to_screen(const Vector3& world_position, const bool auto_clip = true) const noexcept { - const auto normalized_cords = world_to_view_port(world_position); + const auto normalized_cords = world_to_view_port(world_position, auto_clip); if (!normalized_cords.has_value()) return std::unexpected{normalized_cords.error()}; @@ -267,7 +267,7 @@ namespace omath::projection } [[nodiscard]] std::expected, Error> - world_to_view_port(const Vector3& world_position) const noexcept + world_to_view_port(const Vector3& world_position, const bool auto_clip = true) const noexcept { auto projected = get_view_projection_matrix() * mat_column_from_vector(world_position); @@ -278,13 +278,13 @@ namespace omath::projection projected /= w; - if (is_ndc_out_of_bounds(projected)) + if (auto_clip && is_ndc_out_of_bounds(projected)) return std::unexpected(Error::WORLD_POSITION_IS_OUT_OF_SCREEN_BOUNDS); return Vector3{projected.at(0, 0), projected.at(1, 0), projected.at(2, 0)}; } [[nodiscard]] - std::expected, Error> view_port_to_screen(const Vector3& ndc) const noexcept + std::expected, Error> view_port_to_world(const Vector3& ndc) const noexcept { const auto inv_view_proj = get_view_projection_matrix().inverted(); @@ -309,7 +309,7 @@ namespace omath::projection [[nodiscard]] std::expected, Error> screen_to_world(const Vector3& screen_pos) const noexcept { - return view_port_to_screen(screen_to_ndc(screen_pos)); + return view_port_to_world(screen_to_ndc(screen_pos)); } template