From c469738abfb4729322931fc6f2e2fc6c80721d10 Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Thu, 4 Apr 2024 13:12:53 +0400 Subject: [PATCH 1/8] Reverse-engineered TriAPI functions from hardware engine --- BunnymodXT/modules/HwDLL.hpp | 10 + BunnymodXT/triangle_wrappers.cpp | 397 +++++++++++++++++++++++++++++++ BunnymodXT/triangle_wrappers.hpp | 25 ++ CMakeLists.txt | 2 + 4 files changed, 434 insertions(+) create mode 100644 BunnymodXT/triangle_wrappers.cpp create mode 100644 BunnymodXT/triangle_wrappers.hpp diff --git a/BunnymodXT/modules/HwDLL.hpp b/BunnymodXT/modules/HwDLL.hpp index e759818a..8a657c18 100644 --- a/BunnymodXT/modules/HwDLL.hpp +++ b/BunnymodXT/modules/HwDLL.hpp @@ -370,6 +370,9 @@ class HwDLL : public IHookableNameFilterOrdered int tas_studio_norefresh_override = 0; + float **gWorldToScreen; + float gScreenToWorld[16]; + private: // Make sure to have hl.exe last here, so that it is the lowest priority. HwDLL() : IHookableNameFilterOrdered({ L"hw.dll", L"hw.so", L"sw.dll", L"sw.so", L"hl.exe" }) {}; @@ -390,6 +393,13 @@ class HwDLL : public IHookableNameFilterOrdered typedef void(__cdecl* _Host_Noclip_f) (); _Host_Noclip_f ORIG_Host_Noclip_f; + typedef void(__cdecl* _VGUI2_ResetCurrentTexture) (); + _VGUI2_ResetCurrentTexture ORIG_VGUI2_ResetCurrentTexture; + typedef mspriteframe_t*(__cdecl* _R_GetSpriteFrame) (msprite_t *pSprite, int frame); + _R_GetSpriteFrame ORIG_R_GetSpriteFrame; + typedef void(__cdecl* _GL_Bind) (int texnum); + _GL_Bind ORIG_GL_Bind; + HLStrafe::PlayerData GetPlayerData(); protected: diff --git a/BunnymodXT/triangle_wrappers.cpp b/BunnymodXT/triangle_wrappers.cpp new file mode 100644 index 00000000..c9658aeb --- /dev/null +++ b/BunnymodXT/triangle_wrappers.cpp @@ -0,0 +1,397 @@ +/* + This is reverse-engineered TriAPI functions from the 'hardware' engine. + Despite the fact that the full Linux 'software' engine is available starting with the 25th anniversary update, + there is no point in reversing from it the TriAPI functions, because it is much harder to support + and most peoples play on the 'hardware' engine in fact. +*/ + +#include "triangle_wrappers.hpp" + +namespace TriangleWrappers +{ + auto &hw = HwDLL::GetInstance(); + auto &cl = ClientDLL::GetInstance(); + + static int gRenderMode; + static float gGlR, gGlG, gGlB, gGlW; + + void RenderMode(int mode) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->RenderMode(mode); + } + else + { + switch (mode) + { + case kRenderNormal: + glDisable(GL_BLEND); + glDepthMask(GL_TRUE); + glShadeModel(GL_FLAT); + gRenderMode = mode; + break; + case kRenderTransColor: + case kRenderTransTexture: + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glShadeModel(GL_SMOOTH); + gRenderMode = mode; + break; + case kRenderTransAlpha: + glEnable(GL_BLEND); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glShadeModel(GL_SMOOTH); + glDepthMask(GL_FALSE); + gRenderMode = mode; + break; + case kRenderTransAdd: + glBlendFunc(GL_ONE, GL_ONE); + glEnable(GL_BLEND); + glDepthMask(GL_FALSE); + glShadeModel(GL_SMOOTH); + gRenderMode = mode; + break; + default: + gRenderMode = mode; + break; + } + } + } + + void Begin(int primitiveCode) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->Begin(primitiveCode); + } + else + { + if (hw.ORIG_VGUI2_ResetCurrentTexture) + hw.ORIG_VGUI2_ResetCurrentTexture(); + int g_GL_Modes[7] = {4, 6, 7, 9, 1, 5, 8}; // GL_TRIANGLES, GL_TRIANGLE_FAN, GL_QUADS, GL_POLYGON, GL_LINES, GL_TRIANGLE_STRIP, GL_QUAD_STRIP + glBegin(g_GL_Modes[primitiveCode]); + } + } + + void End() + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->End(); + } + else + { + glEnd(); + } + } + + void Color4f(float x, float y, float z, float w) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->Color4f(x, y, z, w); + } + else + { + if (gRenderMode == kRenderTransAlpha) + { + glColor4ub(x * 255.9, y * 255.9, z * 255.9, w * 255.0); + } + else + { + glColor4f(x * w, y * w, z * w, 1.0f); + } + gGlR = x; + gGlG = y; + gGlB = z; + gGlW = w; + } + } + + void Color4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->Color4ub(r, g, b, a); + } + else + { + gGlR = r * (1.0f / 255.0f); + gGlG = g * (1.0f / 255.0f); + gGlB = b * (1.0f / 255.0f); + gGlW = a * (1.0f / 255.0f); + glColor4f(gGlR, gGlG, gGlB, 1.0f); + } + } + + void TexCoord2f(float u, float v) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->TexCoord2f(u, v); + } + else + { + glTexCoord2f(u, v); + } + } + + void Vertex3fv(float *worldPnt) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->Vertex3fv(worldPnt); + } + else + { + glVertex3fv(worldPnt); + } + } + + void Vertex3f(float x, float y, float z) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->Vertex3f(x, y, z); + } + else + { + glVertex3f(x, y, z); + } + } + + void Brightness(float x) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->Brightness(x); + } + else + { + glColor4f(gGlR * x * gGlW, gGlG * x * gGlW, gGlB * x * gGlW, 1.0f); + } + } + + void CullFace(TRICULLSTYLE style) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->CullFace(style); + } + else + { + if (style == TRI_FRONT) + { + glEnable(GL_CULL_FACE); + glCullFace(GL_FRONT); + } + else if (style == TRI_NONE) + { + glDisable(GL_CULL_FACE); + } + } + } + + int SpriteTexture(struct model_s *pSpriteModel, int frame) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + return cl.pEngfuncs->pTriAPI->SpriteTexture(pSpriteModel, frame); + } + else if (hw.ORIG_R_GetSpriteFrame && hw.ORIG_GL_Bind) + { + if (hw.ORIG_VGUI2_ResetCurrentTexture) + hw.ORIG_VGUI2_ResetCurrentTexture(); + mspriteframe_t *spriteframe = hw.ORIG_R_GetSpriteFrame((msprite_t*)pSpriteModel->cache.data, frame); + + if (spriteframe) + { + hw.ORIG_GL_Bind(spriteframe->gl_texturenum); + return 1; + } + } + + return 0; + } + + int WorldToScreen(vec_t *point, vec_t *screen) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + return cl.pEngfuncs->pTriAPI->WorldToScreen(point, screen); + } + else if (hw.gWorldToScreen) + { + float x = hw.gWorldToScreen[0] * point[0] + hw.gWorldToScreen[4] * point[1] + hw.gWorldToScreen[8] * point[2] + hw.gWorldToScreen[12]; + float y = hw.gWorldToScreen[1] * point[0] + hw.gWorldToScreen[5] * point[1] + hw.gWorldToScreen[9] * point[2] + hw.gWorldToScreen[13]; + float w = hw.gWorldToScreen[3] * point[0] + hw.gWorldToScreen[7] * point[1] + hw.gWorldToScreen[11] * point[2] + hw.gWorldToScreen[15]; + + float invw = 0.0f; + if (w != 0.0f) + { + invw = 1.0f / w; + screen[0] = x * invw; + screen[1] = y * invw; + } + + return invw <= 0.0f; + } + + return 0; + } + + void ScreenToWorld(vec_t *screen, vec_t *point) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->ScreenToWorld(screen, point); + } + else if (hw.gScreenToWorld) + { + float x = hw.gScreenToWorld[0] * screen[0] + hw.gScreenToWorld[4] * screen[1] + hw.gScreenToWorld[8] * screen[2] + hw.gScreenToWorld[12]; + float y = hw.gScreenToWorld[1] * screen[0] + hw.gScreenToWorld[5] * screen[1] + hw.gScreenToWorld[9] * screen[2] + hw.gScreenToWorld[13]; + float z = hw.gScreenToWorld[2] * screen[0] + hw.gScreenToWorld[6] * screen[1] + hw.gScreenToWorld[10] * screen[2] + hw.gScreenToWorld[14]; + float w = hw.gScreenToWorld[3] * screen[0] + hw.gScreenToWorld[7] * screen[1] + hw.gScreenToWorld[11] * screen[2] + hw.gScreenToWorld[15]; + + if (w != 0.0f) + { + float invw = 1.0f / w; + point[0] = x * invw; + point[1] = y * invw; + point[2] = z * invw; + } + } + } + + void GetMatrix(const int pname, float *matrix) + { + if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + { + cl.pEngfuncs->pTriAPI->GetMatrix(pname, matrix); + } + else + { + glGetFloatv(pname, matrix); + } + } + + // https://gitlab.freedesktop.org/mesa/mesa/-/blob/b3aefd1cfb6aacd1695c52911dd39da50d893ece/src/mesa/math/m_matrix.c#L358 + // This function is copied from the Mesa repository, but the code is apparently no different from what the GoldSrc engine uses + int InvertMatrix(const float *m, float *out) + { + #define SWAP_ROWS(a, b) { float *_tmp = a; (a)=(b); (b)=_tmp; } + #define MAT(m,r,c) (m)[(c)*4+(r)] + + float wtmp[4][8]; + float m0, m1, m2, m3, s; + float *r0, *r1, *r2, *r3; + + r0 = wtmp[0], r1 = wtmp[1], r2 = wtmp[2], r3 = wtmp[3]; + + r0[0] = MAT(m,0,0), r0[1] = MAT(m,0,1), + r0[2] = MAT(m,0,2), r0[3] = MAT(m,0,3), + r0[4] = 1.0, r0[5] = r0[6] = r0[7] = 0.0, + + r1[0] = MAT(m,1,0), r1[1] = MAT(m,1,1), + r1[2] = MAT(m,1,2), r1[3] = MAT(m,1,3), + r1[5] = 1.0, r1[4] = r1[6] = r1[7] = 0.0, + + r2[0] = MAT(m,2,0), r2[1] = MAT(m,2,1), + r2[2] = MAT(m,2,2), r2[3] = MAT(m,2,3), + r2[6] = 1.0, r2[4] = r2[5] = r2[7] = 0.0, + + r3[0] = MAT(m,3,0), r3[1] = MAT(m,3,1), + r3[2] = MAT(m,3,2), r3[3] = MAT(m,3,3), + r3[7] = 1.0, r3[4] = r3[5] = r3[6] = 0.0; + + /* choose pivot - or die */ + if (fabs(r3[0])>fabs(r2[0])) SWAP_ROWS(r3, r2); + if (fabs(r2[0])>fabs(r1[0])) SWAP_ROWS(r2, r1); + if (fabs(r1[0])>fabs(r0[0])) SWAP_ROWS(r1, r0); + if (0.0 == r0[0]) return 0; + + /* eliminate first variable */ + m1 = r1[0]/r0[0]; m2 = r2[0]/r0[0]; m3 = r3[0]/r0[0]; + s = r0[1]; r1[1] -= m1 * s; r2[1] -= m2 * s; r3[1] -= m3 * s; + s = r0[2]; r1[2] -= m1 * s; r2[2] -= m2 * s; r3[2] -= m3 * s; + s = r0[3]; r1[3] -= m1 * s; r2[3] -= m2 * s; r3[3] -= m3 * s; + s = r0[4]; + if (s != 0.0) { r1[4] -= m1 * s; r2[4] -= m2 * s; r3[4] -= m3 * s; } + s = r0[5]; + if (s != 0.0) { r1[5] -= m1 * s; r2[5] -= m2 * s; r3[5] -= m3 * s; } + s = r0[6]; + if (s != 0.0) { r1[6] -= m1 * s; r2[6] -= m2 * s; r3[6] -= m3 * s; } + s = r0[7]; + if (s != 0.0) { r1[7] -= m1 * s; r2[7] -= m2 * s; r3[7] -= m3 * s; } + + /* choose pivot - or die */ + if (fabs(r3[1])>fabs(r2[1])) SWAP_ROWS(r3, r2); + if (fabs(r2[1])>fabs(r1[1])) SWAP_ROWS(r2, r1); + if (0.0 == r1[1]) return 0; + + /* eliminate second variable */ + m2 = r2[1]/r1[1]; m3 = r3[1]/r1[1]; + r2[2] -= m2 * r1[2]; r3[2] -= m3 * r1[2]; + r2[3] -= m2 * r1[3]; r3[3] -= m3 * r1[3]; + s = r1[4]; if (0.0 != s) { r2[4] -= m2 * s; r3[4] -= m3 * s; } + s = r1[5]; if (0.0 != s) { r2[5] -= m2 * s; r3[5] -= m3 * s; } + s = r1[6]; if (0.0 != s) { r2[6] -= m2 * s; r3[6] -= m3 * s; } + s = r1[7]; if (0.0 != s) { r2[7] -= m2 * s; r3[7] -= m3 * s; } + + /* choose pivot - or die */ + if (fabs(r3[2])>fabs(r2[2])) SWAP_ROWS(r3, r2); + if (0.0 == r2[2]) return 0; + + /* eliminate third variable */ + m3 = r3[2]/r2[2]; + r3[3] -= m3 * r2[3], r3[4] -= m3 * r2[4], + r3[5] -= m3 * r2[5], r3[6] -= m3 * r2[6], + r3[7] -= m3 * r2[7]; + + /* last check */ + if (0.0 == r3[3]) return 0; + + s = 1.0/r3[3]; /* now back substitute row 3 */ + r3[4] *= s; r3[5] *= s; r3[6] *= s; r3[7] *= s; + + m2 = r2[3]; /* now back substitute row 2 */ + s = 1.0/r2[2]; + r2[4] = s * (r2[4] - r3[4] * m2), r2[5] = s * (r2[5] - r3[5] * m2), + r2[6] = s * (r2[6] - r3[6] * m2), r2[7] = s * (r2[7] - r3[7] * m2); + m1 = r1[3]; + r1[4] -= r3[4] * m1, r1[5] -= r3[5] * m1, + r1[6] -= r3[6] * m1, r1[7] -= r3[7] * m1; + m0 = r0[3]; + r0[4] -= r3[4] * m0, r0[5] -= r3[5] * m0, + r0[6] -= r3[6] * m0, r0[7] -= r3[7] * m0; + + m1 = r1[2]; /* now back substitute row 1 */ + s = 1.0/r1[1]; + r1[4] = s * (r1[4] - r2[4] * m1), r1[5] = s * (r1[5] - r2[5] * m1), + r1[6] = s * (r1[6] - r2[6] * m1), r1[7] = s * (r1[7] - r2[7] * m1); + m0 = r0[2]; + r0[4] -= r2[4] * m0, r0[5] -= r2[5] * m0, + r0[6] -= r2[6] * m0, r0[7] -= r2[7] * m0; + + m0 = r0[1]; /* now back substitute row 0 */ + s = 1.0/r0[0]; + r0[4] = s * (r0[4] - r1[4] * m0), r0[5] = s * (r0[5] - r1[5] * m0), + r0[6] = s * (r0[6] - r1[6] * m0), r0[7] = s * (r0[7] - r1[7] * m0); + + MAT(out,0,0) = r0[4]; MAT(out,0,1) = r0[5], + MAT(out,0,2) = r0[6]; MAT(out,0,3) = r0[7], + MAT(out,1,0) = r1[4]; MAT(out,1,1) = r1[5], + MAT(out,1,2) = r1[6]; MAT(out,1,3) = r1[7], + MAT(out,2,0) = r2[4]; MAT(out,2,1) = r2[5], + MAT(out,2,2) = r2[6]; MAT(out,2,3) = r2[7], + MAT(out,3,0) = r3[4]; MAT(out,3,1) = r3[5], + MAT(out,3,2) = r3[6]; MAT(out,3,3) = r3[7]; + + return 1; + + #undef MAT + #undef SWAP_ROWS + } +}; \ No newline at end of file diff --git a/BunnymodXT/triangle_wrappers.hpp b/BunnymodXT/triangle_wrappers.hpp new file mode 100644 index 00000000..77a0643e --- /dev/null +++ b/BunnymodXT/triangle_wrappers.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include "stdafx.hpp" +#include "modules.hpp" +#include + +namespace TriangleWrappers +{ + void RenderMode(int mode); // tri_GL_RenderMode + void Begin(int primitiveCode); // tri_GL_Begin + void End(); // tri_GL_End + void Color4f(float x, float y, float z, float w); // tri_GL_Color4f + void Color4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // tri_GL_Color4ub + void TexCoord2f(float u, float v); // tri_GL_TexCoord2f + void Vertex3fv(float *worldPnt); // tri_GL_Vertex3fv + void Vertex3f(float x, float y, float z); // tri_GL_Vertex3f + void Brightness(float x); // tri_GL_Brightness + void CullFace(TRICULLSTYLE style); // tri_GL_CullFace + int SpriteTexture(struct model_s *pSpriteModel, int frame); // R_TriangleSpriteTexture + int WorldToScreen(vec_t *point, vec_t *screen); // tri_ScreenTransform + void ScreenToWorld(vec_t *screen, vec_t *point); // tri_WorldTransform + void GetMatrix(const int pname, float *matrix); // tri_GetMatrix + + int InvertMatrix(const float *m, float *out); // InvertMatrix +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index ae131e00..fbd453a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,6 +174,7 @@ set (HEADER_FILES BunnymodXT/stdafx.hpp BunnymodXT/triangle_drawing.hpp BunnymodXT/triangle_utils.hpp + BunnymodXT/triangle_wrappers.cpp BunnymodXT/opengl_utils.hpp BunnymodXT/TEA.hpp BunnymodXT/runtime_data.hpp @@ -201,6 +202,7 @@ set (SOURCE_FILES BunnymodXT/hud_custom.cpp BunnymodXT/triangle_drawing.cpp BunnymodXT/triangle_utils.cpp + BunnymodXT/triangle_wrappers.cpp BunnymodXT/opengl_utils.cpp BunnymodXT/TEA.cpp BunnymodXT/runtime_data.cpp From b4d850e571d655a7b010276ddd1099b7dc350ad1 Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Thu, 4 Apr 2024 13:46:25 +0400 Subject: [PATCH 2/8] Replaced TriAPI interface calls with wrappers --- BunnymodXT/modules/ClientDLL.cpp | 15 +- BunnymodXT/modules/HwDLL.cpp | 7 +- BunnymodXT/triangle_drawing.cpp | 296 +++++++++++++++---------------- BunnymodXT/triangle_utils.cpp | 239 ++++++++++++------------- BunnymodXT/triangle_utils.hpp | 12 +- 5 files changed, 285 insertions(+), 284 deletions(-) diff --git a/BunnymodXT/modules/ClientDLL.cpp b/BunnymodXT/modules/ClientDLL.cpp index 4d33a99a..1b02af24 100644 --- a/BunnymodXT/modules/ClientDLL.cpp +++ b/BunnymodXT/modules/ClientDLL.cpp @@ -11,6 +11,7 @@ #include "../hud_custom.hpp" #include "../triangle_drawing.hpp" #include "../discord_integration.hpp" +#include "../triangle_wrappers.hpp" #include // Linux hooks. @@ -1704,7 +1705,7 @@ HOOK_DEF_0(ClientDLL, void, __cdecl, HUD_DrawTransparentTriangles) glEnable(GL_TEXTURE_2D); // This is required for the WON DLLs. - pEngfuncs->pTriAPI->RenderMode(kRenderNormal); + TriangleWrappers::RenderMode(kRenderNormal); } } @@ -1983,10 +1984,10 @@ HOOK_DEF_1(ClientDLL, void, __fastcall, CStudioModelRenderer__StudioRenderModel, if (pEngfuncs) { if (pCurrentEntity == pEngfuncs->GetViewModel()) { if (CVars::bxt_viewmodel_semitransparent.GetBool()) { - pEngfuncs->pTriAPI->RenderMode(kRenderTransAdd); - pEngfuncs->pTriAPI->Brightness(2); + TriangleWrappers::RenderMode(kRenderTransAdd); + TriangleWrappers::Brightness(2); } else { - pEngfuncs->pTriAPI->RenderMode(old_rendermode); + TriangleWrappers::RenderMode(old_rendermode); } } } @@ -2009,10 +2010,10 @@ HOOK_DEF_1(ClientDLL, void, __cdecl, CStudioModelRenderer__StudioRenderModel_Lin if (pEngfuncs) { if (pCurrentEntity == pEngfuncs->GetViewModel()) { if (CVars::bxt_viewmodel_semitransparent.GetBool()) { - pEngfuncs->pTriAPI->RenderMode(kRenderTransAdd); - pEngfuncs->pTriAPI->Brightness(2); + TriangleWrappers::RenderMode(kRenderTransAdd); + TriangleWrappers::Brightness(2); } else { - pEngfuncs->pTriAPI->RenderMode(old_rendermode); + TriangleWrappers::RenderMode(old_rendermode); } } } diff --git a/BunnymodXT/modules/HwDLL.cpp b/BunnymodXT/modules/HwDLL.cpp index 55d0377a..7f43da7a 100644 --- a/BunnymodXT/modules/HwDLL.cpp +++ b/BunnymodXT/modules/HwDLL.cpp @@ -23,6 +23,7 @@ #include "../custom_triggers.hpp" #include "../simulation_ipc.hpp" #include "../splits.hpp" +#include "../triangle_wrappers.hpp" #include "../helper_functions.hpp" using namespace std::literals; @@ -8136,10 +8137,10 @@ HOOK_DEF_0(HwDLL, void, __cdecl, R_StudioRenderModel) if (cl.pEngfuncs) { if (currententity == cl.pEngfuncs->GetViewModel()) { if (CVars::bxt_viewmodel_semitransparent.GetBool()) { - cl.pEngfuncs->pTriAPI->RenderMode(kRenderTransAdd); - cl.pEngfuncs->pTriAPI->Brightness(2); + TriangleWrappers::RenderMode(kRenderTransAdd); + TriangleWrappers::Brightness(2); } else { - cl.pEngfuncs->pTriAPI->RenderMode(old_rendermode); } + TriangleWrappers::RenderMode(old_rendermode); } } } } diff --git a/BunnymodXT/triangle_drawing.cpp b/BunnymodXT/triangle_drawing.cpp index 0a4c8de1..ad0aef27 100644 --- a/BunnymodXT/triangle_drawing.cpp +++ b/BunnymodXT/triangle_drawing.cpp @@ -5,6 +5,7 @@ #include "triangle_drawing.hpp" #include "triangle_utils.hpp" +#include "triangle_wrappers.hpp" #include "modules.hpp" #include "hud_custom.hpp" @@ -13,29 +14,29 @@ namespace TriangleDrawing { static HSPRITE_HL white_sprite = 0; - static void DrawNodes(triangleapi_s *pTriAPI) + static void DrawNodes() { if (!CVars::bxt_show_nodes.GetBool()) return; - pTriAPI->RenderMode(kRenderTransAdd); - pTriAPI->CullFace(TRI_NONE); - pTriAPI->Color4f(0.722f, 0.0f, 0.341f, 1.0f); + TriangleWrappers::RenderMode(kRenderTransAdd); + TriangleWrappers::CullFace(TRI_NONE); + TriangleWrappers::Color4f(0.722f, 0.0f, 0.341f, 1.0f); for (const Vector *position : ServerDLL::GetInstance().GetNodePositions()) { - TriangleUtils::DrawPyramid(pTriAPI, *position, 10, 30); + TriangleUtils::DrawPyramid(*position, 10, 30); } } - static void DrawDisplacerTargets(triangleapi_s* pTriAPI) + static void DrawDisplacerTargets() { if (!CVars::bxt_show_displacer_earth_targets.GetBool()) return; - pTriAPI->RenderMode(kRenderTransAdd); - pTriAPI->CullFace(TRI_NONE); - pTriAPI->Color4f(0.0f, 0.627f, 0.0f, 1.0f); + TriangleWrappers::RenderMode(kRenderTransAdd); + TriangleWrappers::CullFace(TRI_NONE); + TriangleWrappers::Color4f(0.0f, 0.627f, 0.0f, 1.0f); for (const Vector* position : ServerDLL::GetInstance().GetDisplacerTargets()) { - TriangleUtils::DrawPyramid(pTriAPI, *position, 5, 15); + TriangleUtils::DrawPyramid(*position, 5, 15); } } @@ -68,7 +69,7 @@ namespace TriangleDrawing return sourceVector.Normalize(); } - static void DrawUseableEntities(triangleapi_s *pTriAPI) + static void DrawUseableEntities() { if (!CVars::bxt_hud_useables.GetBool()) return; @@ -90,8 +91,8 @@ namespace TriangleDrawing float max_dot = VIEW_FIELD_NARROW; const edict_t* target_object = nullptr; - pTriAPI->RenderMode(kRenderTransColor); - pTriAPI->CullFace(TRI_NONE); + TriangleWrappers::RenderMode(kRenderTransColor); + TriangleWrappers::CullFace(TRI_NONE); const auto useable_entities = ServerDLL::GetInstance().GetUseableEntities(playerOrigin, searchRadius); for (const auto pent : useable_entities) { @@ -105,7 +106,7 @@ namespace TriangleDrawing } } - pTriAPI->Color4f(1.0f, 0.0f, 0.0f, 1.0f); + TriangleWrappers::Color4f(1.0f, 0.0f, 0.0f, 1.0f); for (const auto pent : useable_entities) { if (pent == target_object) @@ -117,10 +118,9 @@ namespace TriangleDrawing // Prevent drawing entities that are behind us. WorldToScreen doesn't prevent this automatically. if (DotProduct(forward, disp) > 0.0f) { Vector screen_point; - pTriAPI->WorldToScreen(bmodelOrigin, screen_point); + TriangleWrappers::WorldToScreen(bmodelOrigin, screen_point); TriangleUtils::DrawScreenRectangle( - pTriAPI, screen_point.Make2D() - half_size, screen_point.Make2D() + half_size ); @@ -130,7 +130,7 @@ namespace TriangleDrawing // Make sure the target object is drawn on top. if (target_object) { - pTriAPI->Color4f(0.0f, 1.0f, 0.0f, 1.0f); + TriangleWrappers::Color4f(0.0f, 1.0f, 0.0f, 1.0f); auto bmodelOrigin = target_object->v.absmin + 0.5 * target_object->v.size; const auto disp = bmodelOrigin - playerOrigin - player->v.view_ofs; @@ -138,10 +138,9 @@ namespace TriangleDrawing // Prevent drawing entities that are behind us. WorldToScreen doesn't prevent this automatically. if (DotProduct(forward, disp) > 0.0f) { Vector screen_point; - pTriAPI->WorldToScreen(bmodelOrigin, screen_point); + TriangleWrappers::WorldToScreen(bmodelOrigin, screen_point); TriangleUtils::DrawScreenRectangle( - pTriAPI, screen_point.Make2D() - half_size, screen_point.Make2D() + half_size ); @@ -160,13 +159,13 @@ namespace TriangleDrawing return s; } - static void DrawTriggers(triangleapi_s *pTriAPI) + static void DrawTriggers() { if (!CVars::bxt_show_triggers.GetBool()) return; - pTriAPI->RenderMode(kRenderTransAdd); - pTriAPI->CullFace(TRI_NONE); + TriangleWrappers::RenderMode(kRenderTransAdd); + TriangleWrappers::CullFace(TRI_NONE); const float svTime = static_cast(HwDLL::GetInstance().GetTime()); edict_t *edicts; @@ -202,26 +201,26 @@ namespace TriangleDrawing if (active) a = GetPulsatingAlpha(a, svTime + offset); - pTriAPI->Color4f(r, g, b, a); - pTriAPI->Begin(TRI_POLYGON); + TriangleWrappers::Color4f(r, g, b, a); + TriangleWrappers::Begin(TRI_POLYGON); for (int j = 0; j < surfs[i].polys->numverts; ++j) - pTriAPI->Vertex3fv(surfs[i].polys->verts[j]); - pTriAPI->End(); + TriangleWrappers::Vertex3fv(surfs[i].polys->verts[j]); + TriangleWrappers::End(); } } } - static void DrawCustomTriggers(triangleapi_s *pTriAPI) + static void DrawCustomTriggers() { if (!CVars::bxt_show_custom_triggers.GetBool()) return; - pTriAPI->CullFace(TRI_NONE); + TriangleWrappers::CullFace(TRI_NONE); for (const auto& trigger : CustomTriggers::triggers) { auto corner_positions = trigger.get_corner_positions(); - pTriAPI->RenderMode(kRenderTransAdd); + TriangleWrappers::RenderMode(kRenderTransAdd); if (!CVars::bxt_triggers_color.IsEmpty()) { unsigned r = 0, g = 0, b = 0, a = 0; @@ -234,20 +233,20 @@ namespace TriangleDrawing triggerColor[2] = b / 255.0f; triggerColor[3] = a / 255.0f; - pTriAPI->Color4f(triggerColor[0], triggerColor[1], triggerColor[2], triggerColor[3]); + TriangleWrappers::Color4f(triggerColor[0], triggerColor[1], triggerColor[2], triggerColor[3]); } else { - pTriAPI->Color4f(1.0f, 0.5f, 0.0f, 0.3f); + TriangleWrappers::Color4f(1.0f, 0.5f, 0.0f, 0.3f); } - TriangleUtils::DrawAACuboid(pTriAPI, corner_positions.first, corner_positions.second); + TriangleUtils::DrawAACuboid(corner_positions.first, corner_positions.second); - pTriAPI->RenderMode(kRenderTransColor); - pTriAPI->Color4f(0.5f, 0.3f, 0.0f, 1.0f); - TriangleUtils::DrawAACuboidWireframe(pTriAPI, corner_positions.first, corner_positions.second); + TriangleWrappers::RenderMode(kRenderTransColor); + TriangleWrappers::Color4f(0.5f, 0.3f, 0.0f, 1.0f); + TriangleUtils::DrawAACuboidWireframe(corner_positions.first, corner_positions.second); } } - static void DrawAbsMinMax(triangleapi_s *pTriAPI) + static void DrawAbsMinMax() { static const std::vector PICKABLE_PREFIX{ "item_", @@ -259,7 +258,7 @@ namespace TriangleDrawing if (!CVars::bxt_show_pickup_bbox.GetBool()) return; - pTriAPI->CullFace(TRI_NONE); + TriangleWrappers::CullFace(TRI_NONE); const auto& hw = HwDLL::GetInstance(); const auto& server = ServerDLL::GetInstance(); @@ -289,40 +288,40 @@ namespace TriangleDrawing continue; } - pTriAPI->RenderMode(kRenderTransAdd); - pTriAPI->Color4f(1.0f, 0.6f, 0.0f, 0.3f); - TriangleUtils::DrawAACuboid(pTriAPI, ent->v.absmin, ent->v.absmax); + TriangleWrappers::RenderMode(kRenderTransAdd); + TriangleWrappers::Color4f(1.0f, 0.6f, 0.0f, 0.3f); + TriangleUtils::DrawAACuboid(ent->v.absmin, ent->v.absmax); } } - static void DrawPlayerAbsMinMax(triangleapi_s *pTriAPI) + static void DrawPlayerAbsMinMax() { if (!CVars::bxt_show_player_bbox.GetBool()) return; - pTriAPI->CullFace(TRI_NONE); + TriangleWrappers::CullFace(TRI_NONE); const auto& hw = HwDLL::GetInstance(); if (hw.sv_player) { - pTriAPI->RenderMode(kRenderTransColor); - pTriAPI->Color4f(0.0f, 1.0f, 0.0f, 1.0f); - TriangleUtils::DrawAACuboidWireframe(pTriAPI, (*hw.sv_player)->v.absmin, (*hw.sv_player)->v.absmax); + TriangleWrappers::RenderMode(kRenderTransColor); + TriangleWrappers::Color4f(0.0f, 1.0f, 0.0f, 1.0f); + TriangleUtils::DrawAACuboidWireframe((*hw.sv_player)->v.absmin, (*hw.sv_player)->v.absmax); if (CVars::bxt_show_player_bbox.GetInt() == 2) { - pTriAPI->RenderMode(kRenderTransAdd); - pTriAPI->Color4f(0.0f, 1.0f, 0.0f, 0.1f); - TriangleUtils::DrawAACuboid(pTriAPI, (*hw.sv_player)->v.absmin, (*hw.sv_player)->v.absmax); + TriangleWrappers::RenderMode(kRenderTransAdd); + TriangleWrappers::Color4f(0.0f, 1.0f, 0.0f, 0.1f); + TriangleUtils::DrawAACuboid((*hw.sv_player)->v.absmin, (*hw.sv_player)->v.absmax); } } } - static void DrawMonsterAbsMinMax(triangleapi_s *pTriAPI) + static void DrawMonsterAbsMinMax() { if (!CVars::bxt_show_monster_bbox.GetBool()) return; - pTriAPI->CullFace(TRI_NONE); + TriangleWrappers::CullFace(TRI_NONE); const auto& hw = HwDLL::GetInstance(); const auto& server = ServerDLL::GetInstance(); @@ -341,19 +340,19 @@ namespace TriangleDrawing if (ent->v.flags & FL_MONSTER) { - pTriAPI->RenderMode(kRenderTransColor); - pTriAPI->Color4f(1.0f, 0.75f, 0.8f, 1.0f); - TriangleUtils::DrawAACuboidWireframe(pTriAPI, ent->v.absmin, ent->v.absmax); + TriangleWrappers::RenderMode(kRenderTransColor); + TriangleWrappers::Color4f(1.0f, 0.75f, 0.8f, 1.0f); + TriangleUtils::DrawAACuboidWireframe(ent->v.absmin, ent->v.absmax); if (CVars::bxt_show_monster_bbox.GetInt() == 2) { - pTriAPI->RenderMode(kRenderTransAdd); - pTriAPI->Color4f(1.0f, 0.75f, 0.8f, 0.1f); - TriangleUtils::DrawAACuboid(pTriAPI, ent->v.absmin, ent->v.absmax); + TriangleWrappers::RenderMode(kRenderTransAdd); + TriangleWrappers::Color4f(1.0f, 0.75f, 0.8f, 0.1f); + TriangleUtils::DrawAACuboid(ent->v.absmin, ent->v.absmax); } } } } - static void DrawBullets(triangleapi_s* pTriAPI, const std::deque>& points_vec, const std::deque& hit_vec, byte r, byte g, byte b) + static void DrawBullets(const std::deque>& points_vec, const std::deque& hit_vec, byte r, byte g, byte b) { byte rEnd = 255 - r, gEnd = 255 - g, bEnd = 255 - b; @@ -383,14 +382,14 @@ namespace TriangleDrawing half = points[0] + diffFirstHalf; } - pTriAPI->Color4f(r_float, g_float, b_float, hitAlpha); - TriangleUtils::DrawLine(pTriAPI, points[0], half); - pTriAPI->Color4f(rEnd_float, gEnd_float, bEnd_float, hitAlpha); - TriangleUtils::DrawLine(pTriAPI, half, points[1]); + TriangleWrappers::Color4f(r_float, g_float, b_float, hitAlpha); + TriangleUtils::DrawLine(points[0], half); + TriangleWrappers::Color4f(rEnd_float, gEnd_float, bEnd_float, hitAlpha); + TriangleUtils::DrawLine(half, points[1]); } } - static void DrawBulletsEnemyTrace(triangleapi_s* pTriAPI) + static void DrawBulletsEnemyTrace() { if (!CVars::bxt_show_bullets_enemy.GetBool()) return; @@ -398,10 +397,10 @@ namespace TriangleDrawing const auto points_vec = ServerDLL::GetInstance().GetBulletsEnemyTrace(); const auto hit_vec = ServerDLL::GetInstance().GetBulletsEnemyTraceHit(); - DrawBullets(pTriAPI, points_vec, hit_vec, 255, 0, 144); + DrawBullets(points_vec, hit_vec, 255, 0, 144); } - static void DrawBulletsPlayerTrace(triangleapi_s* pTriAPI) + static void DrawBulletsPlayerTrace() { if (!CVars::bxt_show_bullets.GetBool()) return; @@ -409,15 +408,15 @@ namespace TriangleDrawing const auto points_vec = ServerDLL::GetInstance().GetBulletsPlayerTrace(); const auto hit_vec = ServerDLL::GetInstance().GetBulletsPlayerTraceHit(); - DrawBullets(pTriAPI, points_vec, hit_vec, 0, 200, 255); + DrawBullets(points_vec, hit_vec, 0, 200, 255); } - static void DrawSplits(triangleapi_s *pTriAPI) + static void DrawSplits() { if (!CVars::bxt_show_splits.GetBool()) return; - pTriAPI->CullFace(TRI_NONE); + TriangleWrappers::CullFace(TRI_NONE); for (const auto& split : Splits::splits) { if (!split.map_name.empty() && split.map_name != HwDLL::GetInstance().lastLoadedMap) @@ -428,7 +427,7 @@ namespace TriangleDrawing auto corner_positions = split.get_corner_positions(); - pTriAPI->RenderMode(kRenderTransAdd); + TriangleWrappers::RenderMode(kRenderTransAdd); if (!CVars::bxt_splits_color.IsEmpty()) { unsigned r = 0, g = 0, b = 0, a = 0; @@ -441,16 +440,16 @@ namespace TriangleDrawing triggerColor[2] = b / 255.0f; triggerColor[3] = a / 255.0f; - pTriAPI->Color4f(triggerColor[0], triggerColor[1], triggerColor[2], triggerColor[3]); + TriangleWrappers::Color4f(triggerColor[0], triggerColor[1], triggerColor[2], triggerColor[3]); } else { - pTriAPI->Color4f(0.8f, 0.6f, 0.3f, 0.3f); + TriangleWrappers::Color4f(0.8f, 0.6f, 0.3f, 0.3f); } - TriangleUtils::DrawAACuboid(pTriAPI, corner_positions.first, corner_positions.second); + TriangleUtils::DrawAACuboid(corner_positions.first, corner_positions.second); - pTriAPI->RenderMode(kRenderTransColor); - pTriAPI->Color4f(0.5f, 0.3f, 0.0f, 1.0f); - TriangleUtils::DrawAACuboidWireframe(pTriAPI, corner_positions.first, corner_positions.second); + TriangleWrappers::RenderMode(kRenderTransColor); + TriangleWrappers::Color4f(0.5f, 0.3f, 0.0f, 1.0f); + TriangleUtils::DrawAACuboidWireframe(corner_positions.first, corner_positions.second); } } @@ -504,7 +503,7 @@ namespace TriangleDrawing size_t other_frame; }; - static void DrawTASEditor(triangleapi_s *pTriAPI) + static void DrawTASEditor() { using HLStrafe::HullType; using HLTAS::StrafeDir; @@ -712,7 +711,7 @@ namespace TriangleDrawing if (DotProduct(forward, disp) > 0) { Vector origin_ = origin; Vector screen_point; - pTriAPI->WorldToScreen(origin_, screen_point); + TriangleWrappers::WorldToScreen(origin_, screen_point); auto screen_point_px = stw_to_pixels(screen_point.Make2D()); auto dist = (screen_point_px - mouse).Length(); @@ -738,19 +737,19 @@ namespace TriangleDrawing if (frame >= input.first_predicted_frame && input.received_data_from_second_game) brightness = 0.2f; - pTriAPI->Color4f(brightness, brightness, 1, 1); + TriangleWrappers::Color4f(brightness, brightness, 1, 1); if (smoothing_region_it != large_enough_same_yaw_regions.cend()) { if (frame >= smoothing_region_it->first) { if (frame < smoothing_region_it->second) - pTriAPI->Color4f(0, brightness / 0.4f, 0, 1); + TriangleWrappers::Color4f(0, brightness / 0.4f, 0, 1); else smoothing_region_it++; } } auto forward = cl.AnglesToForward(player_datas[frame].Viewangles); - TriangleUtils::DrawLine(pTriAPI, origin, origin + forward * 5); + TriangleUtils::DrawLine(origin, origin + forward * 5); } size_t closest_frame = 0; @@ -774,10 +773,10 @@ namespace TriangleDrawing frame <= std::max(selection.last_frame, selection.other_frame)) brightness = 1; - pTriAPI->Color4f(brightness, brightness, brightness, 1); + TriangleWrappers::Color4f(brightness, brightness, brightness, 1); const auto prev_origin = Vector(player_datas[frame - 1].Origin); - TriangleUtils::DrawLine(pTriAPI, prev_origin, origin); + TriangleUtils::DrawLine(prev_origin, origin); // If we want to insert or apply smoothing, we need to find the closest frame. if (hw.tas_editor_insert_point_held || hw.tas_editor_apply_smoothing) { @@ -785,7 +784,7 @@ namespace TriangleDrawing if (DotProduct(forward, disp) > 0) { Vector origin_ = origin; Vector screen_point; - pTriAPI->WorldToScreen(origin_, screen_point); + TriangleWrappers::WorldToScreen(origin_, screen_point); auto screen_point_px = stw_to_pixels(screen_point.Make2D()); auto dist = (screen_point_px - mouse).Length(); @@ -806,9 +805,9 @@ namespace TriangleDrawing continue; if (item.frame_bulk_index == selection.frame_bulk_index && item.frame == selection.last_frame) - pTriAPI->Color4f(1, 1, 1, 1); + TriangleWrappers::Color4f(1, 1, 1, 1); else - pTriAPI->Color4f(0.8f, 0.8f, 0.8f, 1); + TriangleWrappers::Color4f(0.8f, 0.8f, 0.8f, 1); Vector prev_origin = player_datas[frame - 1].Origin; Vector origin = player_datas[frame].Origin; @@ -819,20 +818,20 @@ namespace TriangleDrawing Vector a = origin - perp, b = origin + perp; if (line.AlgorithmParametersPresent) { - TriangleUtils::DrawLine(pTriAPI, a, b); + TriangleUtils::DrawLine(a, b); switch (line.GetAlgorithmParameters().Type) { case HLTAS::ConstraintsType::VELOCITY: case HLTAS::ConstraintsType::VELOCITY_AVG: case HLTAS::ConstraintsType::VELOCITY_LOCK: - pTriAPI->Color4f(0, 1, 0, 1); + TriangleWrappers::Color4f(0, 1, 0, 1); break; case HLTAS::ConstraintsType::YAW: case HLTAS::ConstraintsType::YAW_RANGE: - pTriAPI->Color4f(0, 1, 1, 1); + TriangleWrappers::Color4f(0, 1, 1, 1); break; case HLTAS::ConstraintsType::LOOK_AT: - pTriAPI->Color4f(1, 0, 1, 1); + TriangleWrappers::Color4f(1, 0, 1, 1); break; } @@ -840,16 +839,16 @@ namespace TriangleDrawing next_angles[0] = 0; next_angles[2] = 0; auto forward = cl.AnglesToForward(next_angles); - TriangleUtils::DrawLine(pTriAPI, origin, origin + forward * 20); + TriangleUtils::DrawLine(origin, origin + forward * 20); } else if (!line.TargetYawOverride.empty()) { - pTriAPI->Color4f(1, 1, 0, 1); - TriangleUtils::DrawLine(pTriAPI, a, b); + TriangleWrappers::Color4f(1, 1, 0, 1); + TriangleUtils::DrawLine(a, b); } else if (line.ChangePresent) { if (item.type == KeyFrameType::FRAME_BULK) { // Draw an arrow head facing back to mark the start of the change. auto diff = (next_origin - origin).Normalize() * 5; - TriangleUtils::DrawLine(pTriAPI, a + diff, origin); - TriangleUtils::DrawLine(pTriAPI, origin, b + diff); + TriangleUtils::DrawLine(a + diff, origin); + TriangleUtils::DrawLine(origin, b + diff); Vector next_angles = player_datas[frame + 1].Viewangles; next_angles[2] = 0; @@ -864,13 +863,13 @@ namespace TriangleDrawing } auto forward = cl.AnglesToForward(next_angles); - pTriAPI->Color4f(1, 0, 0, 1); - TriangleUtils::DrawLine(pTriAPI, origin, origin + forward * 20); + TriangleWrappers::Color4f(1, 0, 0, 1); + TriangleUtils::DrawLine(origin, origin + forward * 20); } else { // Draw an arrow head facing forward to mark the end of the change. auto diff = (prev_origin - origin).Normalize() * 5; - TriangleUtils::DrawLine(pTriAPI, a + diff, origin); - TriangleUtils::DrawLine(pTriAPI, origin, b + diff); + TriangleUtils::DrawLine(a + diff, origin); + TriangleUtils::DrawLine(origin, b + diff); Vector angles = player_datas[frame].Viewangles; angles[2] = 0; @@ -887,8 +886,8 @@ namespace TriangleDrawing } auto forward = cl.AnglesToForward(angles); - pTriAPI->Color4f(1, 1, 0, 1); - TriangleUtils::DrawLine(pTriAPI, origin, origin + forward * 20); + TriangleWrappers::Color4f(1, 1, 0, 1); + TriangleUtils::DrawLine(origin, origin + forward * 20); } } } @@ -903,11 +902,11 @@ namespace TriangleDrawing Vector origin_ = player.Origin; Vector screen_point; - pTriAPI->WorldToScreen(origin_, screen_point); + TriangleWrappers::WorldToScreen(origin_, screen_point); auto screen_point_px = stw_to_pixels(screen_point.Make2D()); Vector prev_origin_ = prev_player.Origin; Vector prev_screen_point; - pTriAPI->WorldToScreen(prev_origin_, prev_screen_point); + TriangleWrappers::WorldToScreen(prev_origin_, prev_screen_point); auto prev_screen_point_px = stw_to_pixels(prev_screen_point.Make2D()); saved_lmb_diff = (screen_point_px - prev_screen_point_px).Normalize(); } else { @@ -1326,11 +1325,11 @@ namespace TriangleDrawing const auto& prev_player = player_datas[selection.initial_frame - 1]; Vector origin_ = player.Origin; Vector screen_point; - pTriAPI->WorldToScreen(origin_, screen_point); + TriangleWrappers::WorldToScreen(origin_, screen_point); auto screen_point_px = stw_to_pixels(screen_point.Make2D()); Vector prev_origin_ = prev_player.Origin; Vector prev_screen_point; - pTriAPI->WorldToScreen(prev_origin_, prev_screen_point); + TriangleWrappers::WorldToScreen(prev_origin_, prev_screen_point); auto prev_screen_point_px = stw_to_pixels(prev_screen_point.Make2D()); saved_lmb_diff = (screen_point_px - prev_screen_point_px).Normalize(); } @@ -1571,7 +1570,7 @@ namespace TriangleDrawing if (DotProduct(forward, disp) > 0) { Vector origin_ = origin; Vector screen_point; - pTriAPI->WorldToScreen(origin_, screen_point); + TriangleWrappers::WorldToScreen(origin_, screen_point); auto screen_point_px = stw_to_pixels(screen_point.Make2D()); auto dist = (screen_point_px - mouse).Length(); @@ -1653,22 +1652,22 @@ namespace TriangleDrawing if (pushable.water_level >= 1) { if (pushable.did_obbo) - pTriAPI->Color4f(0, 1, 1, 1); + TriangleWrappers::Color4f(0, 1, 1, 1); else - pTriAPI->Color4f(0.4f, 0.4f, 1, 1); + TriangleWrappers::Color4f(0.4f, 0.4f, 1, 1); } else { if (pushable.did_obbo) - pTriAPI->Color4f(0, 1, 0, 1); + TriangleWrappers::Color4f(0, 1, 0, 1); else - pTriAPI->Color4f(1, 1, 0, 1); + TriangleWrappers::Color4f(1, 1, 0, 1); } - TriangleUtils::DrawLine(pTriAPI, last_frame_pushable->origin, pushable.origin); + TriangleUtils::DrawLine(last_frame_pushable->origin, pushable.origin); } if (frame >= input.first_predicted_frame && input.received_data_from_second_game) - pTriAPI->Color4f(0.5f, 0.5f, 0.5f, 1); + TriangleWrappers::Color4f(0.5f, 0.5f, 0.5f, 1); else - pTriAPI->Color4f(0.8f, 0.8f, 0.8f, 1); + TriangleWrappers::Color4f(0.8f, 0.8f, 0.8f, 1); if (frame > color_from && frame <= color_to) { // If we bumped into something along the way @@ -1692,25 +1691,25 @@ namespace TriangleDrawing if (collision) { // Color frames with collision red. if (frame >= input.first_predicted_frame && input.received_data_from_second_game) - pTriAPI->Color4f(0.6f, 0, 0, 1); + TriangleWrappers::Color4f(0.6f, 0, 0, 1); else - pTriAPI->Color4f(1, 0, 0, 1); + TriangleWrappers::Color4f(1, 0, 0, 1); } else if (frame > frames_until_non_ground_collision) { // Color frames after collision pink. if (frame >= input.first_predicted_frame && input.received_data_from_second_game) - pTriAPI->Color4f(0.6f, 0.4f, 0.4f, 1); + TriangleWrappers::Color4f(0.6f, 0.4f, 0.4f, 1); else - pTriAPI->Color4f(1, 0.7f, 0.7f, 1); + TriangleWrappers::Color4f(1, 0.7f, 0.7f, 1); } else { if (frame >= input.first_predicted_frame && input.received_data_from_second_game) - pTriAPI->Color4f(0, 0.6f, 0, 1); + TriangleWrappers::Color4f(0, 0.6f, 0, 1); else - pTriAPI->Color4f(0, 1, 0, 1); + TriangleWrappers::Color4f(0, 1, 0, 1); } } const auto prev_origin = Vector(player_datas[frame - 1].Origin); - TriangleUtils::DrawLine(pTriAPI, prev_origin, origin); + TriangleUtils::DrawLine(prev_origin, origin); // Draw the view angle. { @@ -1723,8 +1722,8 @@ namespace TriangleDrawing last_shown_view_angle = forward; last_shown_view_angle_origin = origin; forward = origin + forward * 5; - pTriAPI->Color4f(0.4f, 0.4f, 1, 1); - TriangleUtils::DrawLine(pTriAPI, origin, forward); + TriangleWrappers::Color4f(0.4f, 0.4f, 1, 1); + TriangleUtils::DrawLine(origin, forward); } } @@ -1734,7 +1733,7 @@ namespace TriangleDrawing if (DotProduct(forward, disp) > 0) { Vector origin_ = origin; Vector screen_point; - pTriAPI->WorldToScreen(origin_, screen_point); + TriangleWrappers::WorldToScreen(origin_, screen_point); auto screen_point_px = stw_to_pixels(screen_point.Make2D()); auto dist = (screen_point_px - mouse).Length(); @@ -1766,20 +1765,20 @@ namespace TriangleDrawing auto yaw = frame_bulk.GetYaw() * M_DEG2RAD; auto yaw_dir = Vector(static_cast(std::cos(yaw)), static_cast(std::sin(yaw)), 0); yaw_dir *= 20; - pTriAPI->Color4f(0.5, 0.5, 1, 1); - TriangleUtils::DrawLine(pTriAPI, origin - yaw_dir, origin + yaw_dir); + TriangleWrappers::Color4f(0.5, 0.5, 1, 1); + TriangleUtils::DrawLine(origin - yaw_dir, origin + yaw_dir); } - pTriAPI->Color4f(1, 1, 1, 1); + TriangleWrappers::Color4f(1, 1, 1, 1); if (left_got_pressed) { Vector origin_ = origin; Vector screen_point; - pTriAPI->WorldToScreen(origin_, screen_point); + TriangleWrappers::WorldToScreen(origin_, screen_point); auto screen_point_px = stw_to_pixels(screen_point.Make2D()); Vector prev_origin_ = prev_origin; Vector prev_screen_point; - pTriAPI->WorldToScreen(prev_origin_, prev_screen_point); + TriangleWrappers::WorldToScreen(prev_origin_, prev_screen_point); auto prev_screen_point_px = stw_to_pixels(prev_screen_point.Make2D()); saved_lmb_diff = (screen_point_px - prev_screen_point_px).Normalize(); } @@ -1787,39 +1786,39 @@ namespace TriangleDrawing if (middle_got_pressed) { Vector origin_ = origin; Vector screen_point; - pTriAPI->WorldToScreen(origin_, screen_point); + TriangleWrappers::WorldToScreen(origin_, screen_point); auto screen_point_px = stw_to_pixels(screen_point.Make2D()); Vector prev_origin_ = prev_origin; Vector prev_screen_point; - pTriAPI->WorldToScreen(prev_origin_, prev_screen_point); + TriangleWrappers::WorldToScreen(prev_origin_, prev_screen_point); auto prev_screen_point_px = stw_to_pixels(prev_screen_point.Make2D()); saved_mmb_diff = (screen_point_px - prev_screen_point_px).Normalize(); } if (right_got_pressed) { Vector a_screen_point; - pTriAPI->WorldToScreen(a, a_screen_point); + TriangleWrappers::WorldToScreen(a, a_screen_point); auto a_screen_point_px = stw_to_pixels(a_screen_point.Make2D()); Vector b_screen_point; - pTriAPI->WorldToScreen(b, b_screen_point); + TriangleWrappers::WorldToScreen(b, b_screen_point); auto b_screen_point_px = stw_to_pixels(b_screen_point.Make2D()); saved_rmb_diff = (a_screen_point_px - b_screen_point_px).Normalize(); } if (mouse4_got_pressed) { Vector a_screen_point; - pTriAPI->WorldToScreen(a, a_screen_point); + TriangleWrappers::WorldToScreen(a, a_screen_point); auto a_screen_point_px = stw_to_pixels(a_screen_point.Make2D()); Vector b_screen_point; - pTriAPI->WorldToScreen(b, b_screen_point); + TriangleWrappers::WorldToScreen(b, b_screen_point); auto b_screen_point_px = stw_to_pixels(b_screen_point.Make2D()); saved_ms4_diff = (a_screen_point_px - b_screen_point_px).Normalize(); } } else { - pTriAPI->Color4f(0.8f, 0.8f, 0.8f, 1); + TriangleWrappers::Color4f(0.8f, 0.8f, 0.8f, 1); } - TriangleUtils::DrawLine(pTriAPI, a, b); + TriangleUtils::DrawLine(a, b); } } @@ -2373,27 +2372,26 @@ namespace TriangleDrawing void Draw() { auto pEngfuncs = ClientDLL::GetInstance().pEngfuncs; - auto pTriAPI = pEngfuncs->pTriAPI; if (white_sprite == 0) return; - if (!pTriAPI->SpriteTexture(const_cast(pEngfuncs->GetSpritePointer(white_sprite)), 0)) + if (!TriangleWrappers::SpriteTexture(const_cast(pEngfuncs->GetSpritePointer(white_sprite)), 0)) return; - DrawNodes(pTriAPI); - DrawDisplacerTargets(pTriAPI); - DrawUseableEntities(pTriAPI); - DrawTriggers(pTriAPI); - DrawCustomTriggers(pTriAPI); - DrawAbsMinMax(pTriAPI); - DrawPlayerAbsMinMax(pTriAPI); - DrawMonsterAbsMinMax(pTriAPI); - DrawBulletsEnemyTrace(pTriAPI); - DrawBulletsPlayerTrace(pTriAPI); - DrawSplits(pTriAPI); - - DrawTASEditor(pTriAPI); + DrawNodes(); + DrawDisplacerTargets(); + DrawUseableEntities(); + DrawTriggers(); + DrawCustomTriggers(); + DrawAbsMinMax(); + DrawPlayerAbsMinMax(); + DrawMonsterAbsMinMax(); + DrawBulletsEnemyTrace(); + DrawBulletsPlayerTrace(); + DrawSplits(); + + DrawTASEditor(); ResetTASEditorCommands(); } } diff --git a/BunnymodXT/triangle_utils.cpp b/BunnymodXT/triangle_utils.cpp index 1a8b3f13..6203525a 100644 --- a/BunnymodXT/triangle_utils.cpp +++ b/BunnymodXT/triangle_utils.cpp @@ -2,6 +2,7 @@ #include "hud_custom.hpp" #include "triangle_utils.hpp" +#include "triangle_wrappers.hpp" namespace TriangleUtils { @@ -25,7 +26,7 @@ namespace TriangleUtils return proportion * CustomHud::GetScreenInfo().iHeight; } - void DrawPyramid(triangleapi_s *pTriAPI, Vector origin, float width, float height) + void DrawPyramid(Vector origin, float width, float height) { const float halfWidth = width * 0.5f; Vector bottom[5] = { @@ -36,19 +37,19 @@ namespace TriangleUtils origin + Vector(halfWidth, halfWidth, 0) }; - pTriAPI->Begin(TRI_QUADS); + TriangleWrappers::Begin(TRI_QUADS); for (int i = 0; i < 4; ++i) - pTriAPI->Vertex3f(bottom[i].x, bottom[i].y, bottom[i].z); - pTriAPI->End(); + TriangleWrappers::Vertex3f(bottom[i].x, bottom[i].y, bottom[i].z); + TriangleWrappers::End(); - pTriAPI->Begin(TRI_TRIANGLE_FAN); - pTriAPI->Vertex3f(origin.x, origin.y, origin.z + height); + TriangleWrappers::Begin(TRI_TRIANGLE_FAN); + TriangleWrappers::Vertex3f(origin.x, origin.y, origin.z + height); for (int i = 0; i < 5; ++i) - pTriAPI->Vertex3f(bottom[i].x, bottom[i].y, bottom[i].z); - pTriAPI->End(); + TriangleWrappers::Vertex3f(bottom[i].x, bottom[i].y, bottom[i].z); + TriangleWrappers::End(); } - void DrawScreenTriangle(triangleapi_s *pTriAPI, Vector origin, float sideLength) + void DrawScreenTriangle(Vector origin, float sideLength) { // The magic number is sqrt(3) / 6 const auto baseToCenter = 0.288675135f * sideLength; @@ -56,7 +57,7 @@ namespace TriangleUtils const auto halfLength = 0.5f * sideLength; Vector screenPoints[3]; - pTriAPI->WorldToScreen(origin, screenPoints[0]); + TriangleWrappers::WorldToScreen(origin, screenPoints[0]); screenPoints[0].z = 0.0f; screenPoints[1] = screenPoints[0]; screenPoints[2] = screenPoints[0]; @@ -67,16 +68,16 @@ namespace TriangleUtils screenPoints[2].x += halfLength; screenPoints[2].y -= baseToCenter; - pTriAPI->Begin(TRI_TRIANGLES); + TriangleWrappers::Begin(TRI_TRIANGLES); for (int i = 0; i < 3; ++i) { Vector worldPoint; - pTriAPI->ScreenToWorld(screenPoints[i], worldPoint); - pTriAPI->Vertex3f(worldPoint.x, worldPoint.y, worldPoint.z); + TriangleWrappers::ScreenToWorld(screenPoints[i], worldPoint); + TriangleWrappers::Vertex3f(worldPoint.x, worldPoint.y, worldPoint.z); } - pTriAPI->End(); + TriangleWrappers::End(); } - void DrawScreenRectangle(triangleapi_s *pTriAPI, Vector2D corner1, Vector2D corner2) + void DrawScreenRectangle(Vector2D corner1, Vector2D corner2) { Vector screen_points[4], world_points[4]; screen_points[0] = Vector(corner1.x, corner1.y, 0.0f); @@ -85,121 +86,121 @@ namespace TriangleUtils screen_points[3] = Vector(corner2.x, corner1.y, 0.0f); for (int i = 0; i < 4; ++i) - pTriAPI->ScreenToWorld(screen_points[i], world_points[i]); + TriangleWrappers::ScreenToWorld(screen_points[i], world_points[i]); - pTriAPI->Begin(TRI_QUADS); + TriangleWrappers::Begin(TRI_QUADS); - pTriAPI->Vertex3fv(world_points[0]); - pTriAPI->Vertex3fv(world_points[1]); - pTriAPI->Vertex3fv(world_points[2]); - pTriAPI->Vertex3fv(world_points[3]); + TriangleWrappers::Vertex3fv(world_points[0]); + TriangleWrappers::Vertex3fv(world_points[1]); + TriangleWrappers::Vertex3fv(world_points[2]); + TriangleWrappers::Vertex3fv(world_points[3]); - pTriAPI->End(); + TriangleWrappers::End(); } - void DrawAACuboid(triangleapi_s *pTriAPI, Vector corner1, Vector corner2) + void DrawAACuboid(Vector corner1, Vector corner2) { - pTriAPI->Begin(TRI_QUADS); - - pTriAPI->Vertex3f(corner1.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner1.z); - - pTriAPI->Vertex3f(corner1.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner1.z); - - pTriAPI->Vertex3f(corner1.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner2.z); - - pTriAPI->Vertex3f(corner2.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner2.z); - - pTriAPI->Vertex3f(corner2.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner1.z); - - pTriAPI->Vertex3f(corner2.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner2.z); - - pTriAPI->End(); + TriangleWrappers::Begin(TRI_QUADS); + + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner1.z); + + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner1.z); + + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner2.z); + + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner2.z); + + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner1.z); + + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner2.z); + + TriangleWrappers::End(); } - void DrawAACuboidWireframe(triangleapi_s *pTriAPI, Vector corner1, Vector corner2) + void DrawAACuboidWireframe(Vector corner1, Vector corner2) { - pTriAPI->Begin(TRI_LINES); - - pTriAPI->Vertex3f(corner1.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner1.z); - - pTriAPI->Vertex3f(corner1.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner1.z); - - pTriAPI->Vertex3f(corner1.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner1.z); - - pTriAPI->Vertex3f(corner2.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner2.z); - - pTriAPI->Vertex3f(corner2.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner1.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner2.z); - - pTriAPI->Vertex3f(corner2.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner1.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner1.x, corner2.y, corner2.z); - pTriAPI->Vertex3f(corner2.x, corner2.y, corner2.z); - - pTriAPI->End(); + TriangleWrappers::Begin(TRI_LINES); + + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner1.z); + + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner1.z); + + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner1.z); + + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner2.z); + + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner1.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner2.z); + + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner1.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner1.x, corner2.y, corner2.z); + TriangleWrappers::Vertex3f(corner2.x, corner2.y, corner2.z); + + TriangleWrappers::End(); } - void DrawLine(triangleapi_s *pTriAPI, Vector start, Vector end) + void DrawLine(Vector start, Vector end) { - pTriAPI->Begin(TRI_LINES); - pTriAPI->Vertex3f(start.x, start.y, start.z); - pTriAPI->Vertex3f(end.x, end.y, end.z); - pTriAPI->End(); + TriangleWrappers::Begin(TRI_LINES); + TriangleWrappers::Vertex3f(start.x, start.y, start.z); + TriangleWrappers::Vertex3f(end.x, end.y, end.z); + TriangleWrappers::End(); } }; diff --git a/BunnymodXT/triangle_utils.hpp b/BunnymodXT/triangle_utils.hpp index 1d7e2e7d..85917e83 100644 --- a/BunnymodXT/triangle_utils.hpp +++ b/BunnymodXT/triangle_utils.hpp @@ -7,13 +7,13 @@ namespace TriangleUtils float ProportionToPixelWidth(float proportion); float ProportionToPixelHeight(float proportion); - void DrawPyramid(triangleapi_s *pTriAPI, Vector origin, float width, float height); - void DrawScreenTriangle(triangleapi_s *pTriAPI, Vector center, float sideLength); - void DrawScreenRectangle(triangleapi_s *pTriAPI, Vector2D corner1, Vector2D corner2); + void DrawPyramid(Vector origin, float width, float height); + void DrawScreenTriangle(Vector center, float sideLength); + void DrawScreenRectangle(Vector2D corner1, Vector2D corner2); // Draws an axis-aligned cuboid from two opposite corners. - void DrawAACuboid(triangleapi_s *pTriAPI, Vector corner1, Vector corner2); - void DrawAACuboidWireframe(triangleapi_s *pTriAPI, Vector corner1, Vector corner2); + void DrawAACuboid(Vector corner1, Vector corner2); + void DrawAACuboidWireframe(Vector corner1, Vector corner2); - void DrawLine(triangleapi_s *pTriAPI, Vector start, Vector end); + void DrawLine(Vector start, Vector end); }; From 7d1fb6a28e06d8780502003adc2009c0fc561cfe Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Thu, 4 Apr 2024 14:34:22 +0400 Subject: [PATCH 3/8] triangle_wrappers: fixed errors and warnings --- BunnymodXT/triangle_wrappers.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/BunnymodXT/triangle_wrappers.cpp b/BunnymodXT/triangle_wrappers.cpp index c9658aeb..864b4d6d 100644 --- a/BunnymodXT/triangle_wrappers.cpp +++ b/BunnymodXT/triangle_wrappers.cpp @@ -97,7 +97,7 @@ namespace TriangleWrappers { if (gRenderMode == kRenderTransAlpha) { - glColor4ub(x * 255.9, y * 255.9, z * 255.9, w * 255.0); + glColor4ub(static_cast(x * 255.9), static_cast(y * 255.9), static_cast(z * 255.9), static_cast(w * 255.0)); } else { @@ -224,9 +224,11 @@ namespace TriangleWrappers } else if (hw.gWorldToScreen) { - float x = hw.gWorldToScreen[0] * point[0] + hw.gWorldToScreen[4] * point[1] + hw.gWorldToScreen[8] * point[2] + hw.gWorldToScreen[12]; - float y = hw.gWorldToScreen[1] * point[0] + hw.gWorldToScreen[5] * point[1] + hw.gWorldToScreen[9] * point[2] + hw.gWorldToScreen[13]; - float w = hw.gWorldToScreen[3] * point[0] + hw.gWorldToScreen[7] * point[1] + hw.gWorldToScreen[11] * point[2] + hw.gWorldToScreen[15]; + auto gWorldToScreen = (*hw.gWorldToScreen); + + float x = gWorldToScreen[0] * point[0] + gWorldToScreen[4] * point[1] + gWorldToScreen[8] * point[2] + gWorldToScreen[12]; + float y = gWorldToScreen[1] * point[0] + gWorldToScreen[5] * point[1] + gWorldToScreen[9] * point[2] + gWorldToScreen[13]; + float w = gWorldToScreen[3] * point[0] + gWorldToScreen[7] * point[1] + gWorldToScreen[11] * point[2] + gWorldToScreen[15]; float invw = 0.0f; if (w != 0.0f) @@ -250,10 +252,12 @@ namespace TriangleWrappers } else if (hw.gScreenToWorld) { - float x = hw.gScreenToWorld[0] * screen[0] + hw.gScreenToWorld[4] * screen[1] + hw.gScreenToWorld[8] * screen[2] + hw.gScreenToWorld[12]; - float y = hw.gScreenToWorld[1] * screen[0] + hw.gScreenToWorld[5] * screen[1] + hw.gScreenToWorld[9] * screen[2] + hw.gScreenToWorld[13]; - float z = hw.gScreenToWorld[2] * screen[0] + hw.gScreenToWorld[6] * screen[1] + hw.gScreenToWorld[10] * screen[2] + hw.gScreenToWorld[14]; - float w = hw.gScreenToWorld[3] * screen[0] + hw.gScreenToWorld[7] * screen[1] + hw.gScreenToWorld[11] * screen[2] + hw.gScreenToWorld[15]; + auto gScreenToWorld = hw.gScreenToWorld; + + float x = gScreenToWorld[0] * screen[0] + gScreenToWorld[4] * screen[1] + gScreenToWorld[8] * screen[2] + gScreenToWorld[12]; + float y = gScreenToWorld[1] * screen[0] + gScreenToWorld[5] * screen[1] + gScreenToWorld[9] * screen[2] + gScreenToWorld[13]; + float z = gScreenToWorld[2] * screen[0] + gScreenToWorld[6] * screen[1] + gScreenToWorld[10] * screen[2] + gScreenToWorld[14]; + float w = gScreenToWorld[3] * screen[0] + gScreenToWorld[7] * screen[1] + gScreenToWorld[11] * screen[2] + gScreenToWorld[15]; if (w != 0.0f) { @@ -353,11 +357,11 @@ namespace TriangleWrappers /* last check */ if (0.0 == r3[3]) return 0; - s = 1.0/r3[3]; /* now back substitute row 3 */ + s = 1.0f/r3[3]; /* now back substitute row 3 */ r3[4] *= s; r3[5] *= s; r3[6] *= s; r3[7] *= s; m2 = r2[3]; /* now back substitute row 2 */ - s = 1.0/r2[2]; + s = 1.0f/r2[2]; r2[4] = s * (r2[4] - r3[4] * m2), r2[5] = s * (r2[5] - r3[5] * m2), r2[6] = s * (r2[6] - r3[6] * m2), r2[7] = s * (r2[7] - r3[7] * m2); m1 = r1[3]; @@ -368,7 +372,7 @@ namespace TriangleWrappers r0[6] -= r3[6] * m0, r0[7] -= r3[7] * m0; m1 = r1[2]; /* now back substitute row 1 */ - s = 1.0/r1[1]; + s = 1.0f/r1[1]; r1[4] = s * (r1[4] - r2[4] * m1), r1[5] = s * (r1[5] - r2[5] * m1), r1[6] = s * (r1[6] - r2[6] * m1), r1[7] = s * (r1[7] - r2[7] * m1); m0 = r0[2]; @@ -376,7 +380,7 @@ namespace TriangleWrappers r0[6] -= r2[6] * m0, r0[7] -= r2[7] * m0; m0 = r0[1]; /* now back substitute row 0 */ - s = 1.0/r0[0]; + s = 1.0f/r0[0]; r0[4] = s * (r0[4] - r1[4] * m0), r0[5] = s * (r0[5] - r1[5] * m0), r0[6] = s * (r0[6] - r1[6] * m0), r0[7] = s * (r0[7] - r1[7] * m0); From 126ef7ff0e12462ffe40489bba587bc221311d40 Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Sat, 6 Apr 2024 10:05:32 +0400 Subject: [PATCH 4/8] triangle_wrappers: moved into 'wrappers' folder --- BunnymodXT/modules/ClientDLL.cpp | 3 ++- BunnymodXT/modules/HwDLL.cpp | 3 ++- BunnymodXT/triangle_drawing.cpp | 3 ++- BunnymodXT/triangle_utils.cpp | 3 ++- BunnymodXT/{ => wrappers}/triangle_wrappers.cpp | 0 BunnymodXT/{ => wrappers}/triangle_wrappers.hpp | 4 ++-- CMakeLists.txt | 4 ++-- 7 files changed, 12 insertions(+), 8 deletions(-) rename BunnymodXT/{ => wrappers}/triangle_wrappers.cpp (100%) rename BunnymodXT/{ => wrappers}/triangle_wrappers.hpp (95%) diff --git a/BunnymodXT/modules/ClientDLL.cpp b/BunnymodXT/modules/ClientDLL.cpp index 1b02af24..f0d5a224 100644 --- a/BunnymodXT/modules/ClientDLL.cpp +++ b/BunnymodXT/modules/ClientDLL.cpp @@ -11,9 +11,10 @@ #include "../hud_custom.hpp" #include "../triangle_drawing.hpp" #include "../discord_integration.hpp" -#include "../triangle_wrappers.hpp" #include +#include "../wrappers/triangle_wrappers.hpp" + // Linux hooks. #ifndef _WIN32 extern "C" void __cdecl HUD_Init() diff --git a/BunnymodXT/modules/HwDLL.cpp b/BunnymodXT/modules/HwDLL.cpp index 7f43da7a..c73202a3 100644 --- a/BunnymodXT/modules/HwDLL.cpp +++ b/BunnymodXT/modules/HwDLL.cpp @@ -23,9 +23,10 @@ #include "../custom_triggers.hpp" #include "../simulation_ipc.hpp" #include "../splits.hpp" -#include "../triangle_wrappers.hpp" #include "../helper_functions.hpp" +#include "../wrappers/triangle_wrappers.hpp" + using namespace std::literals; // Callbacks for bxt-rs. diff --git a/BunnymodXT/triangle_drawing.cpp b/BunnymodXT/triangle_drawing.cpp index ad0aef27..e13a56ef 100644 --- a/BunnymodXT/triangle_drawing.cpp +++ b/BunnymodXT/triangle_drawing.cpp @@ -5,11 +5,12 @@ #include "triangle_drawing.hpp" #include "triangle_utils.hpp" -#include "triangle_wrappers.hpp" #include "modules.hpp" #include "hud_custom.hpp" +#include "wrappers/triangle_wrappers.hpp" + namespace TriangleDrawing { static HSPRITE_HL white_sprite = 0; diff --git a/BunnymodXT/triangle_utils.cpp b/BunnymodXT/triangle_utils.cpp index 6203525a..43a7778f 100644 --- a/BunnymodXT/triangle_utils.cpp +++ b/BunnymodXT/triangle_utils.cpp @@ -2,7 +2,8 @@ #include "hud_custom.hpp" #include "triangle_utils.hpp" -#include "triangle_wrappers.hpp" + +#include "wrappers/triangle_wrappers.hpp" namespace TriangleUtils { diff --git a/BunnymodXT/triangle_wrappers.cpp b/BunnymodXT/wrappers/triangle_wrappers.cpp similarity index 100% rename from BunnymodXT/triangle_wrappers.cpp rename to BunnymodXT/wrappers/triangle_wrappers.cpp diff --git a/BunnymodXT/triangle_wrappers.hpp b/BunnymodXT/wrappers/triangle_wrappers.hpp similarity index 95% rename from BunnymodXT/triangle_wrappers.hpp rename to BunnymodXT/wrappers/triangle_wrappers.hpp index 77a0643e..0facdc55 100644 --- a/BunnymodXT/triangle_wrappers.hpp +++ b/BunnymodXT/wrappers/triangle_wrappers.hpp @@ -1,7 +1,7 @@ #pragma once -#include "stdafx.hpp" -#include "modules.hpp" +#include "../stdafx.hpp" +#include "../modules.hpp" #include namespace TriangleWrappers diff --git a/CMakeLists.txt b/CMakeLists.txt index fbd453a9..419e0f82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,7 +174,6 @@ set (HEADER_FILES BunnymodXT/stdafx.hpp BunnymodXT/triangle_drawing.hpp BunnymodXT/triangle_utils.hpp - BunnymodXT/triangle_wrappers.cpp BunnymodXT/opengl_utils.hpp BunnymodXT/TEA.hpp BunnymodXT/runtime_data.hpp @@ -182,6 +181,7 @@ set (HEADER_FILES BunnymodXT/simulation_ipc.hpp BunnymodXT/splits.hpp BunnymodXT/helper_functions.hpp + BunnymodXT/wrappers/triangle_wrappers.hpp BunnymodXT/git_revision.hpp) set (SOURCE_FILES @@ -202,7 +202,6 @@ set (SOURCE_FILES BunnymodXT/hud_custom.cpp BunnymodXT/triangle_drawing.cpp BunnymodXT/triangle_utils.cpp - BunnymodXT/triangle_wrappers.cpp BunnymodXT/opengl_utils.cpp BunnymodXT/TEA.cpp BunnymodXT/runtime_data.cpp @@ -210,6 +209,7 @@ set (SOURCE_FILES BunnymodXT/simulation_ipc.cpp BunnymodXT/splits.cpp BunnymodXT/helper_functions.cpp + BunnymodXT/wrappers/triangle_wrappers.cpp ${CMAKE_CURRENT_BINARY_DIR}/BunnymodXT/git_revision.cpp) if (MSVC) From 9b45e5d570135558ce1bcc69d1f05a4aada0f3f1 Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Sun, 21 Apr 2024 19:29:28 +0400 Subject: [PATCH 5/8] triangle_wrappers: initialize 'g_GL_Modes' once at compile-time --- BunnymodXT/wrappers/triangle_wrappers.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BunnymodXT/wrappers/triangle_wrappers.cpp b/BunnymodXT/wrappers/triangle_wrappers.cpp index 864b4d6d..9d137d5c 100644 --- a/BunnymodXT/wrappers/triangle_wrappers.cpp +++ b/BunnymodXT/wrappers/triangle_wrappers.cpp @@ -12,6 +12,7 @@ namespace TriangleWrappers auto &hw = HwDLL::GetInstance(); auto &cl = ClientDLL::GetInstance(); + static const int g_GL_Modes[7] = {4, 6, 7, 9, 1, 5, 8}; // GL_TRIANGLES, GL_TRIANGLE_FAN, GL_QUADS, GL_POLYGON, GL_LINES, GL_TRIANGLE_STRIP, GL_QUAD_STRIP static int gRenderMode; static float gGlR, gGlG, gGlB, gGlW; @@ -70,7 +71,6 @@ namespace TriangleWrappers { if (hw.ORIG_VGUI2_ResetCurrentTexture) hw.ORIG_VGUI2_ResetCurrentTexture(); - int g_GL_Modes[7] = {4, 6, 7, 9, 1, 5, 8}; // GL_TRIANGLES, GL_TRIANGLE_FAN, GL_QUADS, GL_POLYGON, GL_LINES, GL_TRIANGLE_STRIP, GL_QUAD_STRIP glBegin(g_GL_Modes[primitiveCode]); } } @@ -398,4 +398,4 @@ namespace TriangleWrappers #undef MAT #undef SWAP_ROWS } -}; \ No newline at end of file +}; From 6a15f63907629aa3eb0b0fe3c07bcf30aa2f38aa Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Fri, 10 May 2024 04:49:09 +0400 Subject: [PATCH 6/8] Replaced TriAPI interface verify conditions with macro --- BunnymodXT/wrappers/triangle_wrappers.cpp | 32 +++++++++++++---------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/BunnymodXT/wrappers/triangle_wrappers.cpp b/BunnymodXT/wrappers/triangle_wrappers.cpp index 9d137d5c..76241b06 100644 --- a/BunnymodXT/wrappers/triangle_wrappers.cpp +++ b/BunnymodXT/wrappers/triangle_wrappers.cpp @@ -16,9 +16,11 @@ namespace TriangleWrappers static int gRenderMode; static float gGlR, gGlG, gGlB, gGlW; + #define IsTriAPIValid() cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10 + void RenderMode(int mode) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->RenderMode(mode); } @@ -63,7 +65,7 @@ namespace TriangleWrappers void Begin(int primitiveCode) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->Begin(primitiveCode); } @@ -77,7 +79,7 @@ namespace TriangleWrappers void End() { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->End(); } @@ -89,7 +91,7 @@ namespace TriangleWrappers void Color4f(float x, float y, float z, float w) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->Color4f(x, y, z, w); } @@ -112,7 +114,7 @@ namespace TriangleWrappers void Color4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->Color4ub(r, g, b, a); } @@ -128,7 +130,7 @@ namespace TriangleWrappers void TexCoord2f(float u, float v) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->TexCoord2f(u, v); } @@ -140,7 +142,7 @@ namespace TriangleWrappers void Vertex3fv(float *worldPnt) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->Vertex3fv(worldPnt); } @@ -152,7 +154,7 @@ namespace TriangleWrappers void Vertex3f(float x, float y, float z) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->Vertex3f(x, y, z); } @@ -164,7 +166,7 @@ namespace TriangleWrappers void Brightness(float x) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->Brightness(x); } @@ -176,7 +178,7 @@ namespace TriangleWrappers void CullFace(TRICULLSTYLE style) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->CullFace(style); } @@ -196,7 +198,7 @@ namespace TriangleWrappers int SpriteTexture(struct model_s *pSpriteModel, int frame) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { return cl.pEngfuncs->pTriAPI->SpriteTexture(pSpriteModel, frame); } @@ -218,7 +220,7 @@ namespace TriangleWrappers int WorldToScreen(vec_t *point, vec_t *screen) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { return cl.pEngfuncs->pTriAPI->WorldToScreen(point, screen); } @@ -246,7 +248,7 @@ namespace TriangleWrappers void ScreenToWorld(vec_t *screen, vec_t *point) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->ScreenToWorld(screen, point); } @@ -271,7 +273,7 @@ namespace TriangleWrappers void GetMatrix(const int pname, float *matrix) { - if (cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10) + if (IsTriAPIValid()) { cl.pEngfuncs->pTriAPI->GetMatrix(pname, matrix); } @@ -398,4 +400,6 @@ namespace TriangleWrappers #undef MAT #undef SWAP_ROWS } + + #undef IsTriAPIValid }; From d28e700912b7f6de4126c584cce8d6168a496271 Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Fri, 10 May 2024 05:05:58 +0400 Subject: [PATCH 7/8] triangle_drawing: added template function for drawing trigger polygons on pre and post 25th anniversary versions --- BunnymodXT/triangle_drawing.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/BunnymodXT/triangle_drawing.cpp b/BunnymodXT/triangle_drawing.cpp index e13a56ef..05326a6f 100644 --- a/BunnymodXT/triangle_drawing.cpp +++ b/BunnymodXT/triangle_drawing.cpp @@ -159,6 +159,17 @@ namespace TriangleDrawing s = std::min(s, 1.0f); return s; } + + template void DrawPolygons(const model_t *model, int i) + { + const T surfs = (T)model->surfaces + model->firstmodelsurface; + TriangleWrappers::Begin(TRI_POLYGON); + for (int j = 0; j < surfs[i].polys->numverts; ++j) + { + TriangleWrappers::Vertex3fv(surfs[i].polys->verts[j]); + } + TriangleWrappers::End(); + } static void DrawTriggers() { @@ -188,7 +199,6 @@ namespace TriangleDrawing continue; const bool active = ent->v.solid != SOLID_NOT || std::strcmp(classname, "trigger_transition") == 0; - const msurface_t *surfs = model->surfaces + model->firstmodelsurface; for (int i = 0; i < model->nummodelsurfaces; ++i) { // Offset to make each surface look slightly different const float offset = i * float(M_PI) / 7; @@ -203,10 +213,7 @@ namespace TriangleDrawing a = GetPulsatingAlpha(a, svTime + offset); TriangleWrappers::Color4f(r, g, b, a); - TriangleWrappers::Begin(TRI_POLYGON); - for (int j = 0; j < surfs[i].polys->numverts; ++j) - TriangleWrappers::Vertex3fv(surfs[i].polys->verts[j]); - TriangleWrappers::End(); + DrawPolygons(model, i); } } } From 1f98048473932b2ea5211555f1842d179295723a Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Fri, 10 May 2024 05:10:25 +0400 Subject: [PATCH 8/8] triangle_drawing: moved GetTriggerColor and GetTriggerAlpha calls out of nummodelsurfaces loop for performance --- BunnymodXT/triangle_drawing.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/BunnymodXT/triangle_drawing.cpp b/BunnymodXT/triangle_drawing.cpp index 05326a6f..7050d209 100644 --- a/BunnymodXT/triangle_drawing.cpp +++ b/BunnymodXT/triangle_drawing.cpp @@ -199,16 +199,17 @@ namespace TriangleDrawing continue; const bool active = ent->v.solid != SOLID_NOT || std::strcmp(classname, "trigger_transition") == 0; + float r, g, b, a; + ServerDLL::GetTriggerColor(classname, r, g, b); + ServerDLL::GetTriggerAlpha(classname, !active, true, a); + r /= 255.0f; + g /= 255.0f; + b /= 255.0f; + a /= 255.0f; + for (int i = 0; i < model->nummodelsurfaces; ++i) { // Offset to make each surface look slightly different const float offset = i * float(M_PI) / 7; - float r, g, b, a; - ServerDLL::GetTriggerColor(classname, r, g, b); - ServerDLL::GetTriggerAlpha(classname, !active, true, a); - r /= 255.0f; - g /= 255.0f; - b /= 255.0f; - a /= 255.0f; if (active) a = GetPulsatingAlpha(a, svTime + offset);