mirror of
https://github.com/orange-cpp/omath.git
synced 2026-04-19 04:23:27 +00:00
added stuff
This commit is contained in:
@@ -16,7 +16,8 @@ namespace omath::cry_engine
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
auto current_pos = projectile.m_origin
|
||||
const auto launch_pos = projectile.m_origin + projectile.m_launch_offset;
|
||||
auto current_pos = launch_pos
|
||||
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||
RollAngle::from_degrees(0)})
|
||||
* projectile.m_launch_speed * time;
|
||||
|
||||
@@ -16,7 +16,8 @@ namespace omath::frostbite_engine
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
auto current_pos = projectile.m_origin
|
||||
const auto launch_pos = projectile.m_origin + projectile.m_launch_offset;
|
||||
auto current_pos = launch_pos
|
||||
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||
RollAngle::from_degrees(0)})
|
||||
* projectile.m_launch_speed * time;
|
||||
|
||||
@@ -17,7 +17,8 @@ namespace omath::iw_engine
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
auto current_pos = projectile.m_origin
|
||||
const auto launch_pos = projectile.m_origin + projectile.m_launch_offset;
|
||||
auto current_pos = launch_pos
|
||||
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||
RollAngle::from_degrees(0)})
|
||||
* projectile.m_launch_speed * time;
|
||||
|
||||
@@ -16,7 +16,8 @@ namespace omath::opengl_engine
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
auto current_pos = projectile.m_origin
|
||||
const auto launch_pos = projectile.m_origin + projectile.m_launch_offset;
|
||||
auto current_pos = launch_pos
|
||||
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||
RollAngle::from_degrees(0)})
|
||||
* projectile.m_launch_speed * time;
|
||||
|
||||
@@ -17,7 +17,8 @@ namespace omath::source_engine
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
auto current_pos = projectile.m_origin
|
||||
const auto launch_pos = projectile.m_origin + projectile.m_launch_offset;
|
||||
auto current_pos = launch_pos
|
||||
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||
RollAngle::from_degrees(0)})
|
||||
* projectile.m_launch_speed * time;
|
||||
|
||||
@@ -16,7 +16,8 @@ namespace omath::unity_engine
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
auto current_pos = projectile.m_origin
|
||||
const auto launch_pos = projectile.m_origin + projectile.m_launch_offset;
|
||||
auto current_pos = launch_pos
|
||||
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||
RollAngle::from_degrees(0)})
|
||||
* projectile.m_launch_speed * time;
|
||||
|
||||
@@ -16,7 +16,8 @@ namespace omath::unreal_engine
|
||||
const float pitch, const float yaw,
|
||||
const float time, const float gravity) noexcept
|
||||
{
|
||||
auto current_pos = projectile.m_origin
|
||||
const auto launch_pos = projectile.m_origin + projectile.m_launch_offset;
|
||||
auto current_pos = launch_pos
|
||||
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||
RollAngle::from_degrees(0)})
|
||||
* projectile.m_launch_speed * time;
|
||||
|
||||
@@ -8,12 +8,23 @@
|
||||
|
||||
namespace omath::projectile_prediction
|
||||
{
|
||||
struct AimAngles
|
||||
{
|
||||
float pitch{};
|
||||
float yaw{};
|
||||
};
|
||||
|
||||
class ProjPredEngineInterface
|
||||
{
|
||||
public:
|
||||
[[nodiscard]]
|
||||
virtual std::optional<Vector3<float>> maybe_calculate_aim_point(const Projectile& projectile,
|
||||
const Target& target) const = 0;
|
||||
|
||||
[[nodiscard]]
|
||||
virtual std::optional<AimAngles> maybe_calculate_aim_angles(const Projectile& projectile,
|
||||
const Target& target) const = 0;
|
||||
|
||||
virtual ~ProjPredEngineInterface() = default;
|
||||
};
|
||||
} // namespace omath::projectile_prediction
|
||||
|
||||
@@ -12,6 +12,9 @@ namespace omath::projectile_prediction
|
||||
[[nodiscard]] std::optional<Vector3<float>>
|
||||
maybe_calculate_aim_point(const Projectile& projectile, const Target& target) const override;
|
||||
|
||||
[[nodiscard]] std::optional<AimAngles>
|
||||
maybe_calculate_aim_angles(const Projectile& projectile, const Target& target) const override;
|
||||
|
||||
ProjPredEngineAvx2(float gravity_constant, float simulation_time_step, float maximum_simulation_time);
|
||||
~ProjPredEngineAvx2() override = default;
|
||||
|
||||
|
||||
@@ -54,6 +54,36 @@ namespace omath::projectile_prediction
|
||||
[[nodiscard]]
|
||||
std::optional<Vector3<float>> maybe_calculate_aim_point(const Projectile& projectile,
|
||||
const Target& target) const override
|
||||
{
|
||||
const auto solution = find_solution(projectile, target);
|
||||
if (!solution)
|
||||
return std::nullopt;
|
||||
|
||||
return EngineTrait::calc_viewpoint_from_angles(projectile, solution->predicted_target_position,
|
||||
solution->pitch);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
std::optional<AimAngles> maybe_calculate_aim_angles(const Projectile& projectile,
|
||||
const Target& target) const override
|
||||
{
|
||||
const auto solution = find_solution(projectile, target);
|
||||
if (!solution)
|
||||
return std::nullopt;
|
||||
|
||||
const auto yaw = EngineTrait::calc_direct_yaw_angle(projectile.m_origin, solution->predicted_target_position);
|
||||
return AimAngles{solution->pitch, yaw};
|
||||
}
|
||||
|
||||
private:
|
||||
struct Solution
|
||||
{
|
||||
Vector3<float> predicted_target_position;
|
||||
float pitch;
|
||||
};
|
||||
|
||||
[[nodiscard]]
|
||||
std::optional<Solution> find_solution(const Projectile& projectile, const Target& target) const
|
||||
{
|
||||
for (float time = 0.f; time < m_maximum_simulation_time; time += m_simulation_time_step)
|
||||
{
|
||||
@@ -70,12 +100,11 @@ namespace omath::projectile_prediction
|
||||
time))
|
||||
continue;
|
||||
|
||||
return EngineTrait::calc_viewpoint_from_angles(projectile, predicted_target_position, projectile_pitch);
|
||||
return Solution{predicted_target_position, projectile_pitch.value()};
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
private:
|
||||
const float m_gravity_constant;
|
||||
const float m_simulation_time_step;
|
||||
const float m_maximum_simulation_time;
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace omath::projectile_prediction
|
||||
{
|
||||
public:
|
||||
Vector3<float> m_origin;
|
||||
Vector3<float> m_launch_offset{0.f, 0.f, 0.f};
|
||||
float m_launch_speed{};
|
||||
float m_gravity_scale{};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user