@@ -27,10 +27,7 @@ namespace omath::projectile_prediction
2727 if (!is_projectile_reached_target (predicted_target_position, projectile, projectile_pitch.value (), time))
2828 continue ;
2929
30- const auto delta2d = (predicted_target_position - projectile.m_origin ).length_2d ();
31- const auto height = delta2d * std::tan (angles::degrees_to_radians (projectile_pitch.value ()));
32-
33- return Vector3 (predicted_target_position.x , predicted_target_position.y , projectile.m_origin .z + height);
30+ return calc_viewpoint_from_angles (projectile, predicted_target_position, projectile_pitch);
3431 }
3532 return std::nullopt ;
3633 }
@@ -41,12 +38,14 @@ namespace omath::projectile_prediction
4138 const auto bullet_gravity = m_gravity_constant * projectile.m_gravity_scale ;
4239 const auto delta = target_position - projectile.m_origin ;
4340
44- const auto distance2d = delta. length_2d ( );
41+ const auto distance2d = calc_vector_2d_distance (delta );
4542 const auto distance2d_sqr = distance2d * distance2d;
4643 const auto launch_speed_sqr = projectile.m_launch_speed * projectile.m_launch_speed ;
4744
4845 float root = launch_speed_sqr * launch_speed_sqr
49- - bullet_gravity * (bullet_gravity * distance2d_sqr + 2 .0f * delta.z * launch_speed_sqr);
46+ - bullet_gravity
47+ * (bullet_gravity * distance2d_sqr
48+ + 2 .0f * get_vector_height_coordinate (delta) * launch_speed_sqr);
5049
5150 if (root < 0 .0f ) [[unlikely]]
5251 return std::nullopt ;
@@ -62,8 +61,40 @@ namespace omath::projectile_prediction
6261 const float time) const noexcept
6362 {
6463 const auto yaw = projectile.m_origin .view_angle_to (target_position).y ;
65- const auto projectile_position = projectile. predict_position ( pitch, yaw, time, m_gravity_constant);
64+ const auto projectile_position = predict_projectile_position (projectile, pitch, yaw, time, m_gravity_constant);
6665
6766 return projectile_position.distance_to (target_position) <= m_distance_tolerance;
6867 }
68+
69+ float ProjPredEngineLegacy::calc_vector_2d_distance (const Vector3<float >& delta) const
70+ {
71+ return std::sqrt (delta.x * delta.x + delta.y * delta.y );
72+ }
73+
74+ float ProjPredEngineLegacy::get_vector_height_coordinate (const Vector3<float >& vec) const
75+ {
76+ return vec.z ;
77+ }
78+ Vector3<float > ProjPredEngineLegacy::calc_viewpoint_from_angles (const Projectile& projectile,
79+ const Vector3<float > predicted_target_position,
80+ const std::optional<float > projectile_pitch) const
81+ {
82+ const auto delta2d = calc_vector_2d_distance (predicted_target_position - projectile.m_origin );
83+ const auto height = delta2d * std::tan (angles::degrees_to_radians (projectile_pitch.value ()));
84+
85+ return {predicted_target_position.x , predicted_target_position.y , projectile.m_origin .z + height};
86+ }
87+ Vector3<float > ProjPredEngineLegacy::predict_projectile_position (const Projectile& projectile, const float pitch,
88+ const float yaw, const float time,
89+ const float gravity) const
90+ {
91+ auto current_pos = projectile.m_origin
92+ + source_engine::forward_vector ({source_engine::PitchAngle::from_degrees (-pitch),
93+ source_engine::YawAngle::from_degrees (yaw),
94+ source_engine::RollAngle::from_degrees (0 )})
95+ * projectile.m_launch_speed * time;
96+ current_pos.z -= (gravity * projectile.m_gravity_scale ) * (time * time) * 0 .5f ;
97+
98+ return current_pos;
99+ }
69100} // namespace omath::projectile_prediction
0 commit comments