diff --git a/BunnymodXT/modules/ClientDLL.cpp b/BunnymodXT/modules/ClientDLL.cpp index 4d33a99a..f0d5a224 100644 --- a/BunnymodXT/modules/ClientDLL.cpp +++ b/BunnymodXT/modules/ClientDLL.cpp @@ -13,6 +13,8 @@ #include "../discord_integration.hpp" #include +#include "../wrappers/triangle_wrappers.hpp" + // Linux hooks. #ifndef _WIN32 extern "C" void __cdecl HUD_Init() @@ -1704,7 +1706,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 +1985,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 +2011,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..c73202a3 100644 --- a/BunnymodXT/modules/HwDLL.cpp +++ b/BunnymodXT/modules/HwDLL.cpp @@ -25,6 +25,8 @@ #include "../splits.hpp" #include "../helper_functions.hpp" +#include "../wrappers/triangle_wrappers.hpp" + using namespace std::literals; // Callbacks for bxt-rs. @@ -8136,10 +8138,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/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_drawing.cpp b/BunnymodXT/triangle_drawing.cpp index 0a4c8de1..7050d209 100644 --- a/BunnymodXT/triangle_drawing.cpp +++ b/BunnymodXT/triangle_drawing.cpp @@ -9,33 +9,35 @@ #include "hud_custom.hpp" +#include "wrappers/triangle_wrappers.hpp" + 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 +70,7 @@ namespace TriangleDrawing return sourceVector.Normalize(); } - static void DrawUseableEntities(triangleapi_s *pTriAPI) + static void DrawUseableEntities() { if (!CVars::bxt_hud_useables.GetBool()) return; @@ -90,8 +92,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 +107,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 +119,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 +131,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 +139,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 ); @@ -159,14 +159,25 @@ 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(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; @@ -188,40 +199,37 @@ 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; + 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); - pTriAPI->Color4f(r, g, b, a); - pTriAPI->Begin(TRI_POLYGON); - for (int j = 0; j < surfs[i].polys->numverts; ++j) - pTriAPI->Vertex3fv(surfs[i].polys->verts[j]); - pTriAPI->End(); + TriangleWrappers::Color4f(r, g, b, a); + DrawPolygons(model, i); } } } - 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 +242,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 +267,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 +297,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 +349,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 +391,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 +406,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 +417,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 +436,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 +449,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 +512,7 @@ namespace TriangleDrawing size_t other_frame; }; - static void DrawTASEditor(triangleapi_s *pTriAPI) + static void DrawTASEditor() { using HLStrafe::HullType; using HLTAS::StrafeDir; @@ -712,7 +720,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 +746,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 +782,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 +793,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 +814,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 +827,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 +848,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 +872,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 +895,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 +911,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 +1334,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 +1579,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 +1661,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 +1700,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 +1731,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 +1742,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 +1774,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 +1795,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 +2381,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..43a7778f 100644 --- a/BunnymodXT/triangle_utils.cpp +++ b/BunnymodXT/triangle_utils.cpp @@ -3,6 +3,8 @@ #include "hud_custom.hpp" #include "triangle_utils.hpp" +#include "wrappers/triangle_wrappers.hpp" + namespace TriangleUtils { float PixelWidthToProportion(float pixels) @@ -25,7 +27,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 +38,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 +58,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 +69,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 +87,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); }; diff --git a/BunnymodXT/wrappers/triangle_wrappers.cpp b/BunnymodXT/wrappers/triangle_wrappers.cpp new file mode 100644 index 00000000..76241b06 --- /dev/null +++ b/BunnymodXT/wrappers/triangle_wrappers.cpp @@ -0,0 +1,405 @@ +/* + 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 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; + + #define IsTriAPIValid() cl.interface_preserved_eng_cl && cl.pEngfuncs && !hw.is_hlsdk10 + + void RenderMode(int mode) + { + if (IsTriAPIValid()) + { + 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 (IsTriAPIValid()) + { + cl.pEngfuncs->pTriAPI->Begin(primitiveCode); + } + else + { + if (hw.ORIG_VGUI2_ResetCurrentTexture) + hw.ORIG_VGUI2_ResetCurrentTexture(); + glBegin(g_GL_Modes[primitiveCode]); + } + } + + void End() + { + if (IsTriAPIValid()) + { + cl.pEngfuncs->pTriAPI->End(); + } + else + { + glEnd(); + } + } + + void Color4f(float x, float y, float z, float w) + { + if (IsTriAPIValid()) + { + cl.pEngfuncs->pTriAPI->Color4f(x, y, z, w); + } + else + { + if (gRenderMode == kRenderTransAlpha) + { + glColor4ub(static_cast(x * 255.9), static_cast(y * 255.9), static_cast(z * 255.9), static_cast(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 (IsTriAPIValid()) + { + 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 (IsTriAPIValid()) + { + cl.pEngfuncs->pTriAPI->TexCoord2f(u, v); + } + else + { + glTexCoord2f(u, v); + } + } + + void Vertex3fv(float *worldPnt) + { + if (IsTriAPIValid()) + { + cl.pEngfuncs->pTriAPI->Vertex3fv(worldPnt); + } + else + { + glVertex3fv(worldPnt); + } + } + + void Vertex3f(float x, float y, float z) + { + if (IsTriAPIValid()) + { + cl.pEngfuncs->pTriAPI->Vertex3f(x, y, z); + } + else + { + glVertex3f(x, y, z); + } + } + + void Brightness(float x) + { + if (IsTriAPIValid()) + { + cl.pEngfuncs->pTriAPI->Brightness(x); + } + else + { + glColor4f(gGlR * x * gGlW, gGlG * x * gGlW, gGlB * x * gGlW, 1.0f); + } + } + + void CullFace(TRICULLSTYLE style) + { + if (IsTriAPIValid()) + { + 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 (IsTriAPIValid()) + { + 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 (IsTriAPIValid()) + { + return cl.pEngfuncs->pTriAPI->WorldToScreen(point, screen); + } + else if (hw.gWorldToScreen) + { + 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) + { + 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 (IsTriAPIValid()) + { + cl.pEngfuncs->pTriAPI->ScreenToWorld(screen, point); + } + else if (hw.gScreenToWorld) + { + 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) + { + 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 (IsTriAPIValid()) + { + 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.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.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]; + 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.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]; + 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.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); + + 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 + } + + #undef IsTriAPIValid +}; diff --git a/BunnymodXT/wrappers/triangle_wrappers.hpp b/BunnymodXT/wrappers/triangle_wrappers.hpp new file mode 100644 index 00000000..0facdc55 --- /dev/null +++ b/BunnymodXT/wrappers/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..419e0f82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -181,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 @@ -208,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)