From 67dcedd90844c391563ea66f8b244271a37504a6 Mon Sep 17 00:00:00 2001 From: salmonik Date: Tue, 27 Oct 2026 12:47:26 +0100 Subject: ESP: draw the FOV circle as a stable screen-space ellipse --- src/esp.cpp | 59 +++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/esp.cpp b/src/esp.cpp index 945b234..c0edd2e 100644 --- a/src/esp.cpp +++ b/src/esp.cpp @@ -276,6 +276,15 @@ static void surf_line(int x0, int y0, int x1, int y1) { // Screen projection of the aimbot FOV cone boundary, using the engine's own // world->screen transform so it follows the actual aspect/fov. +static QAngle engine_view_angles() { + QAngle v{g_cam_view.x, g_cam_view.y, g_cam_view.z}; + if (g_iface.engine) { + using Fn = void (*)(void *, QAngle *); + vfunc(g_iface.engine, 19)(g_iface.engine, &v); + } + return v; +} + static void draw_fov_circle() { if (!aimbot_fov_circle()) return; @@ -283,33 +292,43 @@ static void draw_fov_circle() { if (fov < 1.0f || fov >= 89.0f) // beyond this the "circle" is behind the eye return; float alpha = fov * PI_F / 180.0f; - float yaw = g_cam_view.y * PI_F / 180.0f; - float pitch = g_cam_view.x * PI_F / 180.0f; + QAngle view = engine_view_angles(); + float yaw = view.y * PI_F / 180.0f; + float pitch = view.x * PI_F / 180.0f; Vector fwd{cosf(pitch) * cosf(yaw), cosf(pitch) * sinf(yaw), -sinf(pitch)}; Vector right{sinf(yaw), -cosf(yaw), 0.0f}; Vector up{right.y * fwd.z - right.z * fwd.y, right.z * fwd.x - right.x * fwd.z, right.x * fwd.y - right.y * fwd.x}; - constexpr int N = 48; - float xs[N], ys[N]; - bool ok[N]; + + constexpr float D = 1024.0f; float ca = cosf(alpha), sa = sinf(alpha); - for (int i = 0; i < N; i++) { - float phi = (2.0f * PI_F * i) / N; - float cp = cosf(phi), sp = sinf(phi); - Vector d{fwd.x * ca + (right.x * cp + up.x * sp) * sa, - fwd.y * ca + (right.y * cp + up.y * sp) * sa, - fwd.z * ca + (right.z * cp + up.z * sp) * sa}; - Vector p{g_cam_eye.x + d.x * 1024.0f, g_cam_eye.y + d.y * 1024.0f, - g_cam_eye.z + d.z * 1024.0f}; - ok[i] = world_to_screen(p, xs[i], ys[i]) && std::isfinite(xs[i]) && - std::isfinite(ys[i]); - } + Vector eh{g_cam_eye.x + (fwd.x * ca + right.x * sa) * D, + g_cam_eye.y + (fwd.y * ca + right.y * sa) * D, + g_cam_eye.z + (fwd.z * ca + right.z * sa) * D}; + Vector ev{g_cam_eye.x + (fwd.x * ca + up.x * sa) * D, + g_cam_eye.y + (fwd.y * ca + up.y * sa) * D, + g_cam_eye.z + (fwd.z * ca + up.z * sa) * D}; + float hsx, hsy, vsx, vsy; + if (!world_to_screen(eh, hsx, hsy) || !world_to_screen(ev, vsx, vsy)) + return; + + float cx = (float)g_scr_w * 0.5f, cy = (float)g_scr_h * 0.5f; + float rx = fabsf(hsx - cx), ry = fabsf(vsy - cy); + if (!(rx > 1.0f && ry > 1.0f) || rx > 1e5f || ry > 1e5f) + return; + + constexpr int N = 64; + int px = 0, py = 0; surf_color(255, 255, 255, 160); - for (int i = 0; i < N; i++) { - int j = (i + 1) % N; - if (ok[i] && ok[j]) - surf_line((int)xs[i], (int)ys[i], (int)xs[j], (int)ys[j]); + for (int i = 0; i <= N; i++) { + float phi = (2.0f * PI_F * i) / N; + int x = (int)(cx + rx * cosf(phi)); + int y = (int)(cy + ry * sinf(phi)); + if (i > 0) + surf_line(px, py, x, y); + px = x; + py = y; } } -- cgit v1.2.3