@@ -27,10 +27,7 @@ namespace omath::projectile_prediction
27
27
if (!is_projectile_reached_target (predicted_target_position, projectile, projectile_pitch.value (), time))
28
28
continue ;
29
29
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);
34
31
}
35
32
return std::nullopt;
36
33
}
@@ -41,12 +38,14 @@ namespace omath::projectile_prediction
41
38
const auto bullet_gravity = m_gravity_constant * projectile.m_gravity_scale ;
42
39
const auto delta = target_position - projectile.m_origin ;
43
40
44
- const auto distance2d = delta. length_2d ( );
41
+ const auto distance2d = calc_vector_2d_distance (delta );
45
42
const auto distance2d_sqr = distance2d * distance2d;
46
43
const auto launch_speed_sqr = projectile.m_launch_speed * projectile.m_launch_speed ;
47
44
48
45
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);
50
49
51
50
if (root < 0 .0f ) [[unlikely]]
52
51
return std::nullopt;
@@ -62,8 +61,40 @@ namespace omath::projectile_prediction
62
61
const float time) const noexcept
63
62
{
64
63
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);
66
65
67
66
return projectile_position.distance_to (target_position) <= m_distance_tolerance;
68
67
}
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
+ }
69
100
} // namespace omath::projectile_prediction
0 commit comments