summaryrefslogtreecommitdiffhomepage
path: root/src/xhair.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xhair.c')
-rw-r--r--src/xhair.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/xhair.c b/src/xhair.c
new file mode 100644
index 0000000..e2f7bfb
--- /dev/null
+++ b/src/xhair.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright © 2024 Michael Smith <mikesmiffy128@gmail.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <string.h>
+
+#include "con_.h"
+#include "engineapi.h"
+#include "feature.h"
+#include "hexcolour.h"
+#include "hud.h"
+#include "intdefs.h"
+
+FEATURE("crosshair drawing")
+REQUIRE(hud)
+
+DEF_CVAR(sst_xhair, "Enable custom crosshair", 0, CON_ARCHIVE | CON_HIDDEN)
+DEF_CVAR(sst_xhair_colour, "Colour for alternative crosshair (RGBA hex)",
+ "FFFFFF", CON_ARCHIVE | CON_HIDDEN)
+DEF_CVAR_MIN(sst_xhair_thickness, "Thickness of custom crosshair in pixels", 2,
+ 1, CON_ARCHIVE | CON_HIDDEN)
+DEF_CVAR_MIN(sst_xhair_size, "Length of lines in custom crosshair in pixels", 8,
+ 0, CON_ARCHIVE | CON_HIDDEN)
+DEF_CVAR_MIN(sst_xhair_gap, "Gap between lines in custom crosshair in pixels",
+ 16, 0, CON_ARCHIVE | CON_HIDDEN)
+DEF_CVAR(sst_xhair_dot, "Whether to draw dot in middle of custom crosshair",
+ 1, CON_ARCHIVE | CON_HIDDEN)
+DEF_CVAR(sst_xhair_outline, "Whether to draw outline around custom crosshair",
+ 0, CON_ARCHIVE | CON_HIDDEN)
+
+static struct rgba colour = {255, 255, 255, 255};
+
+static void colourcb(struct con_var *v) {
+ hexcolour_rgba(colour.bytes, con_getvarstr(v));
+}
+
+static inline void drawrect(int x0, int y0, int x1, int y1, struct rgba colour,
+ bool outline) {
+ hud_drawrect(x0, y0, x1, y1, colour, true);
+ if (outline) hud_drawrect(x0, y0, x1, y1, (struct rgba){.a = 255}, false);
+}
+HANDLE_EVENT(HudPaint, void) {
+ if (!con_getvari(sst_xhair)) return;
+ int w, h;
+ hud_screensize(&w, &h);
+ int thick = con_getvari(sst_xhair_thickness);
+ int thick1 = (thick + 1) / 2, thick2 = thick - thick1;
+ int sz = con_getvari(sst_xhair_size);
+ int gap = con_getvari(sst_xhair_gap);
+ int gap1 = (gap + 1) / 2, gap2 = gap - gap1;
+ int x = w / 2, y = h / 2;
+ bool ol = !!con_getvari(sst_xhair_outline);
+ if (sz) {
+ drawrect(x - thick1, y - sz - gap1, x + thick2, y - gap1, colour, ol);
+ drawrect(x - thick1, y + gap2, x + thick2, y + sz + gap2, colour, ol);
+ drawrect(x - sz - gap1, y - thick1, x - gap1, y + thick2, colour, ol);
+ drawrect(x + gap2, y - thick1, x + sz + gap2, y + thick2, colour, ol);
+ }
+ if (con_getvari(sst_xhair_dot) && (gap >= thick || ol)) {
+ drawrect(x - thick1, y - thick1, x + thick2, y + thick2, colour, ol);
+ }
+}
+
+INIT {
+ sst_xhair->base.flags &= ~CON_HIDDEN;
+ sst_xhair_colour->base.flags &= ~CON_HIDDEN;
+ sst_xhair_colour->cb = &colourcb;
+ sst_xhair_thickness->base.flags &= ~CON_HIDDEN;
+ sst_xhair_size->base.flags &= ~CON_HIDDEN;
+ sst_xhair_gap->base.flags &= ~CON_HIDDEN;
+ sst_xhair_dot->base.flags &= ~CON_HIDDEN;
+ sst_xhair_outline->base.flags &= ~CON_HIDDEN;
+ return true;
+}
+
+// vi: sw=4 ts=4 noet tw=80 cc=80