VGUI: reverse engineer and rework CEngineVGui vftable

This commit is contained in:
Kawe Mazidjatari 2024-11-24 12:17:23 +01:00
parent c09e6d6948
commit 02a0088deb
5 changed files with 194 additions and 73 deletions

View File

@ -0,0 +1,121 @@
//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
// $Workfile: $
// $Date: $
// $NoKeywords: $
//===========================================================================//
#if !defined( IENGINEVGUI_H )
#define IENGINEVGUI_H
#ifdef _WIN32
#pragma once
#endif
//#include "interface.h"
#include "vgui/vgui.h"
// Forward declarations.
namespace vgui
{
class Panel;
};
// Todo: r5 seems to have the same number of enumerants, however the order is
// still unconfirmed!
enum VGuiPanel_t
{
PANEL_ROOT = 0,
PANEL_GAMEUIDLL, // the console, game menu
PANEL_CLIENTDLL,
PANEL_TOOLS,
PANEL_INGAMESCREENS,
PANEL_GAMEDLL,
PANEL_CLIENTDLL_TOOLS,
PANEL_GAMEUIBACKGROUND, // the console background, shows under all other stuff in 3d engine view
PANEL_TRANSITIONEFFECT,
PANEL_STEAMOVERLAY,
};
// In-game panels are cropped to the current engine viewport size
enum PaintMode_t
{
PAINT_UIPANELS = (1 << 0),
PAINT_INGAMEPANELS = (1 << 1),
};
// Might not be complete:
enum LevelLoadingProgress_e
{
PROGRESS_INVALID = -2,
PROGRESS_DEFAULT = -1,
PROGRESS_NONE,
PROGRESS_CHANGELEVEL,
PROGRESS_SPAWNSERVER,
PROGRESS_LOADWORLDMODEL,
PROGRESS_CRCMAP,
PROGRESS_CRCCLIENTDLL,
PROGRESS_CREATENETWORKSTRINGTABLES,
PROGRESS_PRECACHEWORLD,
PROGRESS_CLEARWORLD,
PROGRESS_LEVELINIT,
PROGRESS_PRECACHE,
PROGRESS_ACTIVATESERVER,
PROGRESS_BEGINCONNECT,
PROGRESS_SIGNONCHALLENGE,
PROGRESS_SIGNONCONNECT,
PROGRESS_SIGNONCONNECTED,
PROGRESS_PROCESSSERVERINFO,
PROGRESS_PROCESSSTRINGTABLE,
PROGRESS_SIGNONNEW,
PROGRESS_SENDCLIENTINFO,
PROGRESS_SENDSIGNONDATA,
PROGRESS_SIGNONSPAWN,
PROGRESS_CREATEENTITIES,
PROGRESS_FULLYCONNECTED,
PROGRESS_PRECACHELIGHTING,
PROGRESS_READYTOPLAY,
PROGRESS_HIGHESTITEM, // must be last item in list
};
abstract_class IEngineVGui
{
public:
virtual ~IEngineVGui(void) { }
virtual vgui::VPANEL GetPanel(const VGuiPanel_t type) = 0;
virtual vgui::VPANEL GetRootPanel(const VGuiPanel_t type) = 0;
virtual void Unknown0() = 0;
virtual bool Unknown1() = 0; // ReturnFalse
virtual bool IsGameUIVisible() = 0;
virtual void ActivateGameUI() = 0;
virtual void HideGameUI() = 0;
virtual void Simulate() = 0;
virtual bool IsNotAllowedToHideGameUI() = 0;
virtual void SetRuiFuncs(void* const ruiFuncsStruct) = 0;
virtual void UpdateProgressBar(const LevelLoadingProgress_e progress) = 0;
virtual void Unknown3() = 0;
virtual void Unknown4() = 0;
};
#define VENGINE_VGUI_VERSION "VEngineVGui001"
//#if defined(_STATIC_LINKED) && defined(CLIENT_DLL)
//namespace Client
//{
// extern IEngineVGui* enginevgui;
//}
//#else
//extern IEngineVGui* enginevgui;
//#endif
#endif // IENGINEVGUI_H

View File

@ -4,11 +4,15 @@ add_module( "lib" "vgui" "vpc" ${FOLDER_CONTEXT} TRUE TRUE )
start_sources() start_sources()
add_sources( SOURCE_GROUP "Runtime" add_sources( SOURCE_GROUP "Runtime"
"vgui.h"
"vgui_baseui_interface.cpp" "vgui_baseui_interface.cpp"
"vgui_baseui_interface.h" "vgui_baseui_interface.h"
) )
add_sources( SOURCE_GROUP "Public"
"${ENGINE_SOURCE_DIR}/public/vgui/vgui.h"
"${ENGINE_SOURCE_DIR}/public/vgui/ienginevgui.h"
)
add_sources( SOURCE_GROUP "Debug" add_sources( SOURCE_GROUP "Debug"
"vgui_debugpanel.cpp" "vgui_debugpanel.cpp"
"vgui_debugpanel.h" "vgui_debugpanel.h"
@ -16,7 +20,7 @@ add_sources( SOURCE_GROUP "Debug"
"vgui_fpspanel.h" "vgui_fpspanel.h"
) )
add_sources( SOURCE_GROUP "vgui_controls" add_sources( SOURCE_GROUP "Controls"
"vgui_controls/RichText.cpp" "vgui_controls/RichText.cpp"
"vgui_controls/RichText.h" "vgui_controls/RichText.h"
) )

View File

@ -15,7 +15,7 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: // Purpose:
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
int CEngineVGui::Paint(CEngineVGui* thisptr, PaintMode_t mode) int CEngineVGui::VPaint(CEngineVGui* const thisptr, const PaintMode_t mode)
{ {
int result = CEngineVGui__Paint(thisptr, mode); int result = CEngineVGui__Paint(thisptr, mode);
@ -30,7 +30,7 @@ int CEngineVGui::Paint(CEngineVGui* thisptr, PaintMode_t mode)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
void VEngineVGui::Detour(const bool bAttach) const void VEngineVGui::Detour(const bool bAttach) const
{ {
DetourSetup(&CEngineVGui__Paint, &CEngineVGui::Paint, bAttach); DetourSetup(&CEngineVGui__Paint, &CEngineVGui::VPaint, bAttach);
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -1,83 +1,79 @@
#pragma once #pragma once
#include "public/vgui/ienginevgui.h"
#include <engine/server/sv_main.h> #include <engine/server/sv_main.h>
#include <vguimatsurface/MatSystemSurface.h> #include <vguimatsurface/MatSystemSurface.h>
#include "inputsystem/iinputsystem.h" #include "inputsystem/iinputsystem.h"
enum class PaintMode_t abstract_class IEngineVGuiInternal : public IEngineVGui
{
PAINT_UIPANELS = (1 << 0),
PAINT_INGAMEPANELS = (1 << 1),
};
// Might not be complete:
enum LevelLoadingProgress_e
{
PROGRESS_INVALID = -2,
PROGRESS_DEFAULT = -1,
PROGRESS_NONE,
PROGRESS_CHANGELEVEL,
PROGRESS_SPAWNSERVER,
PROGRESS_LOADWORLDMODEL,
PROGRESS_CRCMAP,
PROGRESS_CRCCLIENTDLL,
PROGRESS_CREATENETWORKSTRINGTABLES,
PROGRESS_PRECACHEWORLD,
PROGRESS_CLEARWORLD,
PROGRESS_LEVELINIT,
PROGRESS_PRECACHE,
PROGRESS_ACTIVATESERVER,
PROGRESS_BEGINCONNECT,
PROGRESS_SIGNONCHALLENGE,
PROGRESS_SIGNONCONNECT,
PROGRESS_SIGNONCONNECTED,
PROGRESS_PROCESSSERVERINFO,
PROGRESS_PROCESSSTRINGTABLE,
PROGRESS_SIGNONNEW,
PROGRESS_SENDCLIENTINFO,
PROGRESS_SENDSIGNONDATA,
PROGRESS_SIGNONSPAWN,
PROGRESS_CREATEENTITIES,
PROGRESS_FULLYCONNECTED,
PROGRESS_PRECACHELIGHTING,
PROGRESS_READYTOPLAY,
PROGRESS_HIGHESTITEM, // must be last item in list
};
class CEngineVGui
{ {
public: public:
static int Paint(CEngineVGui* thisptr, PaintMode_t mode); virtual int Init() = 0;
virtual void Connect() = 0;
virtual void Shutdown() = 0;
virtual bool SetVGUIDirectories() = 0;
virtual bool IsInitialized() const = 0;
virtual CreateInterfaceFn GetGameUIFactory() = 0;
void UpdateProgressBar(LevelLoadingProgress_e progress) virtual bool Key_Event(const InputEvent_t& event) = 0;
{ virtual bool StartFixed_Event(const InputEvent_t& event) = 0;
int index = 11; virtual bool StartMapped_Event(const InputEvent_t& event) = 0;
CallVFunc<void>(index, this, progress);
} virtual void Unknown5() = 0;
void EnabledProgressBarForNextLoad(void) virtual void Unknown6() = 0;
{
int index = 31; virtual void Paint(const PaintMode_t mode) = 0;
CallVFunc<void>(index, this);
} virtual void Unknown7() = 0; // NullSub
void ShowErrorMessage(void) virtual void Unknown8() = 0; // NullSub
{ virtual void Unknown9() = 0; // NullSub
int index = 35;
CallVFunc<void>(index, this); // level loading
} virtual void OnLevelLoadingStarted(const char* const levelName) = 0;
void HideLoadingPlaque(void) virtual void OnLevelLoadingFinished() = 0;
{
int index = 36; virtual void EnabledProgressBarForNextLoad() = 0;
CallVFunc<void>(index, this);
} virtual void Unknown10() = 0; // something with load movies?
bool ShouldPause(void) virtual void Unknown11() = 0;
{ virtual void Unknown12() = 0;
int index = 37;
return CallVFunc<bool>(index, this); virtual void ShowErrorMessage() = 0;
} virtual void HideLoadingPlaque() = 0;
virtual bool ShouldPause() = 0;
virtual void Unknown13() = 0;
virtual void Unknown14() = 0;
virtual void Unknown15() = 0;
virtual void Unknown16() = 0;
virtual void Unknown17() = 0;
virtual void Unknown18() = 0;
virtual void Unknown19() = 0;
virtual void Unknown20() = 0;
virtual void Unknown21() = 0;
virtual void Unknown22() = 0;
virtual void Unknown23() = 0;
virtual void SetNotAllowedToHideGameUI(const bool bNotAllowedToHide) = 0;
virtual void SetNotAllowedToShowGameUI(const bool bNotAllowedToShow) = 0;
virtual void Unknown24() = 0;
virtual void Unknown25() = 0;
virtual void Unknown26() = 0;
virtual void Unknown27() = 0;
virtual void Unknown28() = 0;
virtual void Unknown29() = 0;
virtual void Unknown30() = 0;
virtual void Unknown31() = 0; // NullSub
};
class CEngineVGui : public IEngineVGuiInternal
{
public:
static int VPaint(CEngineVGui* const thisptr, const PaintMode_t mode);
}; };
/* ==== CENGINEVGUI ===================================================================================================================================================== */ /* ==== CENGINEVGUI ===================================================================================================================================================== */
inline int(*CEngineVGui__Paint)(CEngineVGui* thisptr, PaintMode_t mode); inline int(*CEngineVGui__Paint)(CEngineVGui* const thisptr, const PaintMode_t mode);
inline void*(*CEngineVGui__RenderStart)(CMatSystemSurface* pMatSystemSurface); inline void*(*CEngineVGui__RenderStart)(CMatSystemSurface* pMatSystemSurface);
inline void*(*CEngineVGui__RenderEnd)(void); inline void*(*CEngineVGui__RenderEnd)(void);