/* =========================================================================== Copyright (C) 1999 - 2005, Id Software, Inc. Copyright (C) 2000 - 2013, Raven Software, Inc. Copyright (C) 2001 - 2013, Activision, Inc. Copyright (C) 2013 - 2015, OpenJK contributors This file is part of the OpenJK source code. OpenJK is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . =========================================================================== */ /********************************************************************** UI_ATOMS.C User interface building blocks and support functions. **********************************************************************/ #include "ui_local.h" #define NUM_UI_ARGSTRS (4) #define UI_ARGSTR_MASK (NUM_UI_ARGSTRS-1) static char tempArgStrs[NUM_UI_ARGSTRS][MAX_STRING_CHARS]; static char *UI_Argv( int arg ) { static int index=0; char *s = tempArgStrs[index++ & UI_ARGSTR_MASK]; trap->Cmd_Argv( arg, s, MAX_STRING_CHARS ); return s; } #define NUM_UI_CVARSTRS (4) #define UI_CVARSTR_MASK (NUM_UI_CVARSTRS-1) static char tempCvarStrs[NUM_UI_CVARSTRS][MAX_CVAR_VALUE_STRING]; char *UI_Cvar_VariableString( const char *name ) { static int index=0; char *s = tempCvarStrs[index++ & UI_ARGSTR_MASK]; trap->Cvar_VariableStringBuffer( name, s, MAX_CVAR_VALUE_STRING ); return s; } static void UI_Cache_f( void ) { Display_CacheAll(); if ( trap->Cmd_Argc() == 2 ) { int i; for ( i=0; iPrint( "model %s\n", uiInfo.q3HeadNames[i] ); } } } static void UI_OpenMenu_f( void ) { Menus_CloseAll(); if ( Menus_ActivateByName( UI_Argv( 1 ) ) ) trap->Key_SetCatcher( KEYCATCH_UI ); } static void UI_OpenSiegeMenu_f( void ) { if ( trap->Cvar_VariableValue( "g_gametype" ) == GT_SIEGE ) { Menus_CloseAll(); if ( Menus_ActivateByName( UI_Argv( 1 ) ) ) trap->Key_SetCatcher( KEYCATCH_UI ); } } typedef struct consoleCommand_s { const char *cmd; void (*func)(void); } consoleCommand_t; int cmdcmp( const void *a, const void *b ) { return Q_stricmp( (const char *)a, ((consoleCommand_t*)b)->cmd ); } static consoleCommand_t commands[] = { { "ui_cache", UI_Cache_f }, { "ui_load", UI_Load }, { "ui_openmenu", UI_OpenMenu_f }, { "ui_opensiegemenu", UI_OpenSiegeMenu_f }, { "ui_report", UI_Report }, }; static const size_t numCommands = ARRAY_LEN( commands ); /* ================= UI_ConsoleCommand The string has been tokenized and can be retrieved with Cmd_Argc() / Cmd_Argv() ================= */ qboolean UI_ConsoleCommand( int realTime ) { consoleCommand_t *command = NULL; uiInfo.uiDC.frameTime = realTime - uiInfo.uiDC.realTime; uiInfo.uiDC.realTime = realTime; command = (consoleCommand_t *)Q_LinearSearch( UI_Argv( 0 ), commands, numCommands, sizeof( commands[0] ), cmdcmp ); if ( !command ) return qfalse; command->func(); return qtrue; } 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; } trap->R_DrawStretchPic( x, y, w, h, s0, t0, s1, t1, 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 ); trap->R_DrawStretchPic( x, y, width, height, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); trap->R_SetColor( NULL ); } void UI_DrawSides(float x, float y, float w, float h) { trap->R_DrawStretchPic( x, y, 1, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); trap->R_DrawStretchPic( x + w - 1, y, 1, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); } void UI_DrawTopBottom(float x, float y, float w, float h) { trap->R_DrawStretchPic( x, y, w, 1, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); trap->R_DrawStretchPic( x, y + h - 1, w, 1, 0, 0, 0, 0, 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 ); }