Skip to content

Commit

Permalink
VideoModes: choosing renderer from menu
Browse files Browse the repository at this point in the history
  • Loading branch information
a1batross committed Aug 9, 2019
1 parent 704012c commit c3095f4
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
5 changes: 5 additions & 0 deletions enginecallback_menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,11 @@ class EngFuncs
static int UtfProcessChar( int ch );
static int UtfMoveLeft( const char *str, int pos );
static int UtfMoveRight( const char *str, int pos, int length );

static inline bool GetRenderers( int num, char *sz1, size_t s1, char *sz2, size_t s2 )
{
return textfuncs.pfnGetRenderers( num, sz1, s1, sz2, s2 ) != 0;
}
};


Expand Down
89 changes: 89 additions & 0 deletions menus/VideoModes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "CheckBox.h"
#include "Action.h"
#include "YesNoMessageBox.h"
#include "SpinControl.h"
#include "utlvector.h"

#define ART_BANNER "gfx/shell/head_vidmodes"

Expand All @@ -50,6 +52,43 @@ class CMenuVidModesModel : public CMenuBaseModel
const char *m_szModes[64];
};

class CMenuRenderersModel : public CMenuBaseArrayModel
{
public:
void Update() override
{
refdll temp;

for( unsigned int i = 0;
EngFuncs::GetRenderers( i, temp.shortName, sizeof( temp.shortName ), temp.readable, sizeof( temp.readable ));
i++ )
{
m_refs.AddToTail( temp );
}
}
int GetRows() const override { return m_refs.Count(); }
const char *GetText( int i ) override { return m_refs[i].readable; }

const char *GetShortName( int i ) { return m_refs[i].shortName; }
void Add( const char *str )
{
refdll temp;

Q_strncpy( temp.shortName, str, sizeof( temp.shortName ));
Q_strncpy( temp.readable, str, sizeof( temp.readable ));

m_refs.AddToTail( temp );
}
private:
struct refdll
{
char shortName[64];
char readable[64];
};

CUtlVector<refdll> m_refs;
};

class CMenuVidModes : public CMenuFramework
{
private:
Expand All @@ -64,6 +103,37 @@ class CMenuVidModes : public CMenuFramework
void SetConfig( );
void RevertChanges();
void ApplyChanges();
void GetRendererConfig()
{
const char *refdll = EngFuncs::GetCvarString( "r_refdll" );

if( !refdll[0] )
{
renderers.SetCurrentValue( 0.0f );
}

int i;
for( i = 0; i < renderersModel.GetRows(); i++ )
{
if( !stricmp( renderersModel.GetShortName( i ), refdll ) )
{
renderers.SetCurrentValue( i );
break;
}
}

if( i == renderersModel.GetRows() )
{
renderersModel.Add( refdll );
renderers.SetCurrentValue( i );
}
}

void WriteRendererConfig()
{
int i = renderers.GetCurrentValue();
EngFuncs::CvarSetString( "r_refdll", renderersModel.GetShortName( i ));
}

CMenuCheckBox windowed;
CMenuCheckBox vsync;
Expand All @@ -73,6 +143,9 @@ class CMenuVidModes : public CMenuFramework

CMenuYesNoMessageBox testModeMsgBox;

CMenuRenderersModel renderersModel;
CMenuSpinControl renderers;

int prevMode;
int prevModeX;
int prevModeY;
Expand Down Expand Up @@ -161,6 +234,10 @@ void CMenuVidModes::SetConfig( )
testModeMsgBox.Show();
testModeTimer = gpGlobals->time + 10.0f; // ten seconds should be enough
}
else
{
Hide();
}
}

void CMenuVidModes::ApplyChanges()
Expand Down Expand Up @@ -253,13 +330,25 @@ void CMenuVidModes::_Init( void )
testModeMsgBox.onNegative = VoidCb( &CMenuVidModes::RevertChanges );
testModeMsgBox.Link( this );

renderersModel.Update();
renderers.szName = L( "GameUI_Renderer" );
renderers.Setup( &renderersModel );
renderers.SetRect( 80, 480, 250, 32 );
renderers.SetCharSize( QM_SMALLFONT );
renderers.onCvarGet = VoidCb( &CMenuVidModes::GetRendererConfig );
renderers.onCvarWrite = VoidCb( &CMenuVidModes::WriteRendererConfig );
renderers.bUpdateImmediately = true;

AddItem( background );
AddItem( banner );
AddButton( L( "GameUI_Apply" ), L( "Apply changes" ), PC_OK, VoidCb( &CMenuVidModes::SetConfig ) );
AddButton( L( "GameUI_Cancel" ), L( "Return back to previous menu" ), PC_CANCEL, VoidCb( &CMenuVidModes::Hide ) );
AddItem( renderers );
AddItem( windowed );
AddItem( vsync );
AddItem( vidList );

renderers.LinkCvar( "r_refdll", CMenuEditable::CVAR_STRING );
}

void CMenuVidModes::_VidInit()
Expand Down

0 comments on commit c3095f4

Please sign in to comment.