From 5194eeb0e7bb5d2a2086c96ed04c2a47f9594d87 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Tue, 2 May 2023 19:16:22 +0100 Subject: Refactor the RGBA colour struct into engineapi.h In both the engine and SST it's used in more places than just console printing, so it makes more sense to give it a more appropriate nanme and location. --- src/build/codegen.c | 19 +++++++++---------- src/con_.c | 10 +++++----- src/con_.h | 13 +++---------- src/dbg.c | 7 ++++--- src/engineapi.h | 12 +++++++++++- src/portalcolours.c | 14 ++++++-------- src/rinput.c | 12 ++++++------ src/sst.c | 8 +++----- 8 files changed, 47 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/build/codegen.c b/src/build/codegen.c index 391f572..bf3ae1e 100644 --- a/src/build/codegen.c +++ b/src/build/codegen.c @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Michael Smith + * Copyright © 2023 Michael Smith * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -415,18 +415,17 @@ F( "static bool has_%s = false;", f->modname) } _( "") _( "static void initfeatures(void) {") - for (struct feature *f = features.x[0]; f; f = f->hdr.x[0]) { - featdfs(out, f); - } + for (struct feature *f = features.x[0]; f; f = f->hdr.x[0]) featdfs(out, f); _( "") // note: old success message is moved in here, to get the ordering right -_( " con_colourmsg(RGBA(64, 255, 64, 255),") +_( " con_colourmsg(&(struct rgba){64, 255, 64, 255},") _( " LONGNAME \" v\" VERSION \" successfully loaded\");") -_( " con_colourmsg(RGBA(255, 255, 255, 255), \" for game \");") -_( " con_colourmsg(RGBA(0, 255, 255, 255), \"%s\\n\", gameinfo_title);") -_( " struct con_colour white = {255, 255, 255, 255};") -_( " struct con_colour green = {128, 255, 128, 255};") -_( " struct con_colour red = {255, 128, 128, 255};") +_( " con_colourmsg(&(struct rgba){255, 255, 255, 255}, \" for game \");") +_( " con_colourmsg(&(struct rgba){0, 255, 255, 255}, \"%s\\n\", ") +_( " gameinfo_title);") +_( " struct rgba white = {255, 255, 255, 255};") +_( " struct rgba green = {128, 255, 128, 255};") +_( " struct rgba red = {255, 128, 128, 255};") _( " con_colourmsg(&white, \"---- List of plugin features ---\\n\");"); for (const struct feature *f = features_bydesc.x[0]; f; f = f->hdr_bydesc.x[0]) { diff --git a/src/con_.c b/src/con_.c index 1f6dec5..a80a2d4 100644 --- a/src/con_.c +++ b/src/con_.c @@ -21,7 +21,7 @@ #include "abi.h" #include "con_.h" -#include "engineapi.h" // only for factories - XXX: do we care this is circular? +#include "engineapi.h" // for factories and rgba - XXX: is this a bit circular? #include "extmalloc.h" #include "gametype.h" #include "mem.h" @@ -46,7 +46,7 @@ int con_cmdclient; // these have to be extern because of varargs nonsense - they get wrapped in a // macro for the actual api (con_colourmsg) void *_con_iface; -void (*_con_colourmsgf)(void *this, const struct con_colour *c, const char *fmt, +void (*_con_colourmsgf)(void *this, const struct rgba *c, const char *fmt, ...) _CON_PRINTF(3, 4); // bootstrap hackery, see "GENIUS HACK" comment below :) @@ -67,7 +67,7 @@ DECL_VFUNC_DYN(void, CallGlobalChangeCallbacks, struct con_var *, const char *, // can't pass varargs to other varargs of course). we only get a pointer to it // via VFUNC so just declare the typedef here - I don't wanna write any more // macros today. -typedef void (*ConsoleColorPrintf_func)(void *, const struct con_colour *, +typedef void (*ConsoleColorPrintf_func)(void *, const struct rgba *, const char *, ...); static inline void initval(struct con_var *v) { @@ -229,7 +229,7 @@ static void VCALLCONV InternalSetIntValue_impl(struct con_var *this, int v) { DECL_VFUNC_DYN(void, InternalSetValue, const char *) DECL_VFUNC_DYN(void, InternalSetFloatValue, float) DECL_VFUNC_DYN(void, InternalSetIntValue, int) -DECL_VFUNC_DYN(void, InternalSetColorValue, struct con_colour) +DECL_VFUNC_DYN(void, InternalSetColorValue, struct rgba) // Hack: IConVar things get this-adjusted pointers, we just reverse the offset // to get the top pointer. @@ -248,7 +248,7 @@ static void VCALLCONV SetValue_i_thunk(void *thisoff, int v) { -offsetof(struct con_var, vtable_iconvar)); InternalSetIntValue(&this->parent->base, v); } -static void VCALLCONV SetValue_colour_thunk(void *thisoff, struct con_colour v) { +static void VCALLCONV SetValue_colour_thunk(void *thisoff, struct rgba v) { struct con_var *this = mem_offset(thisoff, -offsetof(struct con_var, vtable_iconvar)); InternalSetColorValue(&this->parent->base, v); diff --git a/src/con_.h b/src/con_.h index a6b2837..6d67e51 100644 --- a/src/con_.h +++ b/src/con_.h @@ -38,15 +38,6 @@ struct con_cmdargs { const char *argv[CON_CMD_MAX_ARGC]; }; -/* an RGBA colour, passed to con_colourmsg */ -struct con_colour { - union { - struct { u8 r, g, b, a; }; - u32 val; - uchar bytes[4]; - }; -}; - #define CON_CMD_MAXCOMPLETE 64 #define CON_CMD_MAXCOMPLLEN 64 @@ -196,8 +187,10 @@ void con_warn(const char *fmt, ...) _CON_PRINTF(1, 2) __asm__("Warning"); #error Need an equivalent of asm names for your compiler! #endif +struct rgba; // in engineapi.h - forward declare here to avoid warnings + extern void *_con_iface; -extern void (*_con_colourmsgf)(void *this, const struct con_colour *c, +extern void (*_con_colourmsgf)(void *this, const struct rgba *c, const char *fmt, ...) _CON_PRINTF(3, 4); /* * This provides the same functionality as ConColorMsg which was removed from diff --git a/src/dbg.c b/src/dbg.c index 06b88f8..2eb88f6 100644 --- a/src/dbg.c +++ b/src/dbg.c @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Michael Smith + * Copyright © 2023 Michael Smith * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -19,12 +19,13 @@ #endif #include "con_.h" +#include "engineapi.h" #include "intdefs.h" #include "ppmagic.h" #include "udis86.h" void dbg_hexdump(char *name, const void *p, int len) { - struct con_colour nice_colour = {160, 64, 200, 255}; // a nice purple colour + struct rgba nice_colour = {160, 64, 200, 255}; // a nice purple colour con_colourmsg(&nice_colour, "Hex dump \"%s\" (%p):", name, p); for (const uchar *cp = p; cp - (uchar *)p < len; ++cp) { // group into words and wrap every 8 words @@ -38,7 +39,7 @@ void dbg_hexdump(char *name, const void *p, int len) { } void dbg_asmdump(char *name, const void *p, int len) { - struct con_colour nice_colour = {40, 160, 140, 255}; // a nice teal colour + struct rgba nice_colour = {40, 160, 140, 255}; // a nice teal colour struct ud udis; ud_init(&udis); ud_set_mode(&udis, 32); diff --git a/src/engineapi.h b/src/engineapi.h index 05f47ea..d740c8c 100644 --- a/src/engineapi.h +++ b/src/engineapi.h @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Michael Smith + * Copyright © 2023 Michael Smith * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -70,6 +70,16 @@ struct edict { }; struct vec3f { float x, y, z; }; + +/* an RGBA colour, used for colour console messages as well as VGUI/HUD stuff */ +struct rgba { + union { + struct { u8 r, g, b, a; }; + u32 val; + uchar bytes[4]; + }; +}; + struct CMoveData { bool firstrun : 1, gamecodemoved : 1; ulong playerhandle; diff --git a/src/portalcolours.c b/src/portalcolours.c index 2231da4..48e4ee0 100644 --- a/src/portalcolours.c +++ b/src/portalcolours.c @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Michael Smith + * Copyright © 2023 Michael Smith * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -40,9 +40,7 @@ DEF_CVAR(sst_portal_colour1, "Crosshair colour for left portal (hex)", "40A0FF", CON_ARCHIVE | CON_HIDDEN) DEF_CVAR(sst_portal_colour2, "Crosshair colour for right portal (hex)", "FFA020", CON_ARCHIVE | CON_HIDDEN) -// XXX: bit weird that this is still con_colour. should we move it back out to -// engineapi as a general colour struct?? -static struct con_colour colours[3] = { +static struct rgba colours[3] = { {242, 202, 167, 255}, {64, 160, 255, 255}, {255, 160, 32, 255}}; static void hexparse(uchar out[static 4], const char *s) { @@ -89,11 +87,11 @@ static void colourcb(struct con_var *v) { } // Original sig is the following but we wanna avoid calling convention weirdness -//typedef struct con_colour (*UTIL_Portal_Color_func)(int); -typedef void (*UTIL_Portal_Color_func)(struct con_colour *out, int portal); +//typedef struct rgba (*UTIL_Portal_Color_func)(int); +typedef void (*UTIL_Portal_Color_func)(struct rgba *out, int portal); static UTIL_Portal_Color_func orig_UTIL_Portal_Color; -static void hook_UTIL_Portal_Color(struct con_colour *out, int portal) { - if (portal < 0 || portal > 2) *out = (struct con_colour){255, 255, 255, 255}; +static void hook_UTIL_Portal_Color(struct rgba *out, int portal) { + if (portal < 0 || portal > 2) *out = (struct rgba){255, 255, 255, 255}; else *out = colours[portal]; } diff --git a/src/rinput.c b/src/rinput.c index e24fc1c..53c16e3 100644 --- a/src/rinput.c +++ b/src/rinput.c @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Michael Smith + * Copyright © 2023 Michael Smith * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -22,11 +22,11 @@ #include #include "con_.h" -#include "gamedata.h" -#include "hook.h" #include "engineapi.h" #include "errmsg.h" #include "feature.h" +#include "gamedata.h" +#include "hook.h" #include "intdefs.h" #include "mem.h" #include "vcall.h" @@ -149,9 +149,9 @@ INIT { .lpszClassName = L"RInput" }; if (!RegisterClassExW(&wc)) { - struct con_colour gold = {255, 210, 0, 255}; - struct con_colour blue = {45, 190, 190, 255}; - struct con_colour white = {200, 200, 200, 255}; + struct rgba gold = {255, 210, 0, 255}; + struct rgba blue = {45, 190, 190, 255}; + struct rgba white = {200, 200, 200, 255}; con_colourmsg(&gold, "SST PROTIP! "); con_colourmsg(&blue, "It appears you're using RInput.exe.\n" "Consider launching without that and using "); diff --git a/src/sst.c b/src/sst.c index 788a81d..93c194a 100644 --- a/src/sst.c +++ b/src/sst.c @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Michael Smith + * Copyright © 2023 Michael Smith * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -179,8 +179,6 @@ static const void *const *const plugin_obj; static bool already_loaded = false, skip_unload = false; -#define RGBA(r, g, b, a) (&(struct con_colour){(r), (g), (b), (a)}) - // auto-update message. see below in do_featureinit() static const char *updatenotes = "\ * various internal cleanup\n\ @@ -201,8 +199,8 @@ static void do_featureinit(void) { #else unsetenv("SST_UPDATED"); #endif - struct con_colour gold = {255, 210, 0, 255}; - struct con_colour white = {255, 255, 255, 255}; + struct rgba gold = {255, 210, 0, 255}; + struct rgba white = {255, 255, 255, 255}; con_colourmsg(&white, "\n" NAME " was just "); con_colourmsg(&gold, "UPDATED"); con_colourmsg(&white, " to version "); -- cgit v1.2.3