From 1f7ff357736966499bb3d72285b6734828983e8a Mon Sep 17 00:00:00 2001 From: Federico Cecchetto Date: Sat, 8 May 2021 21:07:31 +0200 Subject: [PATCH] Add r_fullbright dvar --- src/component/renderer.cpp | 72 ++++++++++++++++++++++++++ src/game/dvars.cpp | 2 + src/game/dvars.hpp | 2 + src/game/scripting/function_tables.cpp | 24 ++++----- src/game/structs.hpp | 20 +++++++ src/game/symbols.hpp | 3 ++ 6 files changed, 111 insertions(+), 12 deletions(-) create mode 100644 src/component/renderer.cpp diff --git a/src/component/renderer.cpp b/src/component/renderer.cpp new file mode 100644 index 00000000..f7bf6612 --- /dev/null +++ b/src/component/renderer.cpp @@ -0,0 +1,72 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" +#include "game/dvars.hpp" + +#include "component/command.hpp" +#include "component/scheduler.hpp" + +#include + +namespace renderer +{ + namespace + { + utils::hook::detour r_init_draw_method_hook; + utils::hook::detour r_update_front_end_dvar_options_hook; + + int get_fullbright_technique() + { + switch (dvars::r_fullbright->current.integer) + { + case 3: + return 3; + case 2: + return 13; + default: + return game::TECHNIQUE_UNLIT; + } + } + + void gfxdrawmethod() + { + game::gfxDrawMethod->drawScene = game::GFX_DRAW_SCENE_STANDARD; + game::gfxDrawMethod->baseTechType = dvars::r_fullbright->current.enabled ? get_fullbright_technique() : game::TECHNIQUE_LIT; + game::gfxDrawMethod->emissiveTechType = dvars::r_fullbright->current.enabled ? get_fullbright_technique() : game::TECHNIQUE_EMISSIVE; + game::gfxDrawMethod->forceTechType = dvars::r_fullbright->current.enabled ? get_fullbright_technique() : 254; + } + + void r_init_draw_method_stub() + { + gfxdrawmethod(); + } + + bool r_update_front_end_dvar_options_stub() + { + if (dvars::r_fullbright->modified) + { + dvars::r_fullbright->modified = false; + game::R_SyncRenderThread(); + + gfxdrawmethod(); + } + + return r_update_front_end_dvar_options_hook.invoke(); + } + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + dvars::r_fullbright = dvars::register_int("r_fullbright", 0, 0, 3, game::DVAR_FLAG_SAVED); + + r_init_draw_method_hook.create(game::base_address + 0x72F950, &r_init_draw_method_stub); + r_update_front_end_dvar_options_hook.create(game::base_address + 0x76EE70, &r_update_front_end_dvar_options_stub); + } + }; +} + +REGISTER_COMPONENT(renderer::component) diff --git a/src/game/dvars.cpp b/src/game/dvars.cpp index d4704c39..0dfe623f 100644 --- a/src/game/dvars.cpp +++ b/src/game/dvars.cpp @@ -17,6 +17,8 @@ namespace dvars game::dvar_t* jump_enableFallDamage; + game::dvar_t* r_fullbright; + std::string dvar_get_vector_domain(const int components, const game::dvar_limits& domain) { if (domain.vector.min == -FLT_MAX) diff --git a/src/game/dvars.hpp b/src/game/dvars.hpp index e3780be4..034bed0a 100644 --- a/src/game/dvars.hpp +++ b/src/game/dvars.hpp @@ -18,6 +18,8 @@ namespace dvars extern game::dvar_t* jump_enableFallDamage; + extern game::dvar_t* r_fullbright; + extern std::vector dvar_list; std::string dvar_get_vector_domain(const int components, const game::dvar_limits& domain); diff --git a/src/game/scripting/function_tables.cpp b/src/game/scripting/function_tables.cpp index 0387e471..04471e0d 100644 --- a/src/game/scripting/function_tables.cpp +++ b/src/game/scripting/function_tables.cpp @@ -340,19 +340,19 @@ namespace scripting {"sub_7ff7de27d2f0", 402}, {"getnumparts", 403}, {"sub_7ff7de29eea0", 404}, - {"sub_7ff7de294120", 414}, - {"sub_7ff7de2941a0", 415}, - {"nullsub_475", 416}, - {"sub_7ff7de2a1680", 417}, + {"iprintln", 414}, + {"iprintlnbold", 415}, + {"logstring", 416}, + {"getent", 417}, {"getentarray", 418}, - {"addstruct", 421}, - {"sub_7ff7de2942f0", 423}, - {"isagent", 424}, - {"sub_7ff7de2673e0", 425}, - {"sub_7ff7de2673f0", 426}, - {"sub_7ff7de267710", 427}, - {"missiledeleteattractor", 429}, - {"addagent", 431}, + {"spawnstruct", 421}, + {"isalive", 423}, + {"isspawner", 424}, + {"missile_createattractororigin", 425}, + {"missile_createrepulsorent", 426}, + {"missile_createrepulsororigin", 427}, + {"missile_deleteattractor", 429}, + {"newhudelem", 431}, {"newclienthudelem", 432}, {"sub_7ff7de358350", 434}, {"isvalidmissile", 435}, diff --git a/src/game/structs.hpp b/src/game/structs.hpp index 4546f81d..79752635 100644 --- a/src/game/structs.hpp +++ b/src/game/structs.hpp @@ -733,4 +733,24 @@ namespace game unsigned __int16 childVariableBucket[65536]; ChildVariableValue childVariableValue[384000]; }; + + enum GfxDrawSceneMethod + { + GFX_DRAW_SCENE_STANDARD = 0x0, + }; + + enum MaterialTechniqueType + { + TECHNIQUE_UNLIT = 8, + TECHNIQUE_EMISSIVE = 9, + TECHNIQUE_LIT = 13, + }; + + struct GfxDrawMethod_s + { + int drawScene; + int baseTechType; + int emissiveTechType; + int forceTechType; + }; } \ No newline at end of file diff --git a/src/game/symbols.hpp b/src/game/symbols.hpp index 07ea0f20..8bde3471 100644 --- a/src/game/symbols.hpp +++ b/src/game/symbols.hpp @@ -59,6 +59,7 @@ namespace game const float* color, int style, int cursorPos, char cursor)> R_AddCmdDrawTextWithCursor{0x76CAF0}; WEAK symbol R_RegisterFont{0x746FE0}; WEAK symbol R_TextWidth{0x7472A0}; + WEAK symbol R_SyncRenderThread{0x76E7D0}; WEAK symbol ScrPlace_GetViewPlacement{0x3E16A0}; @@ -82,6 +83,8 @@ namespace game WEAK symbol g_entities{0x52DDDA0}; + WEAK symbol gfxDrawMethod{0xEDF9E00}; + WEAK symbol keyCatchers{0x203F3C0}; WEAK symbol playerKeys{0x1E8767C};