From 7c0172235cbaa44ec51e3f92c301b74ae971fc04 Mon Sep 17 00:00:00 2001 From: Blitz54 Date: Wed, 10 Dec 2025 01:41:11 -0600 Subject: [PATCH] Track draw color for tooltip stuff --- engine/render.h | 1 + engine/render/r_main.cpp | 8 ++++++++ engine/render/r_main.h | 1 + ui_api.cpp | 34 +++++++++++++++++++++++++++++++++- ui_main.h | 2 ++ 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/engine/render.h b/engine/render.h index 7ec2505..0bb3681 100644 --- a/engine/render.h +++ b/engine/render.h @@ -96,6 +96,7 @@ class r_IRenderer { virtual void SetBlendMode(int mode) = 0; virtual void DrawColor(const col4_t col = NULL) = 0; virtual void DrawColor(dword col) = 0; + virtual void GetDrawColor(col4_t color) = 0; virtual void DrawImage(r_shaderHnd_c* hnd, glm::vec2 pos, glm::vec2 extent, glm::vec2 uv1 = { 0, 0 }, glm::vec2 uv2 = { 1, 1 }, int stackLayer = 0, std::optional maskLayer = {}) = 0; virtual void DrawImageQuad(r_shaderHnd_c* hnd, glm::vec2 p0, glm::vec2 p1, glm::vec2 p2, glm::vec2 p3, glm::vec2 uv0 = { 0, 0 }, glm::vec2 uv1 = { 1, 0 }, glm::vec2 uv2 = { 1, 1 }, glm::vec2 uv3 = { 0, 1 }, int stackLayer = 0, std::optional maskLayer = {}) = 0; virtual void DrawString(float x, float y, int align, int height, const col4_t col, int font, const char* str) = 0; diff --git a/engine/render/r_main.cpp b/engine/render/r_main.cpp index 7d22a37..d5f4ef1 100644 --- a/engine/render/r_main.cpp +++ b/engine/render/r_main.cpp @@ -1749,6 +1749,14 @@ void r_renderer_c::DrawColor(dword col) drawColor[3] = (col >> 24) / 255.0f; } +void r_renderer_c::GetDrawColor(col4_t color) +{ + color[0] = drawColor[0]; + color[1] = drawColor[1]; + color[2] = drawColor[2]; + color[3] = drawColor[3]; +} + void r_renderer_c::DrawImage(r_shaderHnd_c* hnd, glm::vec2 pos, glm::vec2 extent, glm::vec2 uv1, glm::vec2 uv2, int stackLayer, std::optional maskLayer) { DrawImageQuad(hnd, diff --git a/engine/render/r_main.h b/engine/render/r_main.h index 366750c..f7072fb 100644 --- a/engine/render/r_main.h +++ b/engine/render/r_main.h @@ -89,6 +89,7 @@ class r_renderer_c: public r_IRenderer, public conCmdHandler_c { void SetBlendMode(int mode); void DrawColor(const col4_t col = NULL); void DrawColor(dword col); + void GetDrawColor(col4_t color); void DrawImage(r_shaderHnd_c* hnd, glm::vec2 pos, glm::vec2 extent, glm::vec2 uv1 = { 0, 0 }, glm::vec2 uv2 = { 1, 1 }, int stackLayer = 0, std::optional maskLayer = {}); void DrawImageQuad(r_shaderHnd_c* hnd, glm::vec2 p0, glm::vec2 p1, glm::vec2 p2, glm::vec2 p3, glm::vec2 uv0 = { 0, 0 }, glm::vec2 uv1 = { 1, 0 }, glm::vec2 uv2 = { 1, 1 }, glm::vec2 uv3 = { 0, 1 }, int stackLayer = 0, std::optional maskLayer = {}); void DrawString(float x, float y, int align, int height, const col4_t col, int font, const char* str); diff --git a/ui_api.cpp b/ui_api.cpp index 887c314..7feebc6 100644 --- a/ui_api.cpp +++ b/ui_api.cpp @@ -851,9 +851,31 @@ static int l_SetDrawColor(lua_State* L) } } ui->renderer->DrawColor(color); + + // Store last applied color from renderer + col4_t finalColor; + ui->renderer->GetDrawColor(finalColor); + ui->lastColor[0] = finalColor[0]; + ui->lastColor[1] = finalColor[1]; + ui->lastColor[2] = finalColor[2]; + ui->lastColor[3] = finalColor[3]; + return 0; } +static int l_GetDrawColor(lua_State* L) +{ + ui_main_c* ui = GetUIPtr(L); + ui->LAssert(L, ui->renderer != NULL, "Renderer is not initialised"); + + lua_pushnumber(L, ui->lastColor[0]); + lua_pushnumber(L, ui->lastColor[1]); + lua_pushnumber(L, ui->lastColor[2]); + lua_pushnumber(L, ui->lastColor[3]); + + return 4; // returning r,g,b,a +} + static int l_DrawImage(lua_State* L) { ui_main_c* ui = GetUIPtr(L); @@ -1068,7 +1090,7 @@ static int l_DrawString(lua_State* L) ui->LAssert(L, lua_isstring(L, 5), "DrawString() argument 5: expected string, got %s", luaL_typename(L, 5)); ui->LAssert(L, lua_isstring(L, 6), "DrawString() argument 6: expected string, got %s", luaL_typename(L, 6)); static const char* alignMap[6] = { "LEFT", "CENTER", "RIGHT", "CENTER_X", "RIGHT_X", NULL }; - static const char* fontMap[8] = { "FIXED", "VAR", "VAR BOLD", "FONTIN SC", "FONTIN SC ITALIC", "FONTIN", "FONTIN ITALIC", NULL}; + static const char* fontMap[8] = { "FIXED", "VAR", "VAR BOLD", "FONTIN SC", "FONTIN SC ITALIC", "FONTIN", "FONTIN ITALIC", NULL }; const float dpiScale = ui->renderer->VirtualScreenScaleFactor(); const float left = lua_tonumber(L, 1) * dpiScale; const float top = lua_tonumber(L, 2) * dpiScale; @@ -1089,6 +1111,15 @@ static int l_DrawString(lua_State* L) luaL_checkoption(L, 5, "FIXED", fontMap), lua_tostring(L, 6) ); + + // Get the final color from the renderer after DrawString processes color codes + col4_t finalColor; + ui->renderer->GetDrawColor(finalColor); + ui->lastColor[0] = finalColor[0]; + ui->lastColor[1] = finalColor[1]; + ui->lastColor[2] = finalColor[2]; + ui->lastColor[3] = finalColor[3]; + return 0; } @@ -2186,6 +2217,7 @@ int ui_main_c::InitAPI(lua_State* L) ADDFUNC(SetViewport); ADDFUNC(SetBlendMode); ADDFUNC(SetDrawColor); + ADDFUNC(GetDrawColor); ADDFUNC(SetDPIScaleOverridePercent); ADDFUNC(GetDPIScaleOverridePercent); ADDFUNC(DrawImage); diff --git a/ui_main.h b/ui_main.h index 87bdb58..02ec907 100644 --- a/ui_main.h +++ b/ui_main.h @@ -52,6 +52,8 @@ class ui_main_c: public ui_IMain { bool hasActiveCoroutine = false; int ioOpenf = LUA_NOREF; + float lastColor[4] = {1.0f, 1.0f, 1.0f, 1.0f}; + static int InitAPI(lua_State* L); void RenderInit(r_featureFlag_e features);