// 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 ); }