mirror of
https://github.com/orange-cpp/omath.git
synced 2026-02-13 07:03:25 +00:00
changed code style
This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
//
|
||||
#include "omath/projectile_prediction/proj_pred_engine.hpp"
|
||||
|
||||
|
||||
namespace omath::projectile_prediction
|
||||
{
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
namespace omath::projectile_prediction
|
||||
{
|
||||
std::optional<Vector3<float>>
|
||||
ProjPredEngineAVX2::MaybeCalculateAimPoint([[maybe_unused]] const Projectile& projectile,
|
||||
[[maybe_unused]] const Target& target) const
|
||||
ProjPredEngineAvx2::maybe_calculate_aim_point([[maybe_unused]] const Projectile& projectile,
|
||||
[[maybe_unused]] const Target& target) const
|
||||
{
|
||||
#if defined(OMATH_USE_AVX2) && defined(__i386__) && defined(__x86_64__)
|
||||
const float bulletGravity = m_gravityConstant * projectile.m_gravityScale;
|
||||
@@ -28,16 +28,16 @@ namespace omath::projectile_prediction
|
||||
|
||||
for (; currentTime <= m_maximumSimulationTime; currentTime += m_simulationTimeStep * SIMD_FACTOR)
|
||||
{
|
||||
const __m256 times =
|
||||
_mm256_setr_ps(currentTime, currentTime + m_simulationTimeStep,
|
||||
currentTime + m_simulationTimeStep * 2, currentTime + m_simulationTimeStep * 3,
|
||||
currentTime + m_simulationTimeStep * 4, currentTime + m_simulationTimeStep * 5,
|
||||
currentTime + m_simulationTimeStep * 6, currentTime + m_simulationTimeStep * 7);
|
||||
const __m256 times
|
||||
= _mm256_setr_ps(currentTime, currentTime + m_simulationTimeStep,
|
||||
currentTime + m_simulationTimeStep * 2, currentTime + m_simulationTimeStep * 3,
|
||||
currentTime + m_simulationTimeStep * 4, currentTime + m_simulationTimeStep * 5,
|
||||
currentTime + m_simulationTimeStep * 6, currentTime + m_simulationTimeStep * 7);
|
||||
|
||||
const __m256 targetX =
|
||||
_mm256_fmadd_ps(_mm256_set1_ps(target.m_velocity.x), times, _mm256_set1_ps(target.m_origin.x));
|
||||
const __m256 targetY =
|
||||
_mm256_fmadd_ps(_mm256_set1_ps(target.m_velocity.y), times, _mm256_set1_ps(target.m_origin.y));
|
||||
const __m256 targetX
|
||||
= _mm256_fmadd_ps(_mm256_set1_ps(target.m_velocity.x), times, _mm256_set1_ps(target.m_origin.x));
|
||||
const __m256 targetY
|
||||
= _mm256_fmadd_ps(_mm256_set1_ps(target.m_velocity.y), times, _mm256_set1_ps(target.m_origin.y));
|
||||
const __m256 timesSq = _mm256_mul_ps(times, times);
|
||||
const __m256 targetZ = _mm256_fmadd_ps(_mm256_set1_ps(target.m_velocity.z), times,
|
||||
_mm256_fnmadd_ps(_mm256_set1_ps(0.5f * m_gravityConstant), timesSq,
|
||||
@@ -112,25 +112,32 @@ namespace omath::projectile_prediction
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
#else
|
||||
throw std::runtime_error(
|
||||
std::format("{} AVX2 feature is not enabled!", std::source_location::current().function_name()));
|
||||
#endif
|
||||
}
|
||||
ProjPredEngineAVX2::ProjPredEngineAVX2(const float gravityConstant, const float simulationTimeStep,
|
||||
const float maximumSimulationTime) :
|
||||
m_gravityConstant(gravityConstant), m_simulationTimeStep(simulationTimeStep),
|
||||
m_maximumSimulationTime(maximumSimulationTime)
|
||||
ProjPredEngineAvx2::ProjPredEngineAvx2(const float gravity_constant, const float simulation_time_step,
|
||||
const float maximum_simulation_time)
|
||||
: m_gravity_constant(gravity_constant), m_simulation_time_step(simulation_time_step),
|
||||
m_maximum_simulation_time(maximum_simulation_time)
|
||||
{
|
||||
}
|
||||
std::optional<float> ProjPredEngineAVX2::CalculatePitch(const Vector3<float>& projOrigin,
|
||||
const Vector3<float>& targetPos, const float bulletGravity,
|
||||
const float v0, const float time)
|
||||
std::optional<float> ProjPredEngineAvx2::calculate_pitch([[maybe_unused]] const Vector3<float>& proj_origin,
|
||||
[[maybe_unused]] const Vector3<float>& target_pos,
|
||||
[[maybe_unused]] const float bullet_gravity,
|
||||
[[maybe_unused]] const float v0,
|
||||
[[maybe_unused]] const float time)
|
||||
{
|
||||
#if defined(OMATH_USE_AVX2) && defined(__i386__) && defined(__x86_64__)
|
||||
if (time <= 0.0f)
|
||||
return std::nullopt;
|
||||
|
||||
const Vector3 delta = targetPos - projOrigin;
|
||||
const Vector3 delta = target_pos - proj_origin;
|
||||
const float dSqr = delta.x * delta.x + delta.y * delta.y;
|
||||
const float h = delta.z;
|
||||
|
||||
const float term = h + 0.5f * bulletGravity * time * time;
|
||||
const float term = h + 0.5f * bullet_gravity * time * time;
|
||||
const float requiredV0Sqr = (dSqr + term * term) / (time * time);
|
||||
const float v0Sqr = v0 * v0;
|
||||
|
||||
@@ -140,7 +147,6 @@ namespace omath::projectile_prediction
|
||||
if (dSqr == 0.0f)
|
||||
return term >= 0.0f ? 90.0f : -90.0f;
|
||||
|
||||
|
||||
const float d = std::sqrt(dSqr);
|
||||
const float tanTheta = term / d;
|
||||
return angles::RadiansToDegrees(std::atan(tanTheta));
|
||||
|
||||
@@ -4,65 +4,67 @@
|
||||
|
||||
namespace omath::projectile_prediction
|
||||
{
|
||||
ProjPredEngineLegacy::ProjPredEngineLegacy(const float gravityConstant, const float simulationTimeStep,
|
||||
const float maximumSimulationTime, const float distanceTolerance) :
|
||||
m_gravityConstant(gravityConstant), m_simulationTimeStep(simulationTimeStep),
|
||||
m_maximumSimulationTime(maximumSimulationTime), m_distanceTolerance(distanceTolerance)
|
||||
ProjPredEngineLegacy::ProjPredEngineLegacy(const float gravity_constant, const float simulation_time_step,
|
||||
const float maximum_simulation_time, const float distance_tolerance)
|
||||
: m_gravity_constant(gravity_constant), m_simulation_time_step(simulation_time_step),
|
||||
m_maximum_simulation_time(maximum_simulation_time), m_distance_tolerance(distance_tolerance)
|
||||
{
|
||||
}
|
||||
|
||||
std::optional<Vector3<float>> ProjPredEngineLegacy::MaybeCalculateAimPoint(const Projectile& projectile,
|
||||
const Target& target) const
|
||||
std::optional<Vector3<float>> ProjPredEngineLegacy::maybe_calculate_aim_point(const Projectile& projectile,
|
||||
const Target& target) const
|
||||
{
|
||||
for (float time = 0.f; time < m_maximumSimulationTime; time += m_simulationTimeStep)
|
||||
for (float time = 0.f; time < m_maximum_simulation_time; time += m_simulation_time_step)
|
||||
{
|
||||
const auto predictedTargetPosition = target.PredictPosition(time, m_gravityConstant);
|
||||
const auto predicted_target_position = target.predict_position(time, m_gravity_constant);
|
||||
|
||||
const auto projectilePitch = MaybeCalculateProjectileLaunchPitchAngle(projectile, predictedTargetPosition);
|
||||
const auto projectile_pitch
|
||||
= maybe_calculate_projectile_launch_pitch_angle(projectile, predicted_target_position);
|
||||
|
||||
if (!projectilePitch.has_value()) [[unlikely]]
|
||||
if (!projectile_pitch.has_value()) [[unlikely]]
|
||||
continue;
|
||||
|
||||
if (!IsProjectileReachedTarget(predictedTargetPosition, projectile, projectilePitch.value(), time))
|
||||
if (!is_projectile_reached_target(predicted_target_position, projectile, projectile_pitch.value(), time))
|
||||
continue;
|
||||
|
||||
const auto delta2d = (predictedTargetPosition - projectile.m_origin).Length2D();
|
||||
const auto height = delta2d * std::tan(angles::DegreesToRadians(projectilePitch.value()));
|
||||
const auto delta2d = (predicted_target_position - projectile.m_origin).length_2d();
|
||||
const auto height = delta2d * std::tan(angles::degrees_to_radians(projectile_pitch.value()));
|
||||
|
||||
return Vector3(predictedTargetPosition.x, predictedTargetPosition.y, projectile.m_origin.z + height);
|
||||
return Vector3(predicted_target_position.x, predicted_target_position.y, projectile.m_origin.z + height);
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::optional<float>
|
||||
ProjPredEngineLegacy::MaybeCalculateProjectileLaunchPitchAngle(const Projectile& projectile,
|
||||
const Vector3<float>& targetPosition) const
|
||||
ProjPredEngineLegacy::maybe_calculate_projectile_launch_pitch_angle(const Projectile& projectile,
|
||||
const Vector3<float>& target_position) const
|
||||
{
|
||||
const auto bulletGravity = m_gravityConstant * projectile.m_gravityScale;
|
||||
const auto delta = targetPosition - projectile.m_origin;
|
||||
const auto bullet_gravity = m_gravity_constant * projectile.m_gravity_scale;
|
||||
const auto delta = target_position - projectile.m_origin;
|
||||
|
||||
const auto distance2d = delta.Length2D();
|
||||
const auto distance2dSqr = distance2d * distance2d;
|
||||
const auto launchSpeedSqr = projectile.m_launchSpeed * projectile.m_launchSpeed;
|
||||
const auto distance2d = delta.length_2d();
|
||||
const auto distance2d_sqr = distance2d * distance2d;
|
||||
const auto launch_speed_sqr = projectile.m_launch_speed * projectile.m_launch_speed;
|
||||
|
||||
float root = launchSpeedSqr * launchSpeedSqr -
|
||||
bulletGravity * (bulletGravity * distance2dSqr + 2.0f * delta.z * launchSpeedSqr);
|
||||
float root = launch_speed_sqr * launch_speed_sqr
|
||||
- bullet_gravity * (bullet_gravity * distance2d_sqr + 2.0f * delta.z * launch_speed_sqr);
|
||||
|
||||
if (root < 0.0f) [[unlikely]]
|
||||
return std::nullopt;
|
||||
|
||||
root = std::sqrt(root);
|
||||
const float angle = std::atan((launchSpeedSqr - root) / (bulletGravity * distance2d));
|
||||
const float angle = std::atan((launch_speed_sqr - root) / (bullet_gravity * distance2d));
|
||||
|
||||
return angles::RadiansToDegrees(angle);
|
||||
return angles::radians_to_degrees(angle);
|
||||
}
|
||||
|
||||
bool ProjPredEngineLegacy::IsProjectileReachedTarget(const Vector3<float>& targetPosition, const Projectile& projectile,
|
||||
const float pitch, const float time) const
|
||||
bool ProjPredEngineLegacy::is_projectile_reached_target(const Vector3<float>& target_position,
|
||||
const Projectile& projectile, const float pitch,
|
||||
const float time) const
|
||||
{
|
||||
const auto yaw = projectile.m_origin.ViewAngleTo(targetPosition).y;
|
||||
const auto projectilePosition = projectile.PredictPosition(pitch, yaw, time, m_gravityConstant);
|
||||
const auto yaw = projectile.m_origin.view_angle_to(target_position).y;
|
||||
const auto projectile_position = projectile.predict_position(pitch, yaw, time, m_gravity_constant);
|
||||
|
||||
return projectilePosition.DistTo(targetPosition) <= m_distanceTolerance;
|
||||
return projectile_position.distance_to(target_position) <= m_distance_tolerance;
|
||||
}
|
||||
} // namespace omath::projectile_prediction
|
||||
|
||||
@@ -3,19 +3,20 @@
|
||||
//
|
||||
|
||||
#include "omath/projectile_prediction/projectile.hpp"
|
||||
|
||||
#include <omath/engines/source_engine/formulas.hpp>
|
||||
|
||||
namespace omath::projectile_prediction
|
||||
{
|
||||
Vector3<float> Projectile::PredictPosition(const float pitch, const float yaw, const float time, const float gravity) const
|
||||
Vector3<float> Projectile::predict_position(const float pitch, const float yaw, const float time,
|
||||
const float gravity) const
|
||||
{
|
||||
auto currentPos = m_origin + source_engine::ForwardVector({source_engine::PitchAngle::FromDegrees(-pitch),
|
||||
source_engine::YawAngle::FromDegrees(yaw),
|
||||
source_engine::RollAngle::FromDegrees(0)}) *
|
||||
m_launchSpeed * time;
|
||||
currentPos.z -= (gravity * m_gravityScale) * (time * time) * 0.5f;
|
||||
auto current_pos = m_origin
|
||||
+ source_engine::forward_vector({source_engine::PitchAngle::from_degrees(-pitch),
|
||||
source_engine::YawAngle::from_degrees(yaw),
|
||||
source_engine::RollAngle::from_degrees(0)})
|
||||
* m_launch_speed * time;
|
||||
current_pos.z -= (gravity * m_gravity_scale) * (time * time) * 0.5f;
|
||||
|
||||
return currentPos;
|
||||
return current_pos;
|
||||
}
|
||||
} // namespace omath::prediction
|
||||
} // namespace omath::projectile_prediction
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
#include "omath/projectile_prediction/projectile.hpp"
|
||||
|
||||
|
||||
namespace omath::prediction
|
||||
{
|
||||
|
||||
|
||||
Reference in New Issue
Block a user