309 lines
6.5 KiB
C
309 lines
6.5 KiB
C
// Copyright (C) 2001-2002 Raven Software.
|
|
//
|
|
// User interface building blocks and support functions.
|
|
|
|
#include "ui_local.h"
|
|
|
|
// these are here so the functions in q_shared.c can link
|
|
#ifndef UI_HARD_LINKED
|
|
|
|
/*
|
|
=================
|
|
Com_Error
|
|
|
|
reports an error to the console and shuts down any active game
|
|
=================
|
|
*/
|
|
void QDECL Com_Error( int level, const char *error, ... )
|
|
{
|
|
va_list argptr;
|
|
char text[1024];
|
|
|
|
va_start (argptr, error);
|
|
vsprintf (text, error, argptr);
|
|
va_end (argptr);
|
|
|
|
trap_Error( va("%s", text) );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
Com_Printf
|
|
|
|
Outputs text to the console
|
|
=================
|
|
*/
|
|
void QDECL Com_Printf( const char *msg, ... )
|
|
{
|
|
va_list argptr;
|
|
char text[1024];
|
|
|
|
va_start (argptr, msg);
|
|
vsprintf (text, msg, argptr);
|
|
va_end (argptr);
|
|
|
|
trap_Print( va("%s", text) );
|
|
}
|
|
|
|
#endif
|
|
|
|
char *UI_Argv( int arg ) {
|
|
static char buffer[MAX_STRING_CHARS];
|
|
|
|
trap_Argv( arg, buffer, sizeof( buffer ) );
|
|
|
|
return buffer;
|
|
}
|
|
|
|
|
|
char *UI_Cvar_VariableString( const char *var_name ) {
|
|
static char buffer[MAX_STRING_CHARS];
|
|
|
|
trap_Cvar_VariableStringBuffer( var_name, buffer, sizeof( buffer ) );
|
|
|
|
return buffer;
|
|
}
|
|
|
|
|
|
|
|
static void UI_Cache_f()
|
|
{
|
|
Display_CacheAll();
|
|
}
|
|
|
|
/*
|
|
=================
|
|
UI_ConsoleCommand
|
|
=================
|
|
*/
|
|
qboolean UI_ConsoleCommand( int realTime )
|
|
{
|
|
char *cmd;
|
|
|
|
uiInfo.uiDC.frameTime = realTime - uiInfo.uiDC.realTime;
|
|
uiInfo.uiDC.realTime = realTime;
|
|
|
|
cmd = UI_Argv( 0 );
|
|
|
|
// ensure minimum menu data is available
|
|
//Menu_Cache();
|
|
if ( Q_stricmp (cmd, "ui_report") == 0 )
|
|
{
|
|
UI_Report();
|
|
return qtrue;
|
|
}
|
|
|
|
if ( Q_stricmp (cmd, "ui_reload") == 0 )
|
|
{
|
|
UI_Reload();
|
|
return qtrue;
|
|
}
|
|
|
|
if ( Q_stricmp ( cmd, "ui_openmenu" ) == 0 )
|
|
{
|
|
// Menus_CloseAll ( );
|
|
Menus_OpenByName ( UI_Argv(1) );
|
|
return qtrue;
|
|
}
|
|
|
|
if ( Q_stricmp (cmd, "remapShader") == 0 )
|
|
{
|
|
if (trap_Argc() == 4)
|
|
{
|
|
char shader1[MAX_QPATH];
|
|
char shader2[MAX_QPATH];
|
|
Q_strncpyz(shader1, UI_Argv(1), sizeof(shader1));
|
|
Q_strncpyz(shader2, UI_Argv(2), sizeof(shader2));
|
|
trap_R_RemapShader(shader1, shader2, UI_Argv(3));
|
|
return qtrue;
|
|
}
|
|
}
|
|
|
|
if ( Q_stricmp (cmd, "ui_cache") == 0 )
|
|
{
|
|
UI_Cache_f();
|
|
return qtrue;
|
|
}
|
|
|
|
if ( Q_stricmp (cmd, "ui_cdkey") == 0 )
|
|
{
|
|
//UI_CDKeyMenu_f();
|
|
return qtrue;
|
|
}
|
|
|
|
return qfalse;
|
|
}
|
|
|
|
/*
|
|
=================
|
|
UI_Shutdown
|
|
=================
|
|
*/
|
|
void UI_Shutdown( void )
|
|
{
|
|
}
|
|
|
|
/*
|
|
================
|
|
UI_AdjustFrom640
|
|
|
|
Adjusted for resolution and screen aspect ratio
|
|
================
|
|
*/
|
|
void UI_AdjustFrom640( float *x, float *y, float *w, float *h ) {
|
|
// expect valid pointers
|
|
#if 0
|
|
*x = *x * uiInfo.uiDC.scale + uiInfo.uiDC.bias;
|
|
*y *= uiInfo.uiDC.scale;
|
|
*w *= uiInfo.uiDC.scale;
|
|
*h *= uiInfo.uiDC.scale;
|
|
#endif
|
|
|
|
*x *= uiInfo.uiDC.xscale;
|
|
*y *= uiInfo.uiDC.yscale;
|
|
*w *= uiInfo.uiDC.xscale;
|
|
*h *= uiInfo.uiDC.yscale;
|
|
|
|
}
|
|
|
|
void UI_DrawNamedPic( float x, float y, float width, float height, const char *picname ) {
|
|
qhandle_t hShader;
|
|
|
|
hShader = trap_R_RegisterShaderNoMip( picname );
|
|
UI_AdjustFrom640( &x, &y, &width, &height );
|
|
trap_R_DrawStretchPic( x, y, width, height, 0, 0, 1, 1, NULL, hShader );
|
|
}
|
|
|
|
void UI_DrawHandlePic( float x, float y, float w, float h, qhandle_t hShader ) {
|
|
float s0;
|
|
float s1;
|
|
float t0;
|
|
float t1;
|
|
|
|
if( w < 0 ) { // flip about vertical
|
|
w = -w;
|
|
s0 = 1;
|
|
s1 = 0;
|
|
}
|
|
else {
|
|
s0 = 0;
|
|
s1 = 1;
|
|
}
|
|
|
|
if( h < 0 ) { // flip about horizontal
|
|
h = -h;
|
|
t0 = 1;
|
|
t1 = 0;
|
|
}
|
|
else {
|
|
t0 = 0;
|
|
t1 = 1;
|
|
}
|
|
|
|
UI_AdjustFrom640( &x, &y, &w, &h );
|
|
trap_R_DrawStretchPic( x, y, w, h, s0, t0, s1, t1, NULL, hShader );
|
|
}
|
|
|
|
/*
|
|
================
|
|
UI_FillRect
|
|
|
|
Coordinates are 640*480 virtual values
|
|
=================
|
|
*/
|
|
void UI_FillRect( float x, float y, float width, float height, const float *color )
|
|
{
|
|
trap_R_SetColor( color );
|
|
|
|
UI_AdjustFrom640( &x, &y, &width, &height );
|
|
trap_R_DrawStretchPic( x, y, width, height, 0, 0, 0, 0, NULL, uiInfo.uiDC.whiteShader );
|
|
|
|
trap_R_SetColor( NULL );
|
|
}
|
|
|
|
void UI_DrawSides(float x, float y, float w, float h) {
|
|
UI_AdjustFrom640( &x, &y, &w, &h );
|
|
trap_R_DrawStretchPic( x, y, 1, h, 0, 0, 0, 0, NULL, uiInfo.uiDC.whiteShader );
|
|
trap_R_DrawStretchPic( x + w - 1, y, 1, h, 0, 0, 0, 0, NULL, uiInfo.uiDC.whiteShader );
|
|
}
|
|
|
|
void UI_DrawTopBottom(float x, float y, float w, float h) {
|
|
UI_AdjustFrom640( &x, &y, &w, &h );
|
|
trap_R_DrawStretchPic( x, y, w, 1, 0, 0, 0, 0, NULL, uiInfo.uiDC.whiteShader );
|
|
trap_R_DrawStretchPic( x, y + h - 1, w, 1, 0, 0, 0, 0, NULL, uiInfo.uiDC.whiteShader );
|
|
}
|
|
/*
|
|
================
|
|
UI_DrawRect
|
|
|
|
Coordinates are 640*480 virtual values
|
|
=================
|
|
*/
|
|
void UI_DrawRect( float x, float y, float width, float height, const float *color )
|
|
{
|
|
trap_R_SetColor( color );
|
|
|
|
UI_DrawTopBottom(x, y, width, height);
|
|
UI_DrawSides(x, y, width, height);
|
|
|
|
trap_R_SetColor( NULL );
|
|
}
|
|
|
|
void UI_SetColor( const float *rgba )
|
|
{
|
|
trap_R_SetColor( rgba );
|
|
}
|
|
|
|
void UI_UpdateScreen( qboolean IsLoading ) {
|
|
trap_UpdateScreen(IsLoading);
|
|
}
|
|
|
|
|
|
void UI_DrawTextBox (int x, int y, int width, int lines)
|
|
{
|
|
UI_FillRect( x + BIGCHAR_WIDTH/2, y + BIGCHAR_HEIGHT/2, ( width + 1 ) * BIGCHAR_WIDTH, ( lines + 1 ) * BIGCHAR_HEIGHT, colorBlack );
|
|
UI_DrawRect( x + BIGCHAR_WIDTH/2, y + BIGCHAR_HEIGHT/2, ( width + 1 ) * BIGCHAR_WIDTH, ( lines + 1 ) * BIGCHAR_HEIGHT, colorWhite );
|
|
}
|
|
|
|
qboolean UI_CursorInRect (int x, int y, int width, int height)
|
|
{
|
|
if (uiInfo.uiDC.cursorx < x ||
|
|
uiInfo.uiDC.cursory < y ||
|
|
uiInfo.uiDC.cursorx > x+width ||
|
|
uiInfo.uiDC.cursory > y+height)
|
|
return qfalse;
|
|
|
|
return qtrue;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
UI_DrawText
|
|
|
|
Renders text on the screen
|
|
=====================
|
|
*/
|
|
void UI_DrawText ( float x, float y, qhandle_t font, float scale, vec4_t color, const char* text, int limit, int flags )
|
|
{
|
|
x *= uiInfo.uiDC.xscale;
|
|
y *= uiInfo.uiDC.yscale;
|
|
scale *= uiInfo.uiDC.xscale;
|
|
|
|
trap_R_DrawText ( (int)x, (int)y, font, scale, color, text, limit, flags );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
UI_DrawTextWithCursor
|
|
|
|
Renders text on the screen with a blinking cursor
|
|
=====================
|
|
*/
|
|
void UI_DrawTextWithCursor ( float x, float y, qhandle_t font, float scale, vec4_t color, const char* text, int limit, int flags, int cursorPos, char cursor )
|
|
{
|
|
x *= uiInfo.uiDC.xscale;
|
|
y *= uiInfo.uiDC.yscale;
|
|
scale *= uiInfo.uiDC.xscale;
|
|
|
|
trap_R_DrawTextWithCursor ( (int)x, (int)y, font, scale, color, text, limit, flags, cursorPos, cursor );
|
|
}
|