mirror of
https://github.com/orange-cpp/omath.git
synced 2026-08-08 22:12:05 +00:00
Compare commits
15 Commits
63ea93dc1c
..
v5.4.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 306096af14 | |||
| 502cfb431c | |||
| 8ccc9459d4 | |||
| 2ee485297f | |||
| 6a5771e57d | |||
| 58c082d399 | |||
| 11e6f67e23 | |||
| d7f9ab6e85 | |||
| ceecdde9dc | |||
| a546c1a6d1 | |||
| 8a591ce769 | |||
| b0561c193e | |||
| fee4e4b9e3 | |||
| 2779bae82f | |||
| e82ec9c8ac |
@@ -6,6 +6,7 @@ Thanks to everyone who made this possible, including:
|
||||
- Billy O'Neal aka BillyONeal for fixing compilation issues due to C math library compatibility.
|
||||
- Alex2772 for reference of AUI declarative interface design for omath::hud.
|
||||
- Keith O'Hara aka kthohr for a C++ generalized constant expression-based math library that was used as reference.
|
||||
|
||||
And a big hand to everyone else who has contributed over the past!
|
||||
|
||||
THANKS! <3
|
||||
|
||||
@@ -7,59 +7,59 @@
|
||||
|
||||
namespace omath::cry_engine
|
||||
{
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
{
|
||||
return mat_rotation_axis_z<float, MatStoreType::ROW_MAJOR>(angles.yaw)
|
||||
* mat_rotation_axis_y<float, MatStoreType::ROW_MAJOR>(angles.roll)
|
||||
* mat_rotation_axis_x<float, MatStoreType::ROW_MAJOR>(angles.pitch);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("forward vector result should not be discarded")]]
|
||||
constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_forward);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("right vector result should not be discarded")]]
|
||||
constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_right);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("up vector result should not be discarded")]]
|
||||
constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_up);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return mat_camera_view<float, MatStoreType::ROW_MAJOR>(forward_vector(angles), right_vector(angles),
|
||||
up_vector(angles), cam_origin);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("origin result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_origin(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("scale result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_scale(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("rotation angles result should not be discarded")]]
|
||||
constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
{
|
||||
const auto angles = mat_extract_rotation_zyx(mat);
|
||||
return {
|
||||
@@ -68,8 +68,8 @@ namespace omath::cry_engine
|
||||
RollAngle::from_degrees(angles.y),
|
||||
};
|
||||
}
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4
|
||||
[[nodiscard("perspective projection matrix result should not be discarded")]]
|
||||
constexpr Mat4X4
|
||||
calc_perspective_projection_matrix(const float field_of_view, const float aspect_ratio, const float near_plane,
|
||||
const float far_plane,
|
||||
const NDCDepthRange ndc_depth_range = NDCDepthRange::ZERO_TO_ONE) noexcept
|
||||
@@ -87,7 +87,7 @@ namespace omath::cry_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("centimeters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_centimeters(const FloatingType& units)
|
||||
{
|
||||
return units / static_cast<FloatingType>(100);
|
||||
@@ -95,7 +95,7 @@ namespace omath::cry_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("meters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_meters(const FloatingType& units)
|
||||
{
|
||||
return units;
|
||||
@@ -103,7 +103,7 @@ namespace omath::cry_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("kilometers value should not be discarded")]]
|
||||
constexpr FloatingType units_to_kilometers(const FloatingType& units)
|
||||
{
|
||||
return units_to_meters(units) / static_cast<FloatingType>(1000);
|
||||
@@ -111,7 +111,7 @@ namespace omath::cry_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType centimeters_to_units(const FloatingType& centimeters)
|
||||
{
|
||||
return centimeters * static_cast<FloatingType>(100);
|
||||
@@ -119,7 +119,7 @@ namespace omath::cry_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType meters_to_units(const FloatingType& meters)
|
||||
{
|
||||
return meters;
|
||||
@@ -127,7 +127,7 @@ namespace omath::cry_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType kilometers_to_units(const FloatingType& kilometers)
|
||||
{
|
||||
return meters_to_units(kilometers * static_cast<FloatingType>(1000));
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace omath::cry_engine
|
||||
class CameraTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("look-at angle result should not be discarded")]]
|
||||
constexpr static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin,
|
||||
const Vector3<float>& look_at) noexcept
|
||||
{
|
||||
@@ -20,12 +20,12 @@ namespace omath::cry_engine
|
||||
YawAngle::from_radians(-internal::atan2(direction.x, direction.y)), RollAngle::from_radians(0.f)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return cry_engine::calc_view_matrix(angles, cam_origin);
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("projection matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov,
|
||||
const projection::ViewPort& view_port, const float near_plane,
|
||||
const float far_plane,
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace omath::cry_engine
|
||||
class MeshTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
static Mat4X4 rotation_matrix(const ViewAngles& rotation)
|
||||
{
|
||||
return cry_engine::rotation_matrix(rotation);
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace omath::cry_engine
|
||||
class PredEngineTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard("projectile position result should not be discarded")]]
|
||||
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile<float>& projectile,
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
@@ -25,7 +26,7 @@ namespace omath::cry_engine
|
||||
|
||||
return current_pos;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("target position result should not be discarded")]]
|
||||
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target<float>& target,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
@@ -36,19 +37,19 @@ namespace omath::cry_engine
|
||||
|
||||
return predicted;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("2d distance result should not be discarded")]]
|
||||
static float calc_vector_2d_distance(const Vector3<float>& delta) noexcept
|
||||
{
|
||||
return std::sqrt(delta.x * delta.x + delta.y * delta.y);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("height coordinate result should not be discarded")]]
|
||||
constexpr static float get_vector_height_coordinate(const Vector3<float>& vec) noexcept
|
||||
{
|
||||
return vec.z;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("viewpoint result should not be discarded")]]
|
||||
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile<float>& projectile,
|
||||
Vector3<float> predicted_target_position,
|
||||
const std::optional<float> projectile_pitch) noexcept
|
||||
@@ -60,13 +61,13 @@ namespace omath::cry_engine
|
||||
}
|
||||
// Due to specification of maybe_calculate_projectile_launch_pitch_angle, pitch angle must be:
|
||||
// 89 look up, -89 look down
|
||||
[[nodiscard]]
|
||||
[[nodiscard("pitch angle result should not be discarded")]]
|
||||
static float calc_direct_pitch_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
return angles::radians_to_degrees(std::asin(direction.z));
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("yaw angle result should not be discarded")]]
|
||||
static float calc_direct_yaw_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
|
||||
@@ -7,62 +7,62 @@
|
||||
|
||||
namespace omath::frostbite_engine
|
||||
{
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("forward vector result should not be discarded")]]
|
||||
constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_forward);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("right vector result should not be discarded")]]
|
||||
constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_right);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("up vector result should not be discarded")]]
|
||||
constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_up);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return mat_camera_view<float, MatStoreType::ROW_MAJOR>(forward_vector(angles), right_vector(angles),
|
||||
up_vector(angles), cam_origin);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
{
|
||||
return mat_rotation_axis_z<float, MatStoreType::ROW_MAJOR>(angles.roll)
|
||||
* mat_rotation_axis_y<float, MatStoreType::ROW_MAJOR>(angles.yaw)
|
||||
* mat_rotation_axis_x<float, MatStoreType::ROW_MAJOR>(angles.pitch);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("origin result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_origin(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("scale result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_scale(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("rotation angles result should not be discarded")]]
|
||||
constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
{
|
||||
const auto angles = mat_extract_rotation_zyx(mat);
|
||||
return {
|
||||
@@ -72,8 +72,8 @@ namespace omath::frostbite_engine
|
||||
};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
[[nodiscard("perspective projection matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
const float field_of_view, const float aspect_ratio, const float near_plane, const float far_plane,
|
||||
const NDCDepthRange ndc_depth_range = NDCDepthRange::NEGATIVE_ONE_TO_ONE) noexcept
|
||||
{
|
||||
@@ -91,7 +91,7 @@ namespace omath::frostbite_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("centimeters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_centimeters(const FloatingType& units)
|
||||
{
|
||||
return units / static_cast<FloatingType>(100);
|
||||
@@ -99,7 +99,7 @@ namespace omath::frostbite_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("meters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_meters(const FloatingType& units)
|
||||
{
|
||||
return units;
|
||||
@@ -107,7 +107,7 @@ namespace omath::frostbite_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("kilometers value should not be discarded")]]
|
||||
constexpr FloatingType units_to_kilometers(const FloatingType& units)
|
||||
{
|
||||
return units_to_meters(units) / static_cast<FloatingType>(1000);
|
||||
@@ -115,7 +115,7 @@ namespace omath::frostbite_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType centimeters_to_units(const FloatingType& centimeters)
|
||||
{
|
||||
return centimeters * static_cast<FloatingType>(100);
|
||||
@@ -123,7 +123,7 @@ namespace omath::frostbite_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType meters_to_units(const FloatingType& meters)
|
||||
{
|
||||
return meters;
|
||||
@@ -131,7 +131,7 @@ namespace omath::frostbite_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType kilometers_to_units(const FloatingType& kilometers)
|
||||
{
|
||||
return meters_to_units(kilometers * static_cast<FloatingType>(1000));
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace omath::frostbite_engine
|
||||
class CameraTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("look-at angle result should not be discarded")]]
|
||||
constexpr static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin,
|
||||
const Vector3<float>& look_at) noexcept
|
||||
{
|
||||
@@ -22,12 +22,12 @@ namespace omath::frostbite_engine
|
||||
YawAngle::from_radians(internal::atan2(direction.x, direction.z)), RollAngle::from_radians(0.f)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return frostbite_engine::calc_view_matrix(angles, cam_origin);
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("projection matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov,
|
||||
const projection::ViewPort& view_port, const float near_plane,
|
||||
const float far_plane,
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace omath::frostbite_engine
|
||||
class MeshTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
static Mat4X4 rotation_matrix(const ViewAngles& rotation)
|
||||
{
|
||||
return frostbite_engine::rotation_matrix(rotation);
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace omath::frostbite_engine
|
||||
class PredEngineTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard("projectile position result should not be discarded")]]
|
||||
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile<float>& projectile,
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
@@ -25,7 +26,7 @@ namespace omath::frostbite_engine
|
||||
|
||||
return current_pos;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("target position result should not be discarded")]]
|
||||
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target<float>& target,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
@@ -36,19 +37,19 @@ namespace omath::frostbite_engine
|
||||
|
||||
return predicted;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("2d distance result should not be discarded")]]
|
||||
static float calc_vector_2d_distance(const Vector3<float>& delta) noexcept
|
||||
{
|
||||
return std::sqrt(delta.x * delta.x + delta.z * delta.z);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("height coordinate result should not be discarded")]]
|
||||
constexpr static float get_vector_height_coordinate(const Vector3<float>& vec) noexcept
|
||||
{
|
||||
return vec.y;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("viewpoint result should not be discarded")]]
|
||||
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile<float>& projectile,
|
||||
Vector3<float> predicted_target_position,
|
||||
const std::optional<float> projectile_pitch) noexcept
|
||||
@@ -60,13 +61,13 @@ namespace omath::frostbite_engine
|
||||
}
|
||||
// Due to specification of maybe_calculate_projectile_launch_pitch_angle, pitch angle must be:
|
||||
// 89 look up, -89 look down
|
||||
[[nodiscard]]
|
||||
[[nodiscard("pitch angle result should not be discarded")]]
|
||||
static float calc_direct_pitch_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
return angles::radians_to_degrees(std::asin(direction.y));
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("yaw angle result should not be discarded")]]
|
||||
static float calc_direct_yaw_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
|
||||
@@ -7,53 +7,53 @@
|
||||
|
||||
namespace omath::iw_engine
|
||||
{
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("forward vector result should not be discarded")]]
|
||||
constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_forward);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("right vector result should not be discarded")]]
|
||||
constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_right);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("up vector result should not be discarded")]]
|
||||
constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_up);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
{
|
||||
return mat_rotation_axis_z(angles.yaw) * mat_rotation_axis_y(angles.pitch) * mat_rotation_axis_x(angles.roll);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("origin result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_origin(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("scale result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_scale(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("rotation angles result should not be discarded")]]
|
||||
constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
{
|
||||
const auto angles = mat_extract_rotation_zyx(mat);
|
||||
return {
|
||||
@@ -63,14 +63,14 @@ namespace omath::iw_engine
|
||||
};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return mat_camera_view(forward_vector(angles), right_vector(angles), up_vector(angles), cam_origin);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
[[nodiscard("perspective projection matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
const float field_of_view, const float aspect_ratio, const float near_plane, const float far_plane,
|
||||
const NDCDepthRange ndc_depth_range = NDCDepthRange::NEGATIVE_ONE_TO_ONE) noexcept
|
||||
{
|
||||
@@ -89,7 +89,7 @@ namespace omath::iw_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("centimeters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_centimeters(const FloatingType& units)
|
||||
{
|
||||
constexpr auto centimeter_in_unit = static_cast<FloatingType>(2.54);
|
||||
@@ -98,7 +98,7 @@ namespace omath::iw_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("meters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_meters(const FloatingType& units)
|
||||
{
|
||||
return units_to_centimeters(units) / static_cast<FloatingType>(100);
|
||||
@@ -106,7 +106,7 @@ namespace omath::iw_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("kilometers value should not be discarded")]]
|
||||
constexpr FloatingType units_to_kilometers(const FloatingType& units)
|
||||
{
|
||||
return units_to_meters(units) / static_cast<FloatingType>(1000);
|
||||
@@ -114,7 +114,7 @@ namespace omath::iw_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType centimeters_to_units(const FloatingType& centimeters)
|
||||
{
|
||||
constexpr auto centimeter_in_unit = static_cast<FloatingType>(2.54);
|
||||
@@ -123,7 +123,7 @@ namespace omath::iw_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType meters_to_units(const FloatingType& meters)
|
||||
{
|
||||
return centimeters_to_units(meters * static_cast<FloatingType>(100));
|
||||
@@ -131,7 +131,7 @@ namespace omath::iw_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType kilometers_to_units(const FloatingType& kilometers)
|
||||
{
|
||||
return meters_to_units(kilometers * static_cast<FloatingType>(1000));
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace omath::iw_engine
|
||||
class CameraTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("look-at angle result should not be discarded")]]
|
||||
constexpr static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin,
|
||||
const Vector3<float>& look_at) noexcept
|
||||
{
|
||||
@@ -22,12 +22,12 @@ namespace omath::iw_engine
|
||||
YawAngle::from_radians(internal::atan2(direction.y, direction.x)), RollAngle::from_radians(0.f)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return iw_engine::calc_view_matrix(angles, cam_origin);
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("projection matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov,
|
||||
const projection::ViewPort& view_port, const float near_plane,
|
||||
const float far_plane,
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace omath::iw_engine
|
||||
class MeshTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
static Mat4X4 rotation_matrix(const ViewAngles& rotation)
|
||||
{
|
||||
return iw_engine::rotation_matrix(rotation);
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace omath::iw_engine
|
||||
class PredEngineTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard("projectile position result should not be discarded")]]
|
||||
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile<float>& projectile,
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
@@ -26,7 +27,7 @@ namespace omath::iw_engine
|
||||
|
||||
return current_pos;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("target position result should not be discarded")]]
|
||||
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target<float>& target,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
@@ -37,19 +38,19 @@ namespace omath::iw_engine
|
||||
|
||||
return predicted;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("2d distance result should not be discarded")]]
|
||||
static float calc_vector_2d_distance(const Vector3<float>& delta) noexcept
|
||||
{
|
||||
return std::sqrt(delta.x * delta.x + delta.y * delta.y);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("height coordinate result should not be discarded")]]
|
||||
constexpr static float get_vector_height_coordinate(const Vector3<float>& vec) noexcept
|
||||
{
|
||||
return vec.z;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("viewpoint result should not be discarded")]]
|
||||
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile<float>& projectile,
|
||||
Vector3<float> predicted_target_position,
|
||||
const std::optional<float> projectile_pitch) noexcept
|
||||
@@ -61,7 +62,7 @@ namespace omath::iw_engine
|
||||
}
|
||||
// Due to specification of maybe_calculate_projectile_launch_pitch_angle, pitch angle must be:
|
||||
// 89 look up, -89 look down
|
||||
[[nodiscard]]
|
||||
[[nodiscard("pitch angle result should not be discarded")]]
|
||||
static float calc_direct_pitch_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto distance = origin.distance_to(view_to);
|
||||
@@ -69,7 +70,7 @@ namespace omath::iw_engine
|
||||
|
||||
return angles::radians_to_degrees(std::asin(delta.z / distance));
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("yaw angle result should not be discarded")]]
|
||||
static float calc_direct_yaw_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto delta = view_to - origin;
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
|
||||
namespace omath::opengl_engine
|
||||
{
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("forward vector result should not be discarded")]]
|
||||
constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec =
|
||||
rotation_matrix(angles) * mat_column_from_vector<float, MatStoreType::COLUMN_MAJOR>(k_abs_forward);
|
||||
@@ -18,8 +18,8 @@ namespace omath::opengl_engine
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("right vector result should not be discarded")]]
|
||||
constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec =
|
||||
rotation_matrix(angles) * mat_column_from_vector<float, MatStoreType::COLUMN_MAJOR>(k_abs_right);
|
||||
@@ -27,42 +27,42 @@ namespace omath::opengl_engine
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("up vector result should not be discarded")]]
|
||||
constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector<float, MatStoreType::COLUMN_MAJOR>(k_abs_up);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return mat_look_at_right_handed(cam_origin, cam_origin + forward_vector(angles), up_vector(angles));
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
{
|
||||
return mat_rotation_axis_z<float, MatStoreType::COLUMN_MAJOR>(angles.roll)
|
||||
* mat_rotation_axis_y<float, MatStoreType::COLUMN_MAJOR>(angles.yaw)
|
||||
* mat_rotation_axis_x<float, MatStoreType::COLUMN_MAJOR>(angles.pitch);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("origin result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_origin(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("scale result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_scale(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("rotation angles result should not be discarded")]]
|
||||
constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
{
|
||||
const auto angles = mat_extract_rotation_zyx(mat);
|
||||
return {
|
||||
@@ -72,8 +72,8 @@ namespace omath::opengl_engine
|
||||
};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
[[nodiscard("perspective projection matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
const float field_of_view, const float aspect_ratio, const float near_plane, const float far_plane,
|
||||
const NDCDepthRange ndc_depth_range = NDCDepthRange::NEGATIVE_ONE_TO_ONE) noexcept
|
||||
{
|
||||
@@ -92,7 +92,7 @@ namespace omath::opengl_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("centimeters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_centimeters(const FloatingType& units)
|
||||
{
|
||||
return units / static_cast<FloatingType>(100);
|
||||
@@ -100,7 +100,7 @@ namespace omath::opengl_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("meters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_meters(const FloatingType& units)
|
||||
{
|
||||
return units;
|
||||
@@ -108,7 +108,7 @@ namespace omath::opengl_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("kilometers value should not be discarded")]]
|
||||
constexpr FloatingType units_to_kilometers(const FloatingType& units)
|
||||
{
|
||||
return units_to_meters(units) / static_cast<FloatingType>(1000);
|
||||
@@ -116,7 +116,7 @@ namespace omath::opengl_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType centimeters_to_units(const FloatingType& centimeters)
|
||||
{
|
||||
return centimeters * static_cast<FloatingType>(100);
|
||||
@@ -124,7 +124,7 @@ namespace omath::opengl_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType meters_to_units(const FloatingType& meters)
|
||||
{
|
||||
return meters;
|
||||
@@ -132,7 +132,7 @@ namespace omath::opengl_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType kilometers_to_units(const FloatingType& kilometers)
|
||||
{
|
||||
return meters_to_units(kilometers * static_cast<FloatingType>(1000));
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace omath::opengl_engine
|
||||
class CameraTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("look-at angle result should not be discarded")]]
|
||||
constexpr static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin,
|
||||
const Vector3<float>& look_at) noexcept
|
||||
{
|
||||
@@ -22,12 +22,12 @@ namespace omath::opengl_engine
|
||||
YawAngle::from_radians(-internal::atan2(direction.x, -direction.z)), RollAngle::from_radians(0.f)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return opengl_engine::calc_view_matrix(angles, cam_origin);
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("projection matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov,
|
||||
const projection::ViewPort& view_port, const float near_plane,
|
||||
const float far_plane,
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace omath::opengl_engine
|
||||
class MeshTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
static Mat4X4 rotation_matrix(const ViewAngles& rotation)
|
||||
{
|
||||
return opengl_engine::rotation_matrix(rotation);
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace omath::opengl_engine
|
||||
class PredEngineTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard("projectile position result should not be discarded")]]
|
||||
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile<float>& projectile,
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
@@ -25,7 +26,7 @@ namespace omath::opengl_engine
|
||||
|
||||
return current_pos;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("target position result should not be discarded")]]
|
||||
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target<float>& target,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
@@ -36,19 +37,19 @@ namespace omath::opengl_engine
|
||||
|
||||
return predicted;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("2d distance result should not be discarded")]]
|
||||
static float calc_vector_2d_distance(const Vector3<float>& delta) noexcept
|
||||
{
|
||||
return std::sqrt(delta.x * delta.x + delta.z * delta.z);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("height coordinate result should not be discarded")]]
|
||||
constexpr static float get_vector_height_coordinate(const Vector3<float>& vec) noexcept
|
||||
{
|
||||
return vec.y;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("viewpoint result should not be discarded")]]
|
||||
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile<float>& projectile,
|
||||
Vector3<float> predicted_target_position,
|
||||
const std::optional<float> projectile_pitch) noexcept
|
||||
@@ -60,13 +61,13 @@ namespace omath::opengl_engine
|
||||
}
|
||||
// Due to specification of maybe_calculate_projectile_launch_pitch_angle, pitch angle must be:
|
||||
// 89 look up, -89 look down
|
||||
[[nodiscard]]
|
||||
[[nodiscard("pitch angle result should not be discarded")]]
|
||||
static float calc_direct_pitch_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
return angles::radians_to_degrees(std::asin(direction.y));
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("yaw angle result should not be discarded")]]
|
||||
static float calc_direct_yaw_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
|
||||
@@ -8,62 +8,62 @@
|
||||
|
||||
namespace omath::rage_engine
|
||||
{
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("forward vector result should not be discarded")]]
|
||||
constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_forward);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("right vector result should not be discarded")]]
|
||||
constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_right);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("up vector result should not be discarded")]]
|
||||
constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_up);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return mat_camera_view<float, MatStoreType::ROW_MAJOR>(forward_vector(angles), right_vector(angles),
|
||||
up_vector(angles), cam_origin);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
{
|
||||
return mat_rotation_axis_z<float, MatStoreType::ROW_MAJOR>(angles.yaw)
|
||||
* mat_rotation_axis_y<float, MatStoreType::ROW_MAJOR>(angles.roll)
|
||||
* mat_rotation_axis_x<float, MatStoreType::ROW_MAJOR>(angles.pitch);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("origin result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_origin(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("scale result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_scale(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("rotation angles result should not be discarded")]]
|
||||
constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
{
|
||||
const auto angles = mat_extract_rotation_zyx(mat);
|
||||
return {
|
||||
@@ -73,8 +73,8 @@ namespace omath::rage_engine
|
||||
};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4
|
||||
[[nodiscard("perspective projection matrix result should not be discarded")]]
|
||||
constexpr Mat4X4
|
||||
calc_perspective_projection_matrix(const float field_of_view, const float aspect_ratio, const float near_plane,
|
||||
const float far_plane,
|
||||
const NDCDepthRange ndc_depth_range = NDCDepthRange::ZERO_TO_ONE) noexcept
|
||||
@@ -92,7 +92,7 @@ namespace omath::rage_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("centimeters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_centimeters(const FloatingType& units)
|
||||
{
|
||||
return units / static_cast<FloatingType>(100);
|
||||
@@ -100,7 +100,7 @@ namespace omath::rage_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("meters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_meters(const FloatingType& units)
|
||||
{
|
||||
return units;
|
||||
@@ -108,7 +108,7 @@ namespace omath::rage_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("kilometers value should not be discarded")]]
|
||||
constexpr FloatingType units_to_kilometers(const FloatingType& units)
|
||||
{
|
||||
return units_to_meters(units) / static_cast<FloatingType>(1000);
|
||||
@@ -116,7 +116,7 @@ namespace omath::rage_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType centimeters_to_units(const FloatingType& centimeters)
|
||||
{
|
||||
return centimeters * static_cast<FloatingType>(100);
|
||||
@@ -124,7 +124,7 @@ namespace omath::rage_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType meters_to_units(const FloatingType& meters)
|
||||
{
|
||||
return meters;
|
||||
@@ -132,7 +132,7 @@ namespace omath::rage_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType kilometers_to_units(const FloatingType& kilometers)
|
||||
{
|
||||
return meters_to_units(kilometers * static_cast<FloatingType>(1000));
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace omath::rage_engine
|
||||
class CameraTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("look-at angle result should not be discarded")]]
|
||||
constexpr static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin,
|
||||
const Vector3<float>& look_at) noexcept
|
||||
{
|
||||
@@ -22,12 +22,12 @@ namespace omath::rage_engine
|
||||
YawAngle::from_radians(-internal::atan2(direction.x, direction.y)), RollAngle::from_radians(0.f)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return rage_engine::calc_view_matrix(angles, cam_origin);
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("projection matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov,
|
||||
const projection::ViewPort& view_port, const float near_plane,
|
||||
const float far_plane,
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace omath::rage_engine
|
||||
class MeshTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
static Mat4X4 rotation_matrix(const ViewAngles& rotation)
|
||||
{
|
||||
return rage_engine::rotation_matrix(rotation);
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace omath::rage_engine
|
||||
class PredEngineTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard("projectile position result should not be discarded")]]
|
||||
constexpr static Vector3<float>
|
||||
predict_projectile_position(const projectile_prediction::Projectile<float>& projectile, const float pitch,
|
||||
const float yaw, const float time, const float gravity) noexcept
|
||||
@@ -26,7 +27,7 @@ namespace omath::rage_engine
|
||||
|
||||
return current_pos;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("target position result should not be discarded")]]
|
||||
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target<float>& target,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
@@ -37,19 +38,19 @@ namespace omath::rage_engine
|
||||
|
||||
return predicted;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("2d distance result should not be discarded")]]
|
||||
static float calc_vector_2d_distance(const Vector3<float>& delta) noexcept
|
||||
{
|
||||
return std::sqrt(delta.x * delta.x + delta.y * delta.y);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("height coordinate result should not be discarded")]]
|
||||
constexpr static float get_vector_height_coordinate(const Vector3<float>& vec) noexcept
|
||||
{
|
||||
return vec.z;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("viewpoint result should not be discarded")]]
|
||||
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile<float>& projectile,
|
||||
Vector3<float> predicted_target_position,
|
||||
const std::optional<float> projectile_pitch) noexcept
|
||||
@@ -59,13 +60,13 @@ namespace omath::rage_engine
|
||||
|
||||
return {predicted_target_position.x, predicted_target_position.y, projectile.m_origin.z + height};
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("pitch angle result should not be discarded")]]
|
||||
static float calc_direct_pitch_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
return angles::radians_to_degrees(std::asin(direction.z));
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("yaw angle result should not be discarded")]]
|
||||
static float calc_direct_yaw_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
|
||||
@@ -6,37 +6,37 @@
|
||||
|
||||
namespace omath::source_engine
|
||||
{
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("forward vector result should not be discarded")]]
|
||||
constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_forward);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
{
|
||||
return mat_rotation_axis_z(angles.yaw) * mat_rotation_axis_y(angles.pitch) * mat_rotation_axis_x(angles.roll);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("origin result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_origin(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("scale result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_scale(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("rotation angles result should not be discarded")]]
|
||||
constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
{
|
||||
const auto angles = mat_extract_rotation_zyx(mat);
|
||||
return {
|
||||
@@ -46,30 +46,30 @@ namespace omath::source_engine
|
||||
};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("right vector result should not be discarded")]]
|
||||
constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_right);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("up vector result should not be discarded")]]
|
||||
constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_up);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return mat_camera_view(forward_vector(angles), right_vector(angles), up_vector(angles), cam_origin);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
[[nodiscard("perspective projection matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
const float field_of_view, const float aspect_ratio, const float near_plane, const float far_plane,
|
||||
const NDCDepthRange ndc_depth_range = NDCDepthRange::NEGATIVE_ONE_TO_ONE) noexcept
|
||||
{
|
||||
@@ -88,7 +88,7 @@ namespace omath::source_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("centimeters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_centimeters(const FloatingType& units)
|
||||
{
|
||||
constexpr auto centimeter_in_unit = static_cast<FloatingType>(2.54);
|
||||
@@ -97,7 +97,7 @@ namespace omath::source_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("meters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_meters(const FloatingType& units)
|
||||
{
|
||||
return units_to_centimeters(units) / static_cast<FloatingType>(100);
|
||||
@@ -105,7 +105,7 @@ namespace omath::source_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("kilometers value should not be discarded")]]
|
||||
constexpr FloatingType units_to_kilometers(const FloatingType& units)
|
||||
{
|
||||
return units_to_meters(units) / static_cast<FloatingType>(1000);
|
||||
@@ -113,7 +113,7 @@ namespace omath::source_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType centimeters_to_units(const FloatingType& centimeters)
|
||||
{
|
||||
constexpr auto centimeter_in_unit = static_cast<FloatingType>(2.54);
|
||||
@@ -122,7 +122,7 @@ namespace omath::source_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType meters_to_units(const FloatingType& meters)
|
||||
{
|
||||
return centimeters_to_units(meters * static_cast<FloatingType>(100));
|
||||
@@ -130,7 +130,7 @@ namespace omath::source_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType kilometers_to_units(const FloatingType& kilometers)
|
||||
{
|
||||
return meters_to_units(kilometers * static_cast<FloatingType>(1000));
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace omath::source_engine
|
||||
class CameraTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("look-at angle result should not be discarded")]]
|
||||
constexpr static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin,
|
||||
const Vector3<float>& look_at) noexcept
|
||||
{
|
||||
@@ -22,12 +22,12 @@ namespace omath::source_engine
|
||||
YawAngle::from_radians(internal::atan2(direction.y, direction.x)), RollAngle::from_radians(0.f)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return source_engine::calc_view_matrix(angles, cam_origin);
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("projection matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov,
|
||||
const projection::ViewPort& view_port, const float near_plane,
|
||||
const float far_plane,
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace omath::source_engine
|
||||
class MeshTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
static Mat4X4 rotation_matrix(const ViewAngles& rotation)
|
||||
{
|
||||
return source_engine::rotation_matrix(rotation);
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace omath::source_engine
|
||||
class PredEngineTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard("projectile position result should not be discarded")]]
|
||||
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile<float>& projectile,
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
@@ -26,7 +27,7 @@ namespace omath::source_engine
|
||||
|
||||
return current_pos;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("target position result should not be discarded")]]
|
||||
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target<float>& target,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
@@ -37,19 +38,19 @@ namespace omath::source_engine
|
||||
|
||||
return predicted;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("2d distance result should not be discarded")]]
|
||||
static float calc_vector_2d_distance(const Vector3<float>& delta) noexcept
|
||||
{
|
||||
return std::sqrt(delta.x * delta.x + delta.y * delta.y);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("height coordinate result should not be discarded")]]
|
||||
constexpr static float get_vector_height_coordinate(const Vector3<float>& vec) noexcept
|
||||
{
|
||||
return vec.z;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("viewpoint result should not be discarded")]]
|
||||
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile<float>& projectile,
|
||||
Vector3<float> predicted_target_position,
|
||||
const std::optional<float> projectile_pitch) noexcept
|
||||
@@ -61,7 +62,7 @@ namespace omath::source_engine
|
||||
}
|
||||
// Due to specification of maybe_calculate_projectile_launch_pitch_angle, pitch angle must be:
|
||||
// 89 look up, -89 look down
|
||||
[[nodiscard]]
|
||||
[[nodiscard("pitch angle result should not be discarded")]]
|
||||
static float calc_direct_pitch_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto distance = origin.distance_to(view_to);
|
||||
@@ -69,7 +70,7 @@ namespace omath::source_engine
|
||||
|
||||
return angles::radians_to_degrees(std::asin(delta.z / distance));
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("yaw angle result should not be discarded")]]
|
||||
static float calc_direct_yaw_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto delta = view_to - origin;
|
||||
|
||||
@@ -7,62 +7,62 @@
|
||||
|
||||
namespace omath::unity_engine
|
||||
{
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("forward vector result should not be discarded")]]
|
||||
constexpr Vector3<float> forward_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_forward);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("right vector result should not be discarded")]]
|
||||
constexpr Vector3<float> right_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_right);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("up vector result should not be discarded")]]
|
||||
constexpr Vector3<float> up_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_up);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return mat_camera_view<float, MatStoreType::ROW_MAJOR>(-forward_vector(angles), right_vector(angles),
|
||||
up_vector(angles), cam_origin);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
{
|
||||
return mat_rotation_axis_z<float, MatStoreType::ROW_MAJOR>(angles.roll)
|
||||
* mat_rotation_axis_y<float, MatStoreType::ROW_MAJOR>(angles.yaw)
|
||||
* mat_rotation_axis_x<float, MatStoreType::ROW_MAJOR>(angles.pitch);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("origin result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_origin(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_origin(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("scale result should not be discarded")]]
|
||||
constexpr Vector3<float> extract_scale(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_scale(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("rotation angles result should not be discarded")]]
|
||||
constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
{
|
||||
const auto angles = mat_extract_rotation_zyx(mat);
|
||||
return {
|
||||
@@ -72,8 +72,8 @@ namespace omath::unity_engine
|
||||
};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
[[nodiscard("perspective projection matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
const float field_of_view, const float aspect_ratio, const float near_plane, const float far_plane,
|
||||
const NDCDepthRange ndc_depth_range = NDCDepthRange::NEGATIVE_ONE_TO_ONE) noexcept
|
||||
{
|
||||
@@ -90,7 +90,7 @@ namespace omath::unity_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("centimeters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_centimeters(const FloatingType& units)
|
||||
{
|
||||
return units / static_cast<FloatingType>(100);
|
||||
@@ -98,7 +98,7 @@ namespace omath::unity_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("meters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_meters(const FloatingType& units)
|
||||
{
|
||||
return units;
|
||||
@@ -106,7 +106,7 @@ namespace omath::unity_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("kilometers value should not be discarded")]]
|
||||
constexpr FloatingType units_to_kilometers(const FloatingType& units)
|
||||
{
|
||||
return units_to_meters(units) / static_cast<FloatingType>(1000);
|
||||
@@ -114,7 +114,7 @@ namespace omath::unity_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType centimeters_to_units(const FloatingType& centimeters)
|
||||
{
|
||||
return centimeters * static_cast<FloatingType>(100);
|
||||
@@ -122,7 +122,7 @@ namespace omath::unity_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType meters_to_units(const FloatingType& meters)
|
||||
{
|
||||
return meters;
|
||||
@@ -130,7 +130,7 @@ namespace omath::unity_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType kilometers_to_units(const FloatingType& kilometers)
|
||||
{
|
||||
return meters_to_units(kilometers * static_cast<FloatingType>(1000));
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace omath::unity_engine
|
||||
class CameraTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("look-at angle result should not be discarded")]]
|
||||
constexpr static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin,
|
||||
const Vector3<float>& look_at) noexcept
|
||||
{
|
||||
@@ -22,12 +22,12 @@ namespace omath::unity_engine
|
||||
YawAngle::from_radians(internal::atan2(direction.x, direction.z)), RollAngle::from_radians(0.f)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||
{
|
||||
return unity_engine::calc_view_matrix(angles, cam_origin);
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("projection matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov,
|
||||
const projection::ViewPort& view_port, const float near_plane,
|
||||
const float far_plane,
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace omath::unity_engine
|
||||
class MeshTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
static Mat4X4 rotation_matrix(const ViewAngles& rotation)
|
||||
{
|
||||
return unity_engine::rotation_matrix(rotation);
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace omath::unity_engine
|
||||
class PredEngineTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard("projectile position result should not be discarded")]]
|
||||
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile<float>& projectile,
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
@@ -25,7 +26,7 @@ namespace omath::unity_engine
|
||||
|
||||
return current_pos;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("target position result should not be discarded")]]
|
||||
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target<float>& target,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
@@ -36,19 +37,19 @@ namespace omath::unity_engine
|
||||
|
||||
return predicted;
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("2d distance result should not be discarded")]]
|
||||
static float calc_vector_2d_distance(const Vector3<float>& delta) noexcept
|
||||
{
|
||||
return std::sqrt(delta.x * delta.x + delta.z * delta.z);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("height coordinate result should not be discarded")]]
|
||||
constexpr static float get_vector_height_coordinate(const Vector3<float>& vec) noexcept
|
||||
{
|
||||
return vec.y;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("viewpoint result should not be discarded")]]
|
||||
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile<float>& projectile,
|
||||
Vector3<float> predicted_target_position,
|
||||
const std::optional<float> projectile_pitch) noexcept
|
||||
@@ -60,13 +61,13 @@ namespace omath::unity_engine
|
||||
}
|
||||
// Due to specification of maybe_calculate_projectile_launch_pitch_angle, pitch angle must be:
|
||||
// 89 look up, -89 look down
|
||||
[[nodiscard]]
|
||||
[[nodiscard("pitch angle result should not be discarded")]]
|
||||
static float calc_direct_pitch_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
return angles::radians_to_degrees(std::asin(direction.y));
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("yaw angle result should not be discarded")]]
|
||||
static float calc_direct_yaw_angle(const Vector3<float>& origin, const Vector3<float>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
|
||||
@@ -7,62 +7,62 @@
|
||||
|
||||
namespace omath::unreal_engine
|
||||
{
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept;
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<double> forward_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("forward vector result should not be discarded")]]
|
||||
constexpr Vector3<double> forward_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_forward);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<double> right_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("right vector result should not be discarded")]]
|
||||
constexpr Vector3<double> right_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_right);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<double> up_vector(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("up vector result should not be discarded")]]
|
||||
constexpr Vector3<double> up_vector(const ViewAngles& angles) noexcept
|
||||
{
|
||||
const auto vec = rotation_matrix(angles) * mat_column_from_vector(k_abs_up);
|
||||
|
||||
return {vec.at(0, 0), vec.at(1, 0), vec.at(2, 0)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<double>& cam_origin) noexcept
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<double>& cam_origin) noexcept
|
||||
{
|
||||
return mat_camera_view<double, MatStoreType::ROW_MAJOR>(forward_vector(angles), right_vector(angles),
|
||||
up_vector(angles), cam_origin);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||
{
|
||||
return mat_rotation_axis_z<double, MatStoreType::ROW_MAJOR>(angles.yaw)
|
||||
* mat_rotation_axis_y<double, MatStoreType::ROW_MAJOR>(-angles.pitch)
|
||||
* mat_rotation_axis_x<double, MatStoreType::ROW_MAJOR>(-angles.roll);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<double> extract_origin(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("origin result should not be discarded")]]
|
||||
constexpr Vector3<double> extract_origin(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_origin(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Vector3<double> extract_scale(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("scale result should not be discarded")]]
|
||||
constexpr Vector3<double> extract_scale(const Mat4X4& mat) noexcept
|
||||
{
|
||||
return mat_extract_scale(mat);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
[[nodiscard("rotation angles result should not be discarded")]]
|
||||
constexpr ViewAngles extract_rotation_angles(const Mat4X4& mat) noexcept
|
||||
{
|
||||
const auto angles = mat_extract_rotation_zyx(mat);
|
||||
return {
|
||||
@@ -72,8 +72,8 @@ namespace omath::unreal_engine
|
||||
};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
[[nodiscard("perspective projection matrix result should not be discarded")]]
|
||||
constexpr Mat4X4 calc_perspective_projection_matrix(
|
||||
const double field_of_view, const double aspect_ratio, const double near_plane, const double far_plane,
|
||||
const NDCDepthRange ndc_depth_range = NDCDepthRange::NEGATIVE_ONE_TO_ONE) noexcept
|
||||
{
|
||||
@@ -90,7 +90,7 @@ namespace omath::unreal_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("centimeters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_centimeters(const FloatingType& units)
|
||||
{
|
||||
return units;
|
||||
@@ -98,7 +98,7 @@ namespace omath::unreal_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("meters value should not be discarded")]]
|
||||
constexpr FloatingType units_to_meters(const FloatingType& units)
|
||||
{
|
||||
return units / static_cast<FloatingType>(100);
|
||||
@@ -106,7 +106,7 @@ namespace omath::unreal_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("kilometers value should not be discarded")]]
|
||||
constexpr FloatingType units_to_kilometers(const FloatingType& units)
|
||||
{
|
||||
return units_to_meters(units) / static_cast<FloatingType>(1000);
|
||||
@@ -114,7 +114,7 @@ namespace omath::unreal_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType centimeters_to_units(const FloatingType& centimeters)
|
||||
{
|
||||
return centimeters;
|
||||
@@ -122,7 +122,7 @@ namespace omath::unreal_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType meters_to_units(const FloatingType& meters)
|
||||
{
|
||||
return meters * static_cast<FloatingType>(100);
|
||||
@@ -130,7 +130,7 @@ namespace omath::unreal_engine
|
||||
|
||||
template<class FloatingType>
|
||||
requires std::is_floating_point_v<FloatingType>
|
||||
[[nodiscard]]
|
||||
[[nodiscard("units value should not be discarded")]]
|
||||
constexpr FloatingType kilometers_to_units(const FloatingType& kilometers)
|
||||
{
|
||||
return meters_to_units(kilometers * static_cast<FloatingType>(1000));
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace omath::unreal_engine
|
||||
class CameraTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("look-at angle result should not be discarded")]]
|
||||
constexpr static ViewAngles calc_look_at_angle(const Vector3<double>& cam_origin,
|
||||
const Vector3<double>& look_at) noexcept
|
||||
{
|
||||
@@ -22,12 +22,12 @@ namespace omath::unreal_engine
|
||||
YawAngle::from_radians(internal::atan2(direction.y, direction.x)), RollAngle::from_radians(0.f)};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("view matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<double>& cam_origin) noexcept
|
||||
{
|
||||
return unreal_engine::calc_view_matrix(angles, cam_origin);
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("projection matrix result should not be discarded")]]
|
||||
constexpr static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov,
|
||||
const projection::ViewPort& view_port, const double near_plane,
|
||||
const double far_plane,
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace omath::unreal_engine
|
||||
class MeshTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("rotation matrix result should not be discarded")]]
|
||||
static Mat4X4 rotation_matrix(const ViewAngles& rotation)
|
||||
{
|
||||
return unreal_engine::rotation_matrix(rotation);
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace omath::unreal_engine
|
||||
class PredEngineTrait final
|
||||
{
|
||||
public:
|
||||
[[nodiscard("projectile position result should not be discarded")]]
|
||||
static Vector3<double> predict_projectile_position(const projectile_prediction::Projectile<double>& projectile,
|
||||
const double pitch, const double yaw,
|
||||
const double time, const double gravity) noexcept
|
||||
@@ -27,7 +28,7 @@ namespace omath::unreal_engine
|
||||
return current_pos;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("target position result should not be discarded")]]
|
||||
static Vector3<double> predict_target_position(const projectile_prediction::Target<double>& target,
|
||||
const double time, const double gravity) noexcept
|
||||
{
|
||||
@@ -39,19 +40,19 @@ namespace omath::unreal_engine
|
||||
return predicted;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("2d distance result should not be discarded")]]
|
||||
static double calc_vector_2d_distance(const Vector3<double>& delta) noexcept
|
||||
{
|
||||
return std::sqrt(delta.x * delta.x + delta.z * delta.z);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("height coordinate result should not be discarded")]]
|
||||
static double get_vector_height_coordinate(const Vector3<double>& vec) noexcept
|
||||
{
|
||||
return vec.y;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("viewpoint result should not be discarded")]]
|
||||
static Vector3<double> calc_viewpoint_from_angles(const projectile_prediction::Projectile<double>& projectile,
|
||||
Vector3<double> predicted_target_position,
|
||||
const std::optional<double> projectile_pitch) noexcept
|
||||
@@ -64,7 +65,7 @@ namespace omath::unreal_engine
|
||||
|
||||
// Due to specification of maybe_calculate_projectile_launch_pitch_angle, pitch angle must be:
|
||||
// 89 look up, -89 look down
|
||||
[[nodiscard]]
|
||||
[[nodiscard("pitch angle result should not be discarded")]]
|
||||
static double calc_direct_pitch_angle(const Vector3<double>& origin, const Vector3<double>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
@@ -72,7 +73,7 @@ namespace omath::unreal_engine
|
||||
return angles::radians_to_degrees(std::asin(direction.z));
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("yaw angle result should not be discarded")]]
|
||||
static double calc_direct_yaw_angle(const Vector3<double>& origin, const Vector3<double>& view_to) noexcept
|
||||
{
|
||||
const auto direction = (view_to - origin).normalized();
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace omath::hud
|
||||
public:
|
||||
CanvasBox(Vector2<float> top, Vector2<float> bottom, float ratio = 4.f);
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("You have to use array")]]
|
||||
std::array<Vector2<float>, 4> as_array() const;
|
||||
|
||||
Vector2<float> top_left_corner;
|
||||
|
||||
@@ -873,7 +873,7 @@ namespace omath
|
||||
} // namespace omath
|
||||
|
||||
template<size_t Rows, size_t Columns, class Type, omath::MatStoreType StoreType>
|
||||
struct std::formatter<omath::Mat<Rows, Columns, Type, StoreType>> // NOLINT(*-dcl58-cpp)
|
||||
struct std::formatter<omath::Mat<Rows, Columns, Type, StoreType>> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
using MatType = omath::Mat<Rows, Columns, Type, StoreType>;
|
||||
[[nodiscard("You must use parse iterator")]]
|
||||
|
||||
@@ -265,13 +265,14 @@ namespace omath
|
||||
};
|
||||
} // namespace omath
|
||||
|
||||
template<> struct std::hash<omath::Vector2<float>>
|
||||
template<class Type>
|
||||
struct std::hash<omath::Vector2<Type>> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
[[nodiscard("You must use hash value")]]
|
||||
std::size_t operator()(const omath::Vector2<float>& vec) const noexcept
|
||||
std::size_t operator()(const omath::Vector2<Type>& vec) const noexcept
|
||||
{
|
||||
std::size_t hash = 0;
|
||||
constexpr std::hash<float> hasher;
|
||||
constexpr std::hash<Type> hasher;
|
||||
|
||||
hash ^= hasher(vec.x) + 0x9e3779b9 + (hash << 6) + (hash >> 2);
|
||||
hash ^= hasher(vec.y) + 0x9e3779b9 + (hash << 6) + (hash >> 2);
|
||||
@@ -281,10 +282,10 @@ template<> struct std::hash<omath::Vector2<float>>
|
||||
};
|
||||
|
||||
template<class Type>
|
||||
struct std::formatter<omath::Vector2<Type>> // NOLINT(*-dcl58-cpp)
|
||||
struct std::formatter<omath::Vector2<Type>> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
[[nodiscard("You must use parse iterator")]]
|
||||
static constexpr auto parse(std::format_parse_context& ctx)
|
||||
static constexpr auto parse(std::format_parse_context& ctx) noexcept
|
||||
{
|
||||
return ctx.begin();
|
||||
}
|
||||
|
||||
@@ -318,14 +318,15 @@ namespace omath
|
||||
};
|
||||
} // namespace omath
|
||||
|
||||
template<> struct std::hash<omath::Vector3<float>>
|
||||
template<class Type>
|
||||
struct std::hash<omath::Vector3<Type>> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
// NOTE: Cannot be constexpr because of MSVC
|
||||
[[nodiscard("You must use hash value")]]
|
||||
std::size_t operator()(const omath::Vector3<float>& vec) const noexcept
|
||||
std::size_t operator()(const omath::Vector3<Type>& vec) const noexcept
|
||||
{
|
||||
std::size_t hash = 0;
|
||||
constexpr std::hash<float> hasher;
|
||||
constexpr std::hash<Type> hasher;
|
||||
|
||||
hash ^= hasher(vec.x) + 0x9e3779b9 + (hash << 6) + (hash >> 2);
|
||||
hash ^= hasher(vec.y) + 0x9e3779b9 + (hash << 6) + (hash >> 2);
|
||||
@@ -336,10 +337,10 @@ template<> struct std::hash<omath::Vector3<float>>
|
||||
};
|
||||
|
||||
template<class Type>
|
||||
struct std::formatter<omath::Vector3<Type>> // NOLINT(*-dcl58-cpp)
|
||||
struct std::formatter<omath::Vector3<Type>> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
[[nodiscard("You must use parse iterator")]]
|
||||
static constexpr auto parse(std::format_parse_context& ctx)
|
||||
static constexpr auto parse(std::format_parse_context& ctx) noexcept
|
||||
{
|
||||
return ctx.begin();
|
||||
}
|
||||
|
||||
@@ -225,13 +225,14 @@ namespace omath
|
||||
};
|
||||
} // namespace omath
|
||||
|
||||
template<> struct std::hash<omath::Vector4<float>>
|
||||
template<class Type>
|
||||
struct std::hash<omath::Vector4<Type>> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
[[nodiscard("You must use hash value")]]
|
||||
std::size_t operator()(const omath::Vector4<float>& vec) const noexcept
|
||||
std::size_t operator()(const omath::Vector4<Type>& vec) const noexcept
|
||||
{
|
||||
std::size_t hash = 0;
|
||||
constexpr std::hash<float> hasher;
|
||||
constexpr std::hash<Type> hasher;
|
||||
|
||||
hash ^= hasher(vec.x) + 0x9e3779b9 + (hash << 6) + (hash >> 2);
|
||||
hash ^= hasher(vec.y) + 0x9e3779b9 + (hash << 6) + (hash >> 2);
|
||||
@@ -240,12 +241,11 @@ template<> struct std::hash<omath::Vector4<float>>
|
||||
return hash;
|
||||
}
|
||||
};
|
||||
|
||||
template<class Type>
|
||||
struct std::formatter<omath::Vector4<Type>> // NOLINT(*-dcl58-cpp)
|
||||
struct std::formatter<omath::Vector4<Type>> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
[[nodiscard("You must use parse iterator")]]
|
||||
static constexpr auto parse(std::format_parse_context& ctx)
|
||||
static constexpr auto parse(std::format_parse_context& ctx) noexcept
|
||||
{
|
||||
return ctx.begin();
|
||||
}
|
||||
|
||||
@@ -13,12 +13,12 @@ namespace omath::pathfinding
|
||||
class Astar final
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("You forgot to use returned path")]]
|
||||
static std::vector<Vector3<float>> find_path(const Vector3<float>& start, const Vector3<float>& end,
|
||||
const NavigationMesh& nav_mesh) noexcept;
|
||||
|
||||
private:
|
||||
[[nodiscard]]
|
||||
[[nodiscard("You forgot to use reconstructed path")]]
|
||||
static std::vector<Vector3<float>>
|
||||
reconstruct_final_path(const std::unordered_map<Vector3<float>, PathNode>& closed_list,
|
||||
const Vector3<float>& current) noexcept;
|
||||
|
||||
@@ -238,7 +238,8 @@ namespace omath::projection
|
||||
return m_view_projection_matrix.value();
|
||||
}
|
||||
|
||||
[[nodiscard("You must use view matrix")]] constexpr const Mat4X4Type& get_view_matrix() const noexcept
|
||||
[[nodiscard("You must use view matrix")]]
|
||||
constexpr const Mat4X4Type& get_view_matrix() const noexcept
|
||||
{
|
||||
if (!m_view_matrix.has_value())
|
||||
m_view_matrix = calc_view_matrix();
|
||||
@@ -295,27 +296,32 @@ namespace omath::projection
|
||||
m_projection_matrix = std::nullopt;
|
||||
}
|
||||
|
||||
[[nodiscard("You must use field of view")]] constexpr const FieldOfView& get_field_of_view() const noexcept
|
||||
[[nodiscard("You must use field of view")]]
|
||||
constexpr const FieldOfView& get_field_of_view() const noexcept
|
||||
{
|
||||
return m_field_of_view;
|
||||
}
|
||||
|
||||
[[nodiscard("You must use near plane")]] constexpr const NumericType& get_near_plane() const noexcept
|
||||
[[nodiscard("You must use near plane")]]
|
||||
constexpr const NumericType& get_near_plane() const noexcept
|
||||
{
|
||||
return m_near_plane_distance;
|
||||
}
|
||||
|
||||
[[nodiscard("You must use far plane")]] constexpr const NumericType& get_far_plane() const noexcept
|
||||
[[nodiscard("You must use far plane")]]
|
||||
constexpr const NumericType& get_far_plane() const noexcept
|
||||
{
|
||||
return m_far_plane_distance;
|
||||
}
|
||||
|
||||
[[nodiscard("You must use view angles")]] constexpr const ViewAnglesType& get_view_angles() const noexcept
|
||||
[[nodiscard("You must use view angles")]]
|
||||
constexpr const ViewAnglesType& get_view_angles() const noexcept
|
||||
{
|
||||
return m_view_angles;
|
||||
}
|
||||
|
||||
[[nodiscard("You must use origin")]] constexpr const Vector3<NumericType>& get_origin() const noexcept
|
||||
[[nodiscard("You must use origin")]]
|
||||
constexpr const Vector3<NumericType>& get_origin() const noexcept
|
||||
{
|
||||
return m_origin;
|
||||
}
|
||||
@@ -460,6 +466,23 @@ namespace omath::projection
|
||||
return false;
|
||||
}
|
||||
|
||||
[[nodiscard("You must view camera space coordinates")]]
|
||||
constexpr Vector3<NumericType> world_to_view_coordinates(const Vector3<NumericType>& world_coordinates) const noexcept
|
||||
{
|
||||
if consteval
|
||||
{
|
||||
const auto view_coordinates =
|
||||
calc_view_matrix()
|
||||
* mat_column_from_vector<NumericType, Mat4X4Type::get_store_ordering()>(world_coordinates);
|
||||
|
||||
return {view_coordinates.at(0, 0), view_coordinates.at(1, 0), view_coordinates.at(2, 0)};
|
||||
}
|
||||
const auto view_coordinates =
|
||||
get_view_matrix()
|
||||
* mat_column_from_vector<NumericType, Mat4X4Type::get_store_ordering()>(world_coordinates);
|
||||
|
||||
return {view_coordinates.at(0, 0), view_coordinates.at(1, 0), view_coordinates.at(2, 0)};
|
||||
}
|
||||
[[nodiscard("You must use view port position")]] constexpr std::expected<Vector3<NumericType>, Error>
|
||||
world_to_view_port(const Vector3<NumericType>& world_position,
|
||||
const ViewPortClipping& clipping = ViewPortClipping::AUTO) const noexcept
|
||||
|
||||
@@ -21,36 +21,20 @@
|
||||
|
||||
namespace omath::rev_eng
|
||||
{
|
||||
template<std::size_t N>
|
||||
struct FixedString final
|
||||
{
|
||||
char data[N]{};
|
||||
// ReSharper disable once CppNonExplicitConvertingConstructor
|
||||
constexpr FixedString(const char (&str)[N]) noexcept // NOLINT(*-explicit-constructor)
|
||||
{
|
||||
for (std::size_t i = 0; i < N; ++i)
|
||||
data[i] = str[i];
|
||||
}
|
||||
// ReSharper disable once CppNonExplicitConversionOperator
|
||||
constexpr operator std::string_view() const noexcept // NOLINT(*-explicit-constructor)
|
||||
{
|
||||
return {data, N - 1};
|
||||
}
|
||||
};
|
||||
template<std::size_t N>
|
||||
FixedString(const char (&)[N]) -> FixedString<N>;
|
||||
|
||||
class InternalReverseEngineeredObject
|
||||
{
|
||||
protected:
|
||||
template<class Type>
|
||||
[[nodiscard]] Type& get_by_offset(const std::ptrdiff_t offset)
|
||||
[[nodiscard("You must use value")]]
|
||||
Type& get_by_offset(const std::ptrdiff_t offset) noexcept
|
||||
{
|
||||
return *reinterpret_cast<Type*>(reinterpret_cast<std::uintptr_t>(this) + offset);
|
||||
}
|
||||
|
||||
template<class Type>
|
||||
[[nodiscard]] const Type& get_by_offset(const std::ptrdiff_t offset) const
|
||||
[[nodiscard("You must use value")]]
|
||||
const Type& get_by_offset(const std::ptrdiff_t offset) const noexcept
|
||||
{
|
||||
return *reinterpret_cast<Type*>(reinterpret_cast<std::uintptr_t>(this) + offset);
|
||||
}
|
||||
@@ -76,14 +60,16 @@ namespace omath::rev_eng
|
||||
return reinterpret_cast<MethodType>(const_cast<void*>(ptr))(this, arg_list...);
|
||||
}
|
||||
|
||||
template<FixedString ModuleName, FixedString Pattern, class ReturnType>
|
||||
template<PatternScanner::ConstevalPattern ModuleName, PatternScanner::ConstevalPattern Pattern,
|
||||
class ReturnType>
|
||||
ReturnType call_method(auto... arg_list)
|
||||
{
|
||||
static const auto* address = resolve_pattern(ModuleName, Pattern);
|
||||
return call_method<ReturnType>(address, arg_list...);
|
||||
}
|
||||
|
||||
template<FixedString ModuleName, FixedString Pattern, class ReturnType>
|
||||
template<PatternScanner::ConstevalPattern ModuleName, PatternScanner::ConstevalPattern Pattern,
|
||||
class ReturnType>
|
||||
ReturnType call_method(auto... arg_list) const
|
||||
{
|
||||
static const auto* address = resolve_pattern(ModuleName, Pattern);
|
||||
@@ -98,7 +84,8 @@ namespace omath::rev_eng
|
||||
}
|
||||
|
||||
template<class ReturnType>
|
||||
ReturnType call_method(const std::string_view& module_name,const std::string_view& pattern, auto... arg_list) const
|
||||
ReturnType call_method(const std::string_view& module_name, const std::string_view& pattern,
|
||||
auto... arg_list) const
|
||||
{
|
||||
static const auto* address = resolve_pattern(module_name, pattern);
|
||||
return call_method<ReturnType>(address, arg_list...);
|
||||
@@ -119,8 +106,7 @@ namespace omath::rev_eng
|
||||
template<std::ptrdiff_t TableOffset, std::size_t Id, class ReturnType>
|
||||
ReturnType call_virtual_method(auto... arg_list)
|
||||
{
|
||||
auto sub_this = reinterpret_cast<void*>(
|
||||
reinterpret_cast<std::uintptr_t>(this) + TableOffset);
|
||||
auto sub_this = reinterpret_cast<void*>(reinterpret_cast<std::uintptr_t>(this) + TableOffset);
|
||||
const auto vtable = *reinterpret_cast<void***>(sub_this);
|
||||
#ifdef _MSC_VER
|
||||
using Fn = ReturnType(__thiscall*)(void*, decltype(arg_list)...);
|
||||
@@ -132,8 +118,7 @@ namespace omath::rev_eng
|
||||
template<std::ptrdiff_t TableOffset, std::size_t Id, class ReturnType>
|
||||
ReturnType call_virtual_method(auto... arg_list) const
|
||||
{
|
||||
auto sub_this = reinterpret_cast<const void*>(
|
||||
reinterpret_cast<std::uintptr_t>(this) + TableOffset);
|
||||
auto sub_this = reinterpret_cast<const void*>(reinterpret_cast<std::uintptr_t>(this) + TableOffset);
|
||||
const auto vtable = *reinterpret_cast<void* const* const*>(sub_this);
|
||||
#ifdef _MSC_VER
|
||||
using Fn = ReturnType(__thiscall*)(const void*, decltype(arg_list)...);
|
||||
@@ -161,8 +146,8 @@ namespace omath::rev_eng
|
||||
return reinterpret_cast<const void*>(*result);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
static const void* get_module_base(const std::string_view module_name)
|
||||
[[nodiscard("You forgot to use module base address")]]
|
||||
static const void* get_module_base(const std::string_view module_name) noexcept
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return GetModuleHandleA(module_name.data());
|
||||
|
||||
@@ -154,10 +154,11 @@ namespace omath
|
||||
} // namespace omath
|
||||
|
||||
template<class T, T MinV, T MaxV, omath::AngleFlags F>
|
||||
struct std::formatter<omath::Angle<T, MinV, MaxV, F>, char> // NOLINT(*-dcl58-cpp)
|
||||
struct std::formatter<omath::Angle<T, MinV, MaxV, F>, char> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
using AngleT = omath::Angle<T, MinV, MaxV, F>;
|
||||
|
||||
[[nodiscard]]
|
||||
static constexpr auto parse(std::format_parse_context& ctx)
|
||||
{
|
||||
return ctx.begin();
|
||||
@@ -174,10 +175,11 @@ struct std::formatter<omath::Angle<T, MinV, MaxV, F>, char> // NOLINT(*-dcl58-cp
|
||||
|
||||
// wchar_t formatter
|
||||
template<class T, T MinV, T MaxV, omath::AngleFlags F>
|
||||
struct std::formatter<omath::Angle<T, MinV, MaxV, F>, wchar_t> // NOLINT(*-dcl58-cpp)
|
||||
struct std::formatter<omath::Angle<T, MinV, MaxV, F>, wchar_t> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
using AngleT = omath::Angle<T, MinV, MaxV, F>;
|
||||
|
||||
[[nodiscard]]
|
||||
static constexpr auto parse(std::wformat_parse_context& ctx)
|
||||
{
|
||||
return ctx.begin();
|
||||
@@ -194,10 +196,11 @@ struct std::formatter<omath::Angle<T, MinV, MaxV, F>, wchar_t> // NOLINT(*-dcl58
|
||||
|
||||
// wchar_t formatter
|
||||
template<class T, T MinV, T MaxV, omath::AngleFlags F>
|
||||
struct std::formatter<omath::Angle<T, MinV, MaxV, F>, char8_t> // NOLINT(*-dcl58-cpp)
|
||||
struct std::formatter<omath::Angle<T, MinV, MaxV, F>, char8_t> final // NOLINT(*-dcl58-cpp)
|
||||
{
|
||||
using AngleT = omath::Angle<T, MinV, MaxV, F>;
|
||||
|
||||
[[nodiscard]]
|
||||
static constexpr auto parse(std::wformat_parse_context& ctx)
|
||||
{
|
||||
return ctx.begin();
|
||||
|
||||
@@ -34,13 +34,13 @@ namespace omath
|
||||
m_value.clamp(0.f, 1.f);
|
||||
}
|
||||
constexpr explicit Color() noexcept = default;
|
||||
[[nodiscard]]
|
||||
[[nodiscard("color result should not be discarded")]]
|
||||
constexpr static Color from_rgba(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t a) noexcept
|
||||
{
|
||||
return Color(Vector4<float>(r, g, b, a) / 255.f);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("color result should not be discarded")]]
|
||||
constexpr static Color from_hsv(float hue, const float saturation, const float value) noexcept
|
||||
{
|
||||
float r{}, g{}, b{};
|
||||
@@ -80,13 +80,13 @@ namespace omath
|
||||
return {r, g, b, 1.f};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("color result should not be discarded")]]
|
||||
constexpr static Color from_hsv(const Hsv& hsv) noexcept
|
||||
{
|
||||
return from_hsv(hsv.hue, hsv.saturation, hsv.value);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
[[nodiscard("hsv result should not be discarded")]]
|
||||
constexpr Hsv to_hsv() const noexcept
|
||||
{
|
||||
Hsv hsv_data;
|
||||
@@ -141,33 +141,33 @@ namespace omath
|
||||
|
||||
*this = from_hsv(hsv);
|
||||
}
|
||||
[[nodiscard]]
|
||||
[[nodiscard("blended color result should not be discarded")]]
|
||||
constexpr Color blend(const Color& other, float ratio) const noexcept
|
||||
{
|
||||
ratio = std::clamp(ratio, 0.f, 1.f);
|
||||
return Color(this->m_value * (1.f - ratio) + other.m_value * ratio);
|
||||
}
|
||||
|
||||
[[nodiscard]] static constexpr Color red()
|
||||
[[nodiscard("color result should not be discarded")]] static constexpr Color red()
|
||||
{
|
||||
return {1.f, 0.f, 0.f, 1.f};
|
||||
}
|
||||
[[nodiscard]] static constexpr Color green()
|
||||
[[nodiscard("color result should not be discarded")]] static constexpr Color green()
|
||||
{
|
||||
return {0.f, 1.f, 0.f, 1.f};
|
||||
}
|
||||
[[nodiscard]] static constexpr Color blue()
|
||||
[[nodiscard("color result should not be discarded")]] static constexpr Color blue()
|
||||
{
|
||||
return {0.f, 0.f, 1.f, 1.f};
|
||||
}
|
||||
#ifdef OMATH_IMGUI_INTEGRATION
|
||||
[[nodiscard]]
|
||||
[[nodiscard("ImColor result should not be discarded")]]
|
||||
ImColor to_im_color() const noexcept
|
||||
{
|
||||
return {m_value.to_im_vec4()};
|
||||
}
|
||||
#endif
|
||||
[[nodiscard]] std::string to_string() const noexcept
|
||||
[[nodiscard("string result should not be discarded")]] std::string to_string() const noexcept
|
||||
{
|
||||
return std::format("[r:{}, g:{}, b:{}, a:{}]",
|
||||
static_cast<int>(m_value.x * 255.f),
|
||||
@@ -175,24 +175,24 @@ namespace omath
|
||||
static_cast<int>(m_value.z * 255.f),
|
||||
static_cast<int>(m_value.w * 255.f));
|
||||
}
|
||||
[[nodiscard]] std::string to_rgbf_string() const noexcept
|
||||
[[nodiscard("string result should not be discarded")]] std::string to_rgbf_string() const noexcept
|
||||
{
|
||||
return std::format("[r:{}, g:{}, b:{}, a:{}]",
|
||||
m_value.x, m_value.y, m_value.z, m_value.w);
|
||||
}
|
||||
[[nodiscard]] std::string to_hsv_string() const noexcept
|
||||
[[nodiscard("string result should not be discarded")]] std::string to_hsv_string() const noexcept
|
||||
{
|
||||
const auto [hue, saturation, value] = to_hsv();
|
||||
return std::format("[h:{}, s:{}, v:{}]", hue, saturation, value);
|
||||
}
|
||||
[[nodiscard]] std::wstring to_wstring() const noexcept
|
||||
[[nodiscard("wide string result should not be discarded")]] std::wstring to_wstring() const noexcept
|
||||
{
|
||||
const auto ascii_string = to_string();
|
||||
return {ascii_string.cbegin(), ascii_string.cend()};
|
||||
}
|
||||
|
||||
// ReSharper disable once CppInconsistentNaming
|
||||
[[nodiscard]] std::u8string to_u8string() const noexcept
|
||||
[[nodiscard("UTF-8 string result should not be discarded")]] std::u8string to_u8string() const noexcept
|
||||
{
|
||||
const auto ascii_string = to_string();
|
||||
return {ascii_string.cbegin(), ascii_string.cend()};
|
||||
|
||||
@@ -38,17 +38,24 @@ namespace omath
|
||||
friend unit_test_pattern_scan_consteval_spacing_and_case_Test;
|
||||
|
||||
public:
|
||||
template<std::size_t N>
|
||||
template<std::size_t Length>
|
||||
struct ConstevalPattern final
|
||||
{
|
||||
char value[N]{};
|
||||
char value[Length]{};
|
||||
|
||||
// ReSharper disable once CppNonExplicitConvertingConstructor
|
||||
constexpr ConstevalPattern(const char (&text)[N]) // NOLINT(*-explicit-constructor)
|
||||
constexpr ConstevalPattern(const char (&text)[Length]) // NOLINT(*-explicit-constructor)
|
||||
{
|
||||
std::ranges::copy(text, value);
|
||||
}
|
||||
[[nodiscard("You forgot to use string")]]
|
||||
constexpr operator std::string_view() const noexcept // NOLINT(*-explicit-constructor)
|
||||
{
|
||||
return {value, Length - 1};
|
||||
}
|
||||
};
|
||||
template<std::size_t N>
|
||||
ConstevalPattern(const char (&)[N]) -> ConstevalPattern<N>;
|
||||
|
||||
[[nodiscard]]
|
||||
static std::span<std::byte>::iterator scan_for_pattern(const std::span<std::byte>& range,
|
||||
|
||||
@@ -580,6 +580,48 @@ TEST(UnitTestProjection, AabbUnityEngineStraddlesNearNotCulled)
|
||||
EXPECT_FALSE(cam.is_aabb_culled_by_frustum(aabb));
|
||||
}
|
||||
|
||||
TEST(UnitTestProjection, WorldToViewCoordinates_TranslatedSourceCamera)
|
||||
{
|
||||
constexpr float k_eps = 1e-4f;
|
||||
constexpr auto fov = omath::projection::FieldOfView::from_degrees(90.f);
|
||||
auto cam = omath::source_engine::Camera({10.f, 20.f, 30.f}, {}, {1920.f, 1080.f}, fov, 0.01f, 1000.f);
|
||||
|
||||
const auto view_coordinates = cam.world_to_view_coordinates({15.f, 12.f, 37.f});
|
||||
|
||||
EXPECT_NEAR(view_coordinates.x, 8.f, k_eps);
|
||||
EXPECT_NEAR(view_coordinates.y, 7.f, k_eps);
|
||||
EXPECT_NEAR(view_coordinates.z, 5.f, k_eps);
|
||||
}
|
||||
|
||||
TEST(UnitTestProjection, WorldToViewCoordinates_RotatedSourceCamera)
|
||||
{
|
||||
constexpr float k_eps = 1e-4f;
|
||||
constexpr auto fov = omath::projection::FieldOfView::from_degrees(90.f);
|
||||
const omath::source_engine::ViewAngles angles{omath::source_engine::PitchAngle::from_degrees(0.f),
|
||||
omath::source_engine::YawAngle::from_degrees(90.f),
|
||||
omath::source_engine::RollAngle::from_degrees(0.f)};
|
||||
auto cam = omath::source_engine::Camera({10.f, 20.f, 30.f}, angles, {1920.f, 1080.f}, fov, 0.01f, 1000.f);
|
||||
|
||||
const auto view_coordinates = cam.world_to_view_coordinates({14.f, 26.f, 38.f});
|
||||
|
||||
EXPECT_NEAR(view_coordinates.x, 4.f, k_eps);
|
||||
EXPECT_NEAR(view_coordinates.y, 8.f, k_eps);
|
||||
EXPECT_NEAR(view_coordinates.z, 6.f, k_eps);
|
||||
}
|
||||
|
||||
TEST(UnitTestProjection, WorldToViewCoordinates_ColumnMajorOpenGlCamera)
|
||||
{
|
||||
constexpr float k_eps = 1e-4f;
|
||||
constexpr auto fov = omath::projection::FieldOfView::from_degrees(90.f);
|
||||
auto cam = omath::opengl_engine::Camera({10.f, 20.f, 30.f}, {}, {1920.f, 1080.f}, fov, 0.01f, 1000.f);
|
||||
|
||||
const auto view_coordinates = cam.world_to_view_coordinates({14.f, 26.f, 22.f});
|
||||
|
||||
EXPECT_NEAR(view_coordinates.x, 4.f, k_eps);
|
||||
EXPECT_NEAR(view_coordinates.y, 6.f, k_eps);
|
||||
EXPECT_NEAR(view_coordinates.z, -8.f, k_eps);
|
||||
}
|
||||
|
||||
TEST(UnitTestProjection, CalcViewAnglesFromViewMatrix_LookingForward)
|
||||
{
|
||||
constexpr float k_eps = 1e-4f;
|
||||
|
||||
Reference in New Issue
Block a user