Compare commits

...
33 Commits
Author SHA1 Message Date
OM e9c7a1f959 Changed version number to 0.51 2023-05-20 02:19:35 +02:00
OM c4502469f4 Partially implemented UIListBox and UIList 2023-05-20 02:15:52 +02:00
OM c2cb15a1d1 Implemented UIListCtrl 2023-05-20 01:52:31 +02:00
OM 4d108a272f The scoreboard is now properly working 2023-05-20 01:20:20 +02:00
OM f523c32044 Partial implementation of UIList 2023-05-20 01:19:17 +02:00
OM 5ac5632e59 Export *CL_FinishedIntro* and *UI_StartStageKeyEvent* 2023-05-20 01:02:14 +02:00
OM 80f3296854 *CL_GetSnapshot* will take parent entities into account 2023-05-20 01:01:54 +02:00
OM 1b1433dd1b Removed useless cgame fields 2023-05-20 01:00:08 +02:00
OM 7647bbaf36 *CL_KeyEvent*: call *UI_StartStageKeyEvent* if intro hasn't finished 2023-05-20 00:59:48 +02:00
OM f00fd281b3 Added *TIKI_CG_Command_ProcessFile* 2023-05-20 00:59:21 +02:00
OM b5ea1ddb53 Added weapon command button bits from cgame module 2023-05-19 23:15:45 +02:00
OM b16ce90be3 Added *UI_LoadResource* calls 2023-05-19 23:15:24 +02:00
OM 4c0f7a34de Updated BUTTON ucmd flags 2023-05-19 23:15:06 +02:00
OM 2e11cd4ea2 *CG_Command_ProcessFile*: call *cgi.LoadResource* to update the UI while loading 2023-05-19 21:34:59 +02:00
OM c2ad608508 Fixed parameters of *CG_PermanentMark* 2023-05-19 21:34:36 +02:00
OM 5ec8c901e2 Using float instead of long double in *CG_RegisterSounds* 2023-05-19 21:34:18 +02:00
OM e6bbbdb79e Updated URLs in the README file 2023-05-19 21:33:58 +02:00
OM f5fa8d15d1 Made loading screens work 2023-05-19 21:33:02 +02:00
OM 7aee02ba8d Implemented *Sys_PumpMessageLoop* 2023-05-19 21:32:51 +02:00
OM cf51e14cf5 Added FPS counter 2023-05-19 20:52:10 +02:00
OM 7fb383c810 Updated README with new screenshot 2023-05-19 20:51:51 +02:00
OM 34f66963e3 Implemented DrawStatCompass 2023-05-19 19:26:46 +02:00
OM 6059063b67 Added "constant" parameter for "rgbGen" 2023-05-19 17:48:24 +02:00
OM 8bf57017ac Proper implementation of *RE_AddPolyToScene*
+ Increased *MAX_POLYS* and *MAX_POLYVERTS*
2023-05-19 17:48:09 +02:00
OM 9f1d35a11b Statbar fix
Implemented *UIFakkLabel::DrawStatbar*
2023-05-19 17:34:01 +02:00
OM aa51987077 Moved *BG_EvaluateTrajectory* from *game/bg_misc.cpp* to *cgame/cg_ents.c* 2023-05-19 17:27:38 +02:00
OM 64055d2580 Using RT_MODEL instead of ET_MODELANIM_SKEL 2023-05-19 16:59:44 +02:00
OM 45e82c590e Set numSpheresUsed to 0 2023-05-19 16:59:20 +02:00
OM 0c92890ef2 Implemented CGEN_STATIC 2023-05-19 16:59:08 +02:00
OM 03e8a64283 Added parent support in *RE_AddRefEntityToScene* 2023-05-19 16:58:46 +02:00
OM 4e14535f08 Fixed stats not drawing properly 2023-05-19 15:44:42 +02:00
OM 356e7c51fc Fixed widget alignment problem 2023-05-19 15:44:31 +02:00
OM 52a146d664 Updated README (added screenshot) 2023-05-19 14:09:03 +02:00
48 changed files with 1728 additions and 834 deletions

No files matched your search

+8 -3
View File
@@ -85,6 +85,11 @@ These are the tools required on Unix :
Visual Studio (2019 or 2022) is generally preferred.
## Screenshots
![](docs/images/opm_50b_1.png)
![](docs/images/opm_50b_2.png)
## Third party
### SDL
@@ -121,8 +126,8 @@ https://xiph.org/vorbis/
https://opus-codec.org/
## URL
## URLs and communities
- https://openmohaa.sourceforge.net/
- https://github.com/openmoh/openmohaa/
- https://mohaaaa.co.uk/AAAAMOHAA/index.php
- https://x-null.net/
+9
View File
@@ -6363,6 +6363,7 @@ qboolean CG_Command_ProcessFile(const char* filename, qboolean quiet, dtiki_t *c
char* buffer;
const char* bufstart;
char com_token[MAX_STRING_CHARS];
char tempName[MAX_QPATH + 1];
if (cgi.FS_ReadFile(filename, (void**)&buffer, quiet) == -1) {
return qfalse;
@@ -6375,6 +6376,10 @@ qboolean CG_Command_ProcessFile(const char* filename, qboolean quiet, dtiki_t *c
// we are not setting up for a tiki
current_tiki = NULL;
// Update the loading screen
sprintf(tempName, "m%s", filename);
cgi.LoadResource(tempName);
bufstart = buffer;
while (1) {
@@ -6413,6 +6418,10 @@ qboolean CG_Command_ProcessFile(const char* filename, qboolean quiet, dtiki_t *c
}
cgi.FS_FreeFile((void*)bufstart);
// Update the loading screen
sprintf(tempName, "o%s", filename);
cgi.LoadResource(tempName);
return qtrue;
}
+30 -14
View File
@@ -414,6 +414,25 @@ void CG_Portal(centity_t* cent)
{
}
/*
================
BG_EvaluateTrajectory
================
*/
void BG_EvaluateTrajectory(const trajectory_t* tr, int atTime, const vec3_t base, vec3_t result) {
float deltaTime;
if (atTime > cg_smoothClientsTime->integer + tr->trTime) {
atTime = cg_smoothClientsTime->integer + tr->trTime;
}
deltaTime = (float)(atTime - tr->trTime) / 1000.0;
result[0] = tr->trDelta[0] * deltaTime + base[0];
result[1] = tr->trDelta[1] * deltaTime + base[1];
result[2] = tr->trDelta[2] * deltaTime + base[2];
}
/*
===============
CG_CalcEntityLerpPositions
@@ -477,8 +496,8 @@ void CG_CalcEntityLerpPositions( centity_t *cent )
// this will linearize a sine or parabolic curve, but it is important
// to not extrapolate player positions if more recent data is available
BG_EvaluateTrajectory(&cent->currentState.pos, cg.snap->serverTime, current);
BG_EvaluateTrajectory(&cent->nextState.pos, cg.nextSnap->serverTime, next);
BG_EvaluateTrajectory(&cent->currentState.pos, cg.snap->serverTime, cent->currentState.origin, current);
BG_EvaluateTrajectory(&cent->nextState.pos, cg.nextSnap->serverTime, cent->nextState.origin, next);
cent->lerpOrigin[0] = current[0] + f * (next[0] - current[0]);
cent->lerpOrigin[1] = current[1] + f * (next[1] - current[1]);
@@ -494,17 +513,11 @@ void CG_CalcEntityLerpPositions( centity_t *cent )
QuatToMat(quat, mat);
MatrixToEulerAngles(mat, cent->lerpAngles);
}
// Lerp legs, torso, and head angles
for (i = 0; i < 3; i++) {
cent->lerpAngles[i] = LerpAngle(current[i], next[i], f);
}
}
else {
// just use the current frame and evaluate as best we can
BG_EvaluateTrajectory(&cent->currentState.pos, cg.time, cent->lerpOrigin);
BG_EvaluateTrajectory(&cent->currentState.pos, cg.time, cent->currentState.origin, cent->lerpOrigin);
VectorCopy(cent->currentState.angles, cent->lerpAngles);
//BG_EvaluateTrajectory(&cent->currentState.apos, cg.time, cent->lerpAngles);
}
}
@@ -545,10 +558,10 @@ void CG_AddCEntity(centity_t* cent)
CG_ModelAnim(cent, qtrue);
break;
case ET_PLAYER:
CG_Player(cent);
case ET_ITEM:
case ET_EXEC_COMMANDS:
CG_ModelAnim(cent, qfalse);
CG_Player(cent);
CG_Splash(cent);
case ET_ITEM:
CG_ModelAnim(cent, qfalse);
break;
case ET_GENERAL:
CG_General(cent);
@@ -575,7 +588,10 @@ void CG_AddCEntity(centity_t* cent)
break;
case ET_ROPE: // skip
CG_Rope(cent);
break;
break;
case ET_EXEC_COMMANDS:
CG_ModelAnim(cent, qfalse);
break;
}
}
+3 -2
View File
@@ -590,6 +590,7 @@ void CG_PredictPlayerState( void );
//
// cg_ents.c
//
void BG_EvaluateTrajectory(const trajectory_t* tr, int atTime, const vec3_t base, vec3_t result);
void CG_SetEntitySoundPosition( centity_t *cent );
void CG_AddPacketEntities( void );
void CG_Beam( centity_t *cent );
@@ -632,8 +633,8 @@ void CG_ImpactMarkSimple(
);
void CG_InitTestTreadMark();
int CG_PermanentMark(
vec_t* origin,
vec_t* dir,
const vec3_t origin,
const vec3_t dir,
float orientation,
float fSScale,
float fTScale,
+8 -10
View File
@@ -194,23 +194,22 @@ called during a precache command
*/
void CG_RegisterSounds( void )
{
int startTime; // esi MAPDST
int endTime; // eax MAPDST
char filename[64]; // [esp+28h] [ebp-40h] BYREF
int startTime;
int endTime;
char filename[MAX_QPATH];
Com_Printf("\n\n-----------PARSING UBERSOUND------------\n");
Com_Printf(
"Any SetCurrentTiki errors means that tiki wasn't prefetched and "
"tiki-specific sounds for it won't work. To fix prefe"
"tch the tiki. Ignore if you don't use that tiki on this level.\n");
Com_sprintf(filename, 64, "ubersound/ubersound.scr");
Com_sprintf(filename, sizeof(filename), "ubersound/ubersound.scr");
startTime = cgi.Milliseconds();
CG_Command_ProcessFile(filename, 0, 0);
endTime = cgi.Milliseconds();
Com_Printf("Parse/Load time: %f seconds.\n",
(double)((long double)(endTime - startTime) / 1000.0));
Com_Printf("Parse/Load time: %f seconds.\n", (endTime - startTime) / 1000.0f);
Com_Printf("-------------UBERSOUND DONE---------------\n\n");
Com_Printf("\n\n-----------PARSING UBERDIALOG------------\n");
@@ -218,14 +217,13 @@ void CG_RegisterSounds( void )
"Any SetCurrentTiki errors means that tiki wasn't prefetched and "
"tiki-specific sounds for it won't work. To fix prefe"
"tch the tiki. Ignore if you don't use that tiki on this level.\n");
Com_sprintf(filename, 64, "ubersound/uberdialog.scr");
Com_sprintf(filename, sizeof(filename), "ubersound/uberdialog.scr");
startTime = cgi.Milliseconds();
CG_Command_ProcessFile(filename, 0, 0);
endTime = cgi.Milliseconds() - startTime;
Com_Printf("Parse/Load time: %f seconds.\n",
(double)((long double)endTime / 1000.0));
Com_Printf("Parse/Load time: %f seconds.\n", endTime / 1000.0f);
Com_Printf("-------------UBERDIALOG DONE---------------\n\n");
}
@@ -366,7 +364,7 @@ void CG_ProcessConfigString(int num)
}
else if (num >= CS_SOUNDS && num < CS_SOUNDS + MAX_SOUNDS)
{
int len = strlen(str);
size_t len = strlen(str);
if (len)
{
qboolean streamed;
+2 -2
View File
@@ -444,8 +444,8 @@ void CG_AddTreadMarks()
}
int CG_PermanentMark(
vec_t* origin,
vec_t* dir,
const vec3_t origin,
const vec3_t dir,
float orientation,
float fSScale,
float fTScale,
+1 -1
View File
@@ -956,7 +956,7 @@ void CG_ModelAnim(centity_t* cent, qboolean bDoShaderTime)
VectorCopy(model.origin, cg.sky_origin);
}
model.reType = ET_MODELANIM_SKEL;
model.reType = RT_MODEL;
if (!(s1->renderfx & RF_DONTDRAW))
{
cgi.R_Model_GetHandle(model.hModel);
+65 -21
View File
@@ -158,6 +158,10 @@ CL_GetSnapshot
qboolean CL_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) {
clSnapshot_t *clSnap;
int i, count;
int pnum;
int parents[MAX_ENTITIES_IN_SNAPSHOT];
entityState_t *s1;
int pcount = 0;
if ( snapshotNumber > cl.snap.messageNum ) {
Com_Error( ERR_DROP, "CL_GetSnapshot: snapshotNumber > cl.snapshot.messageNum" );
@@ -187,41 +191,81 @@ qboolean CL_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) {
snapshot->serverTime = clSnap->serverTime;
Com_Memcpy( snapshot->areamask, clSnap->areamask, sizeof( snapshot->areamask ) );
snapshot->ps = clSnap->ps;
// wombat: sounds
count = clSnap->number_of_sounds;
if (snapshot->number_of_sounds > MAX_SERVER_SOUNDS) {
Com_DPrintf("CL_GetSnapshot: truncated %i sounds to %i\n", count, MAX_SERVER_SOUNDS);
count = MAX_SERVER_SOUNDS;
}
snapshot->number_of_sounds = count;
Com_Memcpy(snapshot->sounds, clSnap->sounds, sizeof(snapshot->sounds[0])* count);
count = clSnap->numEntities;
if ( count > MAX_ENTITIES_IN_SNAPSHOT ) {
Com_DPrintf( "CL_GetSnapshot: truncated %i visible entities to %i\n", count, MAX_ENTITIES_IN_SNAPSHOT );
count = MAX_ENTITIES_IN_SNAPSHOT;
}
snapshot->numEntities = count;
snapshot->numEntities = 0;
for ( i = 0 ; i < count ; i++ ) {
snapshot->entities[i] =
cl.parseEntities[ ( clSnap->parseEntitiesNum + i ) & (MAX_PARSE_ENTITIES-1) ];
s1 = &cl.parseEntities[(clSnap->parseEntitiesNum + i) & (MAX_PARSE_ENTITIES - 1)];
pnum = s1->parent;
if (pnum == ENTITYNUM_NONE) {
parents[s1->number] = -2;
}
else
{
if (parents[pnum] == -2) {
parents[s1->number] = -2;
}
else
{
// add it later
parents[s1->number] = pnum;
continue;
}
}
snapshot->entities[snapshot->numEntities++] = *s1;
}
// wombat: sounds
count = clSnap->number_of_sounds;
if ( snapshot->number_of_sounds > MAX_SERVER_SOUNDS) {
Com_DPrintf( "CL_GetSnapshot: truncated %i sounds to %i\n", count, MAX_SERVER_SOUNDS);
count = MAX_SERVER_SOUNDS;
for(pcount = 0; pcount < 8 && snapshot->numEntities != count; pcount++)
{
for (i = 0; i < count; i++)
{
s1 = &cl.parseEntities[(clSnap->parseEntitiesNum + i) & (MAX_PARSE_ENTITIES - 1)];
pnum = parents[s1->number];
if (pnum >= 0 && parents[pnum] == -2) {
snapshot->entities[snapshot->numEntities++] = *s1;
}
}
}
snapshot->number_of_sounds = count;
Com_Memcpy( snapshot->sounds, clSnap->sounds, sizeof(snapshot->sounds[0])*count );
// FIXME: configstring changes and server commands!!!
if (pcount >= 8)
{
for (i = count; i < snapshot->numEntities; i++)
{
s1 = &cl.parseEntities[(clSnap->parseEntitiesNum + i) & (MAX_PARSE_ENTITIES - 1)];
if (parents[s1->number] >= 0) {
Com_DPrintf(
"CL_GetSnapshot: entity %d with parent %d and model '%s' at %.2f %.2f %.2f, could not find parent.\n",
s1->number,
s1->parent,
CL_ConfigString(CS_MODELS + s1->modelindex),
s1->origin[0],
s1->origin[1],
s1->origin[2]
);
}
}
}
return qtrue;
}
/*
=====================
CL_SetUserCmdValue
=====================
*/
void CL_SetUserCmdValue( int userCmdValue, float sensitivityScale ) {
cl.cgameUserCmdValue = userCmdValue;
cl.cgameSensitivity = sensitivityScale;
}
/*
=====================
CL_AddCgameCommand
+17 -7
View File
@@ -566,7 +566,7 @@ CL_CmdButtons
*/
void CL_CmdButtons( usercmd_t *cmd ) {
int i;
//
// figure button bits
// send a button bit even if the key was pressed and released in
@@ -579,18 +579,28 @@ void CL_CmdButtons( usercmd_t *cmd ) {
in_buttons[i].wasPressed = qfalse;
}
// if ( Key_GetCatcher( ) ) {
// cmd->buttons |= BUTTON_TALK; // su44: is there a TALK button in MoHAA?
// }
if (UI_MenuActive() || UI_ConsoleIsOpen()) {
cmd->buttons |= BUTTON_TALK;
}
if (in_speed.active == !cl_run->integer) {
cmd->buttons |= BUTTON_RUN;
}
if (cge) {
// send weapon commands from cg
cmd->buttons |= cge->CG_WeaponCommandButtonBits();
}
// allow the game to know if any key at all is
// currently pressed, even if it isn't bound to anything
if ( anykeydown && Key_GetCatcher( ) == 0 ) {
if ( anykeydown && Key_GetCatcher() == 0) {
cmd->buttons |= BUTTON_ANY;
}
// su44: add weapon command bits
cmd->buttons |= cl.cgameUserCmdValue;
if (anykeydown) {
cmd->buttons |= BUTTON_ANY2;
}
}
+11 -141
View File
@@ -29,14 +29,10 @@ key up events are sent even if in console mode
*/
field_t historyEditLines[COMMAND_HISTORY];
int nextHistoryLine; // the last line in the history buffer, not masked
int historyLine; // the line being displayed from history buffer
// will be <= nextHistoryLine
field_t g_consoleField;
field_t chatField;
qboolean chat_team;
int chat_playerNum;
@@ -951,7 +947,13 @@ void CL_KeyEvent (int key, qboolean down, unsigned time) {
ctrl_down = down;
}
if( cls.state > CA_DISCONNECTED && cge && !cls.keyCatchers && cge->CG_CheckCaptureKey( key, down, time ) && key != K_ESCAPE )
if (down && !CL_FinishedIntro())
{
UI_StartStageKeyEvent();
return;
}
if( cls.state > CA_DISCONNECTED && cge && !Key_GetCatcher() && cge->CG_CheckCaptureKey( key, down, time ) && key != K_ESCAPE )
{
if( key != '`' && key != '~' )
return;
@@ -962,6 +964,7 @@ void CL_KeyEvent (int key, qboolean down, unsigned time) {
if( !down ) {
return;
}
if( Cvar_VariableIntegerValue( "ui_console" ) )
{
UI_ToggleConsole();
@@ -1015,10 +1018,10 @@ void CL_KeyEvent (int key, qboolean down, unsigned time) {
}
}
if( in_guimouse || key <= K_MOUSE3 || key > K_JOY1 )
if (!in_guimouse || key <= K_MOUSE3 || key > K_JOY1)
{
// keys can still be used for bound actions
if( down && ( key < 128 || key == K_MOUSE4 ) &&
if (down && (key <= K_BACKSPACE || key == K_MOUSE4) &&
( clc.demoplaying || cls.state == CA_CINEMATIC ) && Key_GetCatcher() == 0 ) {
Cvar_Set( "nextdemo", "" );
key = K_ESCAPE;
@@ -1061,7 +1064,7 @@ void CL_KeyEvent (int key, qboolean down, unsigned time) {
UI_KeyEvent( key, time );
} else if( cls.loading & KEYCATCH_MESSAGE ) {
Message_Key( key );
} else if( cls.state != CA_DISCONNECTED ) {
} else if( cls.state != CA_DISCONNECTED || menubound[key]) {
// send the bound action
kb = altkeys[ key ].binding;
if( !kb || !altkeys[ key ].down ) {
@@ -1198,136 +1201,3 @@ Key_SetCatcher
void Key_SetCatcher( int catcher ) {
keyCatchers = catcher;
}
// This must not exceed MAX_CMD_LINE
#define MAX_CONSOLE_SAVE_BUFFER 1024
#define CONSOLE_HISTORY_FILE "omhistory"
static char consoleSaveBuffer[ MAX_CONSOLE_SAVE_BUFFER ];
static int consoleSaveBufferSize = 0;
/*
================
CL_LoadConsoleHistory
Load the console history from cl_consoleHistory
================
*/
void CL_LoadConsoleHistory( void )
{
const char *token;
char *text_p;
int i, numChars, numLines = 0;
fileHandle_t f;
consoleSaveBufferSize = FS_FOpenFileRead( CONSOLE_HISTORY_FILE, &f, qfalse, qtrue );
if( !f )
{
Com_Printf( "Couldn't read %s.\n", CONSOLE_HISTORY_FILE );
return;
}
if( consoleSaveBufferSize <= MAX_CONSOLE_SAVE_BUFFER &&
FS_Read( consoleSaveBuffer, consoleSaveBufferSize, f ) == consoleSaveBufferSize )
{
text_p = consoleSaveBuffer;
for( i = COMMAND_HISTORY - 1; i >= 0; i-- )
{
if( !*( token = COM_Parse( &text_p ) ) )
break;
historyEditLines[ i ].cursor = atoi( token );
if( !*( token = COM_Parse( &text_p ) ) )
break;
historyEditLines[ i ].scroll = atoi( token );
if( !*( token = COM_Parse( &text_p ) ) )
break;
numChars = atoi( token );
text_p++;
if( numChars > ( strlen( consoleSaveBuffer ) - ( text_p - consoleSaveBuffer ) ) )
{
Com_DPrintf( S_COLOR_YELLOW "WARNING: probable corrupt history\n" );
break;
}
Com_Memcpy( historyEditLines[ i ].buffer,
text_p, numChars );
historyEditLines[ i ].buffer[ numChars ] = '\0';
text_p += numChars;
numLines++;
}
memmove( &historyEditLines[ 0 ], &historyEditLines[ i + 1 ],
numLines * sizeof( field_t ) );
for( i = numLines; i < COMMAND_HISTORY; i++ )
Field_Clear( &historyEditLines[ i ] );
historyLine = nextHistoryLine = numLines;
}
else
Com_Printf( "Couldn't read %s.\n", CONSOLE_HISTORY_FILE );
FS_FCloseFile( f );
}
/*
================
CL_SaveConsoleHistory
Save the console history into the cvar cl_consoleHistory
so that it persists across invocations of q3
================
*/
void CL_SaveConsoleHistory( void )
{
int i;
int lineLength, saveBufferLength, additionalLength;
fileHandle_t f;
consoleSaveBuffer[ 0 ] = '\0';
i = ( nextHistoryLine - 1 ) % COMMAND_HISTORY;
do
{
if( historyEditLines[ i ].buffer[ 0 ] )
{
lineLength = strlen( historyEditLines[ i ].buffer );
saveBufferLength = strlen( consoleSaveBuffer );
//ICK
additionalLength = lineLength + strlen( "999 999 999 " );
if( saveBufferLength + additionalLength < MAX_CONSOLE_SAVE_BUFFER )
{
Q_strcat( consoleSaveBuffer, MAX_CONSOLE_SAVE_BUFFER,
va( "%d %d %d %s ",
historyEditLines[ i ].cursor,
historyEditLines[ i ].scroll,
lineLength,
historyEditLines[ i ].buffer ) );
}
else
break;
}
i = ( i - 1 + COMMAND_HISTORY ) % COMMAND_HISTORY;
}
while( i != ( nextHistoryLine - 1 ) % COMMAND_HISTORY );
consoleSaveBufferSize = strlen( consoleSaveBuffer );
f = FS_FOpenFileWrite( CONSOLE_HISTORY_FILE );
if( !f )
{
Com_Printf( "Couldn't write %s.\n", CONSOLE_HISTORY_FILE );
return;
}
if( FS_Write( consoleSaveBuffer, consoleSaveBufferSize, f ) < consoleSaveBufferSize )
Com_Printf( "Couldn't write %s.\n", CONSOLE_HISTORY_FILE );
FS_FCloseFile( f );
}
+8
View File
@@ -4307,4 +4307,12 @@ qboolean CL_CDKeyValidate( const char *key, const char *checksum ) {
return qfalse;
}
void TIKI_CG_Command_ProcessFile(char* filename, qboolean quiet, dtiki_t* curTiki)
{
if (cge) {
cge->CG_Command_ProcessFile(filename, quiet, curTiki);
return;
}
Com_Printf("NO CGE \n");
}
+1
View File
@@ -527,6 +527,7 @@ void CL_ParseGamestate( msg_t *msg ) {
// reinitialize the filesystem if the game directory has changed
FS_ConditionalRestart( clc.checksumFeed );
cls.state = CA_LOADING;
if (!com_sv_running->integer)
{
const char *info = cl.gameState.stringData + cl.gameState.stringOffsets[CS_SERVERINFO];
+86 -67
View File
@@ -1881,7 +1881,7 @@ void UI_Update(void) {
{
UI_ForceMenuOff(true);
UI_DeactiveFloatingWindows();
UI_ForceMenu("");
UI_ForceMenu(ui_sCurrentLoadingMenu);
uWinMan.showCursor(false);
}
@@ -4485,8 +4485,14 @@ ScoreboardListItem::ScoreboardListItem()
void ScoreboardListItem::DrawListItem( int iColumn, const UIRect2D& drawRect, bool bSelected, UIFont *pFont )
{
DrawBox( drawRect, backColor, 1.0 );
pFont->setColor( textColor );
pFont->Print( drawRect.pos.x + 1, drawRect.pos.y, Sys_LV_CL_ConvertString( getListItemString( iColumn ) ), iColumn, -1 );
pFont->setColor(textColor);
pFont->Print(
drawRect.pos.x + 1,
drawRect.pos.y,
Sys_LV_CL_ConvertString(getListItemString(iColumn)),
-1,
qfalse
);
if( bTitleItem )
{
@@ -4588,10 +4594,11 @@ void UI_SetScoreBoardItem( int iItemNumber,
{
cge->CG_GetScoreBoardPosition( &x, &y, &w, &h );
if( scoreboard_x == x
|| scoreboard_y == y
|| scoreboard_w == w
|| scoreboard_h == h
// Recreate the scoreboard if it has different rect
if( scoreboard_x != x
|| scoreboard_y != y
|| scoreboard_w != w
|| scoreboard_h != h
|| scoreboard_header != cge->CG_GetScoreBoardDrawHeader() )
{
delete scoreboardlist;
@@ -4606,11 +4613,12 @@ void UI_SetScoreBoardItem( int iItemNumber,
if( scoreboardlist )
{
if( iItemNumber + 1 > scoreboardlist->getNumItems() ) {
if (iItemNumber + 1 > scoreboardlist->getNumItems()) {
pItem = new ScoreboardListItem;
scoreboardlist->AddItem( pItem );
} else {
pItem = ( ScoreboardListItem * )scoreboardlist->GetItem( iItemNumber );
scoreboardlist->AddItem(pItem);
}
else {
pItem = (ScoreboardListItem*)scoreboardlist->GetItem(iItemNumber + 1);
}
if( pItem )
@@ -5565,23 +5573,23 @@ UI_LoadResource
====================
*/
void UI_LoadResource( const char *name ) {
if( cls.loading == SS_DEAD ) {
if (cls.loading == SS_DEAD) {
return;
}
if( cls.loading == 3 )
if (cls.loading == SS_GAME)
{
UI_EndLoadResource();
UI_EndLoadResource( name );
UI_EndLoadResource(name);
UI_BeginLoadResource();
}
else if( cls.loading == 2 )
else if (cls.loading == SS_LOADING2)
{
UI_RegisterLoadResource( name );
Cvar_SetValue( "loadingbar", currentLoadTime / totalLoadTime );
UI_RegisterLoadResource(name);
Cvar_SetValue("loadingbar", (float)currentLoadTime / (float)totalLoadTime);
}
UI_TestUpdateScreen( 333u );
UI_TestUpdateScreen(333u);
}
/*
@@ -5746,7 +5754,65 @@ void UI_BeginLoad( const char *pszMapName ) {
UI_ForceMenuOff( true );
UI_DeactiveFloatingWindows();
if( !ui_pLoadingMenu )
if (ui_pLoadingMenu)
{
if (!developer->integer && UI_ConsoleIsVisible()) {
UI_CloseConsole();
}
ui_pLoadingMenu->PassEventToWidget("continuebutton", new Event(EV_Widget_Disable));
loadName = "maps/";
loadName += pszMapName;
loadName += ".min";
mapfile = loadName + ".bsp";
if (UI_ArchiveLoadMapinfo(mapfile)) {
cls.loading = SS_LOADING2;
}
else {
cls.loading = SS_GAME;
}
if (cls.loading == SS_LOADING2)
{
ui_pLoadingMenu->PassEventToWidget("loadingflasher", new Event(EV_Widget_Disable));
ui_pLoadingMenu->PassEventToWidget("loadingbar", new Event(EV_Widget_Enable));
ui_pLoadingMenu->PassEventToWidget("loadingbar_border", new Event(EV_Widget_Enable));
currentLoadTime = 0;
Cvar_SetValue("loadingbar", 0);
L_ProcessPendingEvents();
lastTime = Sys_Milliseconds();
if (com_sv_running->integer) {
SCR_UpdateScreen();
}
}
else
{
ui_pLoadingMenu->PassEventToWidget("loadingflasher", new Event(EV_Widget_Enable));
ui_pLoadingMenu->PassEventToWidget("loadingbar", new Event(EV_Widget_Disable));
ui_pLoadingMenu->PassEventToWidget("loadingbar_border", new Event(EV_Widget_Disable));
UI_BeginLoadResource();
loadCountLow = 0;
loadCountHigh = 0;
loadHead = NULL;
loadNumber = 0;
cls.loading = SS_LOADING;
L_ProcessPendingEvents();
lastTime = Sys_Milliseconds();
if (com_sv_running->integer) {
SCR_UpdateScreen();
}
}
}
else
{
cls.loading = SS_LOADING;
@@ -5755,56 +5821,9 @@ void UI_BeginLoad( const char *pszMapName ) {
lastTime = Sys_Milliseconds();
if( com_sv_running->integer ) {
if (com_sv_running->integer) {
SCR_UpdateScreen();
}
return;
}
if( !developer->integer && UI_ConsoleIsVisible() ) {
UI_CloseConsole();
}
ui_pLoadingMenu->PassEventToWidget( "continuebutton", new Event( EV_Widget_Disable ) );
loadName = "maps/";
loadName += pszMapName;
loadName += ".min";
mapfile = loadName + ".bsp";
if( UI_ArchiveLoadMapinfo( mapfile ) ) {
cls.loading = SS_LOADING2;
} else {
cls.loading = SS_GAME;
}
if( cls.loading != SS_LOADING2 )
{
ui_pLoadingMenu->PassEventToWidget( "loadingflasher", new Event( EV_Widget_Enable ) );
ui_pLoadingMenu->PassEventToWidget( "loadingbar", new Event( EV_Widget_Disable ) );
ui_pLoadingMenu->PassEventToWidget( "loadingbar_border", new Event( EV_Widget_Disable ) );
UI_BeginLoadResource();
loadCountLow = 0;
loadCountHigh = 0;
loadHead = NULL;
loadNumber = 0;
}
else
{
ui_pLoadingMenu->PassEventToWidget( "loadingflasher", new Event( EV_Widget_Disable ) );
ui_pLoadingMenu->PassEventToWidget( "loadingbar", new Event( EV_Widget_Enable ) );
ui_pLoadingMenu->PassEventToWidget( "loadingbar_border", new Event( EV_Widget_Enable ) );
currentLoadTime = 0;
Cvar_SetValue( "loadingbar", 0 );
}
L_ProcessPendingEvents();
lastTime = Sys_Milliseconds();
if( com_sv_running->integer ) {
SCR_UpdateScreen();
}
}
+1
View File
@@ -42,6 +42,7 @@ void CL_ShutdownUI( void );
//
extern inventory_t client_inv;
extern bind_t client_bind;
extern cvar_t* cl_greenfps;
const char *CvarGetForUI( const char *name, const char *defval );
void UI_ClearState( void );
+380 -12
View File
@@ -438,7 +438,173 @@ void UIFakkLabel::LayoutRenderModelAnim( Event *ev )
void UIFakkLabel::DrawStatbar( float frac )
{
// FIXME: stub
vec4_t col;
float alpha;
col[0] = col[1] = col[2] = col[3] = 1.0;
switch (m_statbar_or)
{
case L_STATBAR_CIRCULAR:
DrawStatCircle(frac);
return;
case L_STATBAR_NEEDLE:
DrawStatNeedle(frac);
return;
case L_STATBAR_ROTATOR:
DrawStatRotator(frac);
return;
case L_STATBAR_COMPASS:
DrawStatCompass(frac);
return;
case L_STATBAR_SPINNER:
case L_STATBAR_HEADING_SPINNER:
DrawStatSpinner(frac);
return;
default:
break;
}
if (!frac) {
return;
}
if (frac != m_lastfrac) {
m_flashtime = uid.time;
}
m_lastfrac = frac;
alpha = 1.0 - ((float)uid.time - m_flashtime) / 1500.0;
if (alpha < 0.0) alpha = 0.0;
else if (alpha > 1.0) alpha = 1.0;
col[3] = alpha;
if (m_statbar_material)
{
if (m_flags & WF_TILESHADER)
{
switch (m_statbar_or)
{
case L_STATBAR_HORIZONTAL:
{
float width = frac * m_frame.size.width;
m_statbar_material->ReregisterMaterial();
re.DrawTilePic(0.0, 0.0, width, m_frame.size.height, m_statbar_material->GetMaterial());
if (alpha != 0.0 && m_statbar_material_flash)
{
re.SetColor(col);
m_statbar_material_flash->ReregisterMaterial();
re.DrawTilePic(0.0, 0.0, width, m_frame.size.height, m_statbar_material_flash->GetMaterial());
}
break;
}
case L_STATBAR_VERTICAL:
case L_STATBAR_VERTICAL_REVERSE:
case L_STATBAR_VERTICAL_STAGGER_EVEN:
case L_STATBAR_VERTICAL_STAGGER_ODD:
{
float y = m_frame.size.height * (1.0 - frac);
m_statbar_material->ReregisterMaterial();
re.DrawTilePic(0.0, y, m_frame.size.width, m_frame.size.height, m_statbar_material->GetMaterial());
if (alpha != 0.0 && m_statbar_material_flash)
{
re.SetColor(col);
m_statbar_material_flash->ReregisterMaterial();
re.DrawTilePic(0.0, y, m_frame.size.width, m_frame.size.height, m_statbar_material_flash->GetMaterial());
}
break;
}
}
}
else
{
switch (m_statbar_or)
{
case L_STATBAR_HORIZONTAL:
{
float width = frac * m_frame.size.width;
m_statbar_material->ReregisterMaterial();
re.DrawStretchPic(0.0, 0.0, width, m_frame.size.height, 0.0, 0.0, 1.0, 1.0, m_statbar_material->GetMaterial());
if(alpha != 0.0 && m_statbar_material_flash)
{
re.SetColor(col);
m_statbar_material_flash->ReregisterMaterial();
re.DrawStretchPic(0.0, 0.0, width, m_frame.size.height, 0.0, 0.0, 1.0, 1.0, m_statbar_material_flash->GetMaterial());
}
break;
}
case L_STATBAR_VERTICAL:
case L_STATBAR_VERTICAL_STAGGER_EVEN:
case L_STATBAR_VERTICAL_STAGGER_ODD:
{
float y = m_frame.size.height * (1.0 - frac);
float height = m_frame.size.height * frac;
m_statbar_material->ReregisterMaterial();
re.DrawStretchPic(0.0, y, m_frame.size.width, height, 0.0, 1.0 - frac, 1.0, 1.0, m_statbar_material->GetMaterial());
if (alpha != 0.0 && m_statbar_material_flash)
{
re.SetColor(col);
m_statbar_material_flash->ReregisterMaterial();
re.DrawStretchPic(0.0, y, m_frame.size.width, height, 0.0, 1.0 - frac, 1.0, 1.0, m_statbar_material_flash->GetMaterial());
}
break;
}
case L_STATBAR_VERTICAL_REVERSE:
{
float height = m_frame.size.height * frac;
m_statbar_material->ReregisterMaterial();
re.DrawStretchPic(0.0, 0.0, m_frame.size.width, height, 0.0, 0.0, 1.0, frac, m_statbar_material->GetMaterial());
if (alpha != 0.0 && m_statbar_material_flash)
{
re.SetColor(col);
m_statbar_material_flash->ReregisterMaterial();
re.DrawStretchPic(0.0, 0.0, m_frame.size.width, height, 0.0, 0.0, 1.0, frac, m_statbar_material_flash->GetMaterial());
}
break;
}
}
}
}
else
{
switch (m_statbar_or)
{
case L_STATBAR_VERTICAL:
case L_STATBAR_VERTICAL_STAGGER_EVEN:
case L_STATBAR_VERTICAL_STAGGER_ODD:
DrawBox(
0.0,
m_frame.size.height * (1.0 - frac),
m_frame.size.width,
m_frame.size.height,
m_foreground_color,
1.0
);
break;
case L_STATBAR_HORIZONTAL:
DrawBox(
0.0,
0.0,
frac * m_frame.size.width,
m_frame.size.height,
m_foreground_color,
1.0
);
break;
}
}
}
void UIFakkLabel::DrawStatCircle( float frac )
@@ -458,7 +624,212 @@ void UIFakkLabel::DrawStatRotator( float frac )
void UIFakkLabel::DrawStatCompass( float frac )
{
// FIXME: stub
vec4_t col;
float fTargAng;
float fSinVal, fCosVal;
vec2_t vCenter;
vec2_t vVerts[3];
vec2_t vTexCoords[3];
vec2_t vCompassDir;
vec2_t vSideDir;
col[0] = col[1] = col[2] = col[3] = 1.0;
if (!cge) {
return;
}
static int iLastCompassTime = -9999, iLastTimeDelta = 0;
static float fLastPitch = 0, fLastYaw = 0, fLastYawDelta = 0;
static float fYawOffset = 0, fYawSpeed = 0;
static float fNeedleOffset = 0, fNeedleSpeed = 0;
int iTimeCount, iTimeDelta;
float fYawDelta, fYawDeltaDiff;
vec3_t vViewAngles;
cge->CG_EyeAngles(&vViewAngles);
vViewAngles[1] -= cl.snap.ps.stats[STAT_COMPASSNORTH] / 182.0f;
iTimeCount = uid.time - iLastCompassTime;
if (iTimeCount <= 1000)
{
fYawDelta = AngleSubtract(vViewAngles[1], fLastYaw);
if (fYawDelta > 0.1)
{
if ((fYawDelta > 0.0 && fLastYawDelta < fYawDelta)
|| (fYawDelta < 0.0 && fLastYawDelta > fYawDelta))
{
fYawSpeed += (fYawDelta - fLastYawDelta) * 0.75;
fYawOffset += (fYawDelta - fLastYawDelta) * 0.75;
}
if (fYawSpeed > 90.0) {
fYawSpeed = 90.0;
}
else if (fYawSpeed < 0.05) {
fYawSpeed = 0.05;
}
}
while (iTimeCount > 0)
{
iTimeDelta = iTimeCount;
if (iTimeCount > 15) {
iTimeDelta = 15;
}
iTimeCount -= iTimeDelta;
if (fabs(fYawOffset) >= 0.1 || fabs(fYawSpeed) >= 0.01)
{
fYawOffset += fYawSpeed * iTimeDelta;
if (fYawOffset > 0.0) {
fYawSpeed -= iTimeDelta * 0.00175;
}
else if (fYawOffset < 0.0) {
fYawSpeed += iTimeDelta * 0.00175;
}
if (fYawOffset > 40.0) {
fYawOffset = 40.0;
fYawSpeed = 0.0;
}
else if (fYawOffset < -40.0) {
fYawOffset = -40.0;
fYawSpeed = 0.0;
}
fYawSpeed -= iTimeDelta * 0.003;
if (fYawSpeed > 0.0) {
fYawSpeed -= iTimeDelta * 0.0004;
}
else {
fYawSpeed += iTimeDelta * 0.0004;
if (fYawSpeed > 0.0) {
fYawSpeed = 0.0;
}
}
}
else
{
iTimeCount = 0;
fYawOffset = 0.0;
fYawSpeed = 0.0;
}
}
fLastYawDelta = fYawDelta;
iLastTimeDelta = uid.time - iLastCompassTime;
}
else
{
fLastYawDelta = 0;
fYawOffset = 0;
fYawSpeed = 0;
iLastTimeDelta = 0;
}
fLastPitch = vViewAngles[0];
fLastYaw = vViewAngles[1];
iLastCompassTime = uid.time;
if (iLastTimeDelta)
{
if (fabs(fLastYawDelta) > 0.1) {
fNeedleOffset -= fLastYawDelta;
}
iTimeCount = iLastTimeDelta;
while (iTimeCount > 0)
{
iTimeDelta = iTimeCount;
if (iTimeCount > 15) {
iTimeDelta = 15;
}
iTimeCount -= iTimeDelta;
if (fabs(fNeedleOffset) >= 0.1 || fabs(fNeedleSpeed) >= 0.01) {
fNeedleOffset += iTimeDelta * fNeedleSpeed;
if (fNeedleOffset > 180.0) {
fNeedleOffset -= 360.0;
}
else if (fNeedleOffset < -180.0) {
fNeedleOffset += 360.0;
}
if (fNeedleOffset > 0.0) {
fNeedleSpeed -= iTimeDelta * 0.00175;
}
else if (fNeedleOffset < 0.0) {
fNeedleSpeed += iTimeDelta * 0.00175;
}
fNeedleSpeed -= fNeedleSpeed * 0.0025 * iTimeDelta;
if (fNeedleSpeed > 0.0) {
fNeedleSpeed -= iTimeDelta * 0.00035;
if (fNeedleSpeed < 0.0) {
fNeedleSpeed = 0.0;
}
}
else {
fNeedleSpeed += iTimeDelta * 0.00035;
if (fNeedleSpeed > 0.0) {
fNeedleSpeed = 0.0;
}
}
} else {
iTimeCount = 0;
fNeedleOffset = 0.0;
fNeedleSpeed = 0.0;
}
}
}
else
{
fNeedleOffset = 0.0;
fNeedleSpeed = 0.0;
}
fSinVal = sin(anglemod(fNeedleOffset + fLastYaw) / (180 / M_PI));
fCosVal = cos(anglemod(fNeedleOffset + fLastYaw) / (180 / M_PI));
vCompassDir[0] = fSinVal;
vCompassDir[1] = -fCosVal;
vCenter[0] = m_frame.size.width * 0.5;
vCenter[1] = m_frame.size.height * 0.5;
vTexCoords[0][0] = 0.0;
vTexCoords[0][1] = 0.0;
vTexCoords[1][0] = 1.0;
vTexCoords[1][1] = 0.0;
vTexCoords[2][0] = 0.0;
vTexCoords[2][1] = 1.0;
vVerts[0][0] = vCenter[0] + vCompassDir[0] * vCenter[0] - fCosVal * vCenter[1];
vVerts[1][0] = vCenter[0] + vCompassDir[0] * vCenter[0] + fCosVal * vCenter[1];
vVerts[2][0] = vCenter[0] - vCompassDir[0] * vCenter[0] - fCosVal * vCenter[1];
vVerts[0][1] = vCenter[1] + vCompassDir[1] * vCenter[1] - fSinVal * vCenter[0];
vVerts[1][1] = vCenter[1] + vCompassDir[1] * vCenter[1] + fSinVal * vCenter[0];
vVerts[2][1] = vCenter[1] - vCompassDir[1] * vCenter[1] - fSinVal * vCenter[0];
m_statbar_material->ReregisterMaterial();
re.DrawTrianglePic(vVerts, vTexCoords, m_statbar_material->GetMaterial());
vVerts[0][0] = vVerts[2][0];
vVerts[0][1] = vVerts[2][1];
vTexCoords[0][0] = vTexCoords[2][0];
vTexCoords[0][1] = vTexCoords[2][1];
vTexCoords[2][0] = 1.0;
vTexCoords[2][1] = 1.0;
vVerts[2][0] = vCenter[0] + fCosVal * vCenter[1] - vCompassDir[0] * vCenter[0];
vVerts[2][1] = vCenter[1] * fSinVal + vCenter[0] - vCompassDir[1] * vCenter[1];
m_statbar_material->ReregisterMaterial();
re.DrawTrianglePic(vVerts, vTexCoords, m_statbar_material->GetMaterial());
}
void UIFakkLabel::DrawStatSpinner( float frac )
@@ -506,7 +877,7 @@ void UIFakkLabel::Draw( void )
return;
}
if( m_stat != -1 )
if( m_stat == -1 )
{
float scale;
qhandle_t handle;
@@ -516,7 +887,7 @@ void UIFakkLabel::Draw( void )
vec3_t angles;
vec3_t offset;
vec3_t rotateoffset;
vec3_t color;
vec4_t color;
str sAnimName;
float height;
@@ -686,23 +1057,20 @@ _shitlabel01:
float frac;
if( m_maxstat )
if( m_maxstat >= 0 )
{
frac = delta / ( m_statbar_max - m_statbar_min );
frac = (float)delta / (float)cl.snap.ps.stats[m_maxstat];
}
else
{
frac = delta / cl.snap.ps.stats[ m_maxstat ];
frac = (float)delta / (float)(m_statbar_max - m_statbar_min);
}
if( frac > 1.0 )
frac = 1.0;
if( frac < 0.0 )
frac = 0.0;
if( frac > 1.0 ) frac = 1.0;
else if( frac < 0.0 ) frac = 0.0;
DrawStatbar( frac );
return;
}
+66 -1
View File
@@ -126,7 +126,72 @@ void View3D::DrawFPS
)
{
// FIXME: stub
char string[128];
setFont("verdana-14");
if (fps->integer == 2)
{
re.SetColor(UBlack);
re.DrawBox(
0.0,
m_frame.pos.y + m_frame.size.height - m_font->getHeight(qfalse) * 4.0,
m_frame.pos.x + m_frame.size.width,
m_font->getHeight(qfalse) * 4.0
);
}
sprintf(string, "FPS %4.1f", currentfps);
if (currentfps > 23.94) {
if (cl_greenfps->integer) {
m_font->setColor(UGreen);
} else {
m_font->setColor(UWhite);
}
} else if (currentfps > 18.0) {
m_font->setColor(UYellow);
} else {
// low fps
m_font->setColor(URed);
}
m_font->Print(
m_font->getHeight(qfalse) * 10.0,
m_frame.pos.y + m_frame.size.height - m_font->getHeight(qfalse) * 3.0,
string,
-1,
qfalse
);
// Draw elements count
if (cl_greenfps->integer) {
m_font->setColor(UGreen);
}
else {
m_font->setColor(UWhite);
}
sprintf(string, "wt%5d wv%5d cl%d", cls.world_tris, cls.world_verts, cls.character_lights);
m_font->Print(
m_font->getHeight(qfalse) * 10.0,
m_frame.pos.y + m_frame.size.height - m_font->getHeight(qfalse) * 2.0,
string,
-1,
qfalse
);
sprintf(string, "t%5d v%5d Mtex%5.2f", cls.total_tris, cls.total_verts, (float)cls.total_texels * 0.00000095367432);
m_font->Print(
m_font->getHeight(qfalse) * 10.0,
m_frame.pos.y + m_frame.size.height - m_font->getHeight(qfalse),
string,
-1,
qfalse
);
m_font->setColor(UBlack);
}
void View3D::DrawProf
-10
View File
@@ -126,10 +126,6 @@ typedef struct {
int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events
// cgame communicates a few values to the client system
int cgameUserCmdValue; // current weapon to add to usercmd_t
float cgameSensitivity;
// cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last
// properly generated command
usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds
@@ -145,9 +141,6 @@ typedef struct {
// and teleport direction changes
vec3_t viewangles;
vec3_t eyeAngles;
vec3_t eyeOrigin;
int serverId; // included in each client message so the server
// can tell if it is for a prior map_restart
// big stuff at end of structure so most offsets are 15 bits or less
@@ -578,9 +571,6 @@ void Con_PageDown( void );
void Con_Top( void );
void Con_Bottom( void );
void CL_LoadConsoleHistory( void );
void CL_SaveConsoleHistory( void );
//
// cl_scrn.c
//
-11
View File
@@ -34,17 +34,6 @@ typedef struct {
extern qboolean key_overstrikeMode;
extern qkey_t keys[K_LASTKEY];
// NOTE TTimo the declaration of field_t and Field_Clear is now in qcommon/qcommon.h
void Field_KeyDownEvent( field_t *edit, int key );
void Field_CharEvent( field_t *edit, int ch );
void Field_Draw(fontInfo_t *font, field_t *edit, int x, int y, int width, qboolean showCursor, qboolean noColorEscape );
void Field_BigDraw(fontInfo_t *font, field_t *edit, int x, int y, int width, qboolean showCursor, qboolean noColorEscape );
#define COMMAND_HISTORY 32
extern field_t historyEditLines[COMMAND_HISTORY];
extern field_t g_consoleField;
extern field_t chatField;
extern int anykeydown;
extern qboolean chat_team;
extern int chat_playerNum;
-9
View File
@@ -25,15 +25,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "../qcommon/q_shared.h"
#include "bg_public.h"
/*
================
BG_EvaluateTrajectory
================
*/
void BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ) {
}
/*
================
BG_EvaluateTrajectoryDelta
+4 -4
View File
@@ -1423,7 +1423,7 @@ void PmoveSingle( pmove_t *pmove )
if( pm->ps->pm_type == PM_CLIMBWALL )
{
pm->ps->fLeanAngle = 0.0f;
pm->cmd.buttons &= ~( BUTTON_LEANLEFT | BUTTON_LEANRIGHT );
pm->cmd.buttons &= ~( BUTTON_LEAN_LEFT | BUTTON_LEAN_RIGHT );
}
// clear all pmove local vars
@@ -1447,10 +1447,10 @@ void PmoveSingle( pmove_t *pmove )
pml.frametime = pml.msec * 0.001;
if( ( pm->cmd.buttons & ( BUTTON_LEANLEFT | BUTTON_LEANRIGHT ) &&
( pm->cmd.buttons & ( BUTTON_LEANLEFT | BUTTON_LEANRIGHT ) ) != ( BUTTON_LEANLEFT | BUTTON_LEANRIGHT ) ) )
if( ( pm->cmd.buttons & ( BUTTON_LEAN_LEFT | BUTTON_LEAN_RIGHT ) &&
( pm->cmd.buttons & ( BUTTON_LEAN_LEFT | BUTTON_LEAN_RIGHT ) ) != ( BUTTON_LEAN_LEFT | BUTTON_LEAN_RIGHT ) ) )
{
if( pm->cmd.buttons & BUTTON_LEANLEFT )
if( pm->cmd.buttons & BUTTON_LEAN_LEFT )
{
if( pm->ps->fLeanAngle <= -40.0f )
{
-3
View File
@@ -609,9 +609,6 @@ typedef enum {
ET_EXEC_COMMANDS
} entityType_t;
// su44; yes, I know there is no q3 trajectory_t in MoHAA,
// but I need it for fgame rotating doors code.
void BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result );
void BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result );
void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean snap );
+16 -16
View File
@@ -1907,11 +1907,11 @@ qboolean Player::checkattackleft
return false;
}
if( last_ucmd.buttons & BUTTON_ATTACK )
if( last_ucmd.buttons & BUTTON_ATTACKLEFT )
{
Weapon *weapon;
last_attack_button = BUTTON_ATTACK;
last_attack_button = BUTTON_ATTACKLEFT;
weapon = GetActiveWeapon( WEAPON_MAIN );
if( weapon )
@@ -1939,7 +1939,7 @@ qboolean Player::checkattackbuttonleft
return false;
}
return ( last_ucmd.buttons & BUTTON_ATTACK );
return ( last_ucmd.buttons & BUTTON_ATTACKLEFT );
}
@@ -1954,11 +1954,11 @@ qboolean Player::checkattackright
return false;
}
if( last_ucmd.buttons & BUTTON_ATTACK2 )
if( last_ucmd.buttons & BUTTON_ATTACKRIGHT )
{
Weapon *weapon;
last_attack_button = BUTTON_ATTACK2;
last_attack_button = BUTTON_ATTACKRIGHT;
weapon = GetActiveWeapon( WEAPON_MAIN );
if( weapon )
@@ -1986,7 +1986,7 @@ qboolean Player::checkattackbuttonright
return false;
}
return ( last_ucmd.buttons & BUTTON_ATTACK2 );
return ( last_ucmd.buttons & BUTTON_ATTACKRIGHT );
}
qboolean Player::checksneak
@@ -6957,7 +6957,7 @@ void Player::ClientThink
client->ps.pm_flags |= PMF_FROZEN;
client->ps.pm_flags |= PMF_INTERMISSION;
if( level.time - level.intermissiontime > 5.0f && ( new_buttons & ( BUTTON_ATTACK | BUTTON_ATTACK2 ) ) )
if( level.time - level.intermissiontime > 5.0f && ( new_buttons & ( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT ) ) )
{
level.exitintermission = true;
}
@@ -6998,7 +6998,7 @@ void Player::ClientThink
{
if( level.intermissiontype )
{
if( ( new_buttons & BUTTON_ATTACK ) || ( new_buttons & BUTTON_ATTACK2 ) )
if( ( new_buttons & BUTTON_ATTACKLEFT ) || ( new_buttons & BUTTON_ATTACKRIGHT ) )
{
if( level.intermissiontype == TRANS_MISSION_FAILED )
{
@@ -7044,7 +7044,7 @@ void Player::ClientThink
return;
}
if( new_buttons & BUTTON_ATTACK2 )
if( new_buttons & BUTTON_ATTACKRIGHT )
{
Weapon *weapon = GetActiveWeapon( WEAPON_MAIN );
@@ -7252,7 +7252,7 @@ void Player::Think
if (g_gametype->integer == GT_SINGLE_PLAYER)
{
if (((server_new_buttons & BUTTON_ATTACK) || (server_new_buttons & BUTTON_ATTACK2)) &&
if (((server_new_buttons & BUTTON_ATTACKLEFT) || (server_new_buttons & BUTTON_ATTACKRIGHT)) &&
(!GetActiveWeapon(WEAPON_MAIN)) &&
(!IsDead()) &&
(!IsNewActiveWeapon()) &&
@@ -7270,7 +7270,7 @@ void Player::Think
{
if (dmManager.AllowRespawn())
{
if (((server_new_buttons & BUTTON_ATTACK) || (server_new_buttons & BUTTON_ATTACK2)) ||
if (((server_new_buttons & BUTTON_ATTACKLEFT) || (server_new_buttons & BUTTON_ATTACKRIGHT)) ||
(g_forcerespawn->integer > 0 && level.time > g_forcerespawn->integer + respawn_time))
{
m_bSpectator = false;
@@ -7288,7 +7288,7 @@ void Player::Think
if (IsSpectator() && !m_bTempSpectator)
{
if (level.time <= respawn_time || !((server_new_buttons & BUTTON_ATTACK) || (server_new_buttons & BUTTON_ATTACK2)))
if (level.time <= respawn_time || !((server_new_buttons & BUTTON_ATTACKLEFT) || (server_new_buttons & BUTTON_ATTACKRIGHT)))
{
if (level.time - 10.0f > m_fWeapSelectTime)
{
@@ -11544,7 +11544,7 @@ void Player::EventGetFireHeld
)
{
ev->AddInteger( buttons & ( BUTTON_ATTACK | BUTTON_ATTACK2 ) ? qtrue : qfalse );
ev->AddInteger( buttons & ( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT ) ? qtrue : qfalse );
}
void Player::Score
@@ -14202,7 +14202,7 @@ void Player::LeanLeftHeld
player = ( Player * )this;
buttonheld = !!( player->buttons & BUTTON_LEANLEFT );
buttonheld = !!( player->buttons & BUTTON_LEAN_LEFT );
ev->AddInteger( buttonheld );
}
@@ -14218,7 +14218,7 @@ void Player::LeanRightHeld
player = ( Player * )this;
buttonheld = !!( player->buttons & BUTTON_LEANRIGHT );
buttonheld = !!( player->buttons & BUTTON_LEAN_RIGHT );
ev->AddInteger( buttonheld );
}
@@ -14362,7 +14362,7 @@ void Player::SecFireHeld
player = ( Player * )this;
buttonheld = !!( player->buttons & BUTTON_ATTACK2 );
buttonheld = !!( player->buttons & BUTTON_ATTACKRIGHT );
ev->AddInteger( buttonheld );
}
+12 -12
View File
@@ -503,7 +503,7 @@ void PlayerBot::UpdateBotStates
if( IsDead() )
{
// The bot should respawn
m_botCmd.buttons ^= BUTTON_ATTACK;
m_botCmd.buttons ^= BUTTON_ATTACKLEFT;
return;
}
@@ -1419,7 +1419,7 @@ void PlayerBot::State_EndAttack
)
{
m_botCmd.buttons &= ~( BUTTON_ATTACK | BUTTON_ATTACK2 );
m_botCmd.buttons &= ~( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT );
}
void PlayerBot::State_Attack
@@ -1470,16 +1470,16 @@ void PlayerBot::State_Attack
{
if( pWeap->IsSemiAuto() )
{
m_botCmd.buttons ^= BUTTON_ATTACK;
m_botCmd.buttons ^= BUTTON_ATTACKLEFT;
}
else
{
m_botCmd.buttons |= BUTTON_ATTACK;
m_botCmd.buttons |= BUTTON_ATTACKLEFT;
}
}
else
{
m_botCmd.buttons &= ~BUTTON_ATTACK;
m_botCmd.buttons &= ~BUTTON_ATTACKLEFT;
}
}
else if( pWeap->GetFireType( FIRE_SECONDARY ) == FT_MELEE )
@@ -1488,21 +1488,21 @@ void PlayerBot::State_Attack
if( fDistanceSquared <= fSecondaryBulletRangeSquared )
{
m_botCmd.buttons ^= BUTTON_ATTACK2;
m_botCmd.buttons ^= BUTTON_ATTACKRIGHT;
}
else
{
m_botCmd.buttons &= ~BUTTON_ATTACK2;
m_botCmd.buttons &= ~BUTTON_ATTACKRIGHT;
}
}
else
{
m_botCmd.buttons &= ~( BUTTON_ATTACK | BUTTON_ATTACK2 );
m_botCmd.buttons &= ~( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT );
}
}
else
{
m_botCmd.buttons &= ~( BUTTON_ATTACK | BUTTON_ATTACK2 );
m_botCmd.buttons &= ~( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT );
fMinDistanceSquared = 0;
}
@@ -1634,10 +1634,10 @@ void PlayerBot::Killed
Player::Killed( ev );
// send the respawn buttons
if( !( m_botCmd.buttons & BUTTON_ATTACK ) )
m_botCmd.buttons |= BUTTON_ATTACK;
if( !( m_botCmd.buttons & BUTTON_ATTACKLEFT ) )
m_botCmd.buttons |= BUTTON_ATTACKLEFT;
else
m_botCmd.buttons &= ~BUTTON_ATTACK;
m_botCmd.buttons &= ~BUTTON_ATTACKLEFT;
m_botEyes.ofs[ 0 ] = 0;
m_botEyes.ofs[ 1 ] = 0;
+1 -1
View File
@@ -772,7 +772,7 @@ qboolean TurretGun::UserAim
m_vUserLastCmdAng = vNewCmdAng;
if( ( ucmd->buttons & BUTTON_ATTACK ) || ( ucmd->buttons & BUTTON_ATTACK2 ) )
if( ( ucmd->buttons & BUTTON_ATTACKLEFT ) || ( ucmd->buttons & BUTTON_ATTACKRIGHT ) )
{
if( !m_iFiring ) {
m_iFiring = 1;
+4
View File
@@ -609,6 +609,7 @@ void CMod_LoadPatches( gamelump_t *surfs, gamelump_t *verts, int *shaderSubdivis
vec3_t points[MAX_PATCH_VERTS];
int width, height;
int shaderNum;
char tempName[MAX_QPATH + 1];
in = ( dsurface_t * )surfs->buffer;
if( surfs->length % sizeof( *in ) )
@@ -668,6 +669,9 @@ void CMod_LoadPatches( gamelump_t *surfs, gamelump_t *verts, int *shaderSubdivis
// create the internal facet structure
patch->pc = CM_GeneratePatchCollide( width, height, points, patch->subdivisions );
sprintf(tempName, "s%d", i);
UI_LoadResource(tempName);
}
Hunk_FreeTempMemory( shaderSubdivisions );
+31 -210
View File
@@ -31,6 +31,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include <winsock.h>
#endif
// FPS
#include <chrono>
#include <tiki.h>
qboolean CL_FinishedIntro(void);
@@ -72,7 +75,6 @@ fileHandle_t com_journalDataFile; // config files are written here
cvar_t *paused;
cvar_t *config;
cvar_t *fps;
float currentfps;
cvar_t *com_speeds;
cvar_t *developer;
cvar_t *com_dedicated;
@@ -126,6 +128,18 @@ static char *rd_buffer;
static int rd_buffersize;
static void (*rd_flush)( char *buffer );
#define MAX_FPS_TIMES 16
using fps_clock_t = std::chrono::high_resolution_clock;
using fps_time_t = fps_clock_t::time_point;
using fps_delta_t = fps_clock_t::duration;
static int fpsindex;
static fps_delta_t fpstimes[MAX_FPS_TIMES];
static fps_delta_t fpstotal;
static fps_time_t fpslasttime;
float currentfps;
void Com_BeginRedirect (char *buffer, int buffersize, void (*flush)( char *) )
{
if (!buffer || !buffersize || !flush)
@@ -1752,6 +1766,22 @@ void Com_Frame( void ) {
com_frameNumber, all, sv, ev, cl, time_game, time_frontend, time_backend );
}
if (fps->integer) {
fps_time_t fpstime = fps_clock_t::now();
fps_delta_t delta = fpstime - fpslasttime;
fpstotal = (fpstime - fpslasttime) + (fpstotal - fpstimes[fpsindex]);
fpstimes[fpsindex] = fpstime - fpslasttime;
fpsindex = (fpsindex + 1) % MAX_FPS_TIMES;
fpslasttime = fpstime;
if (fpstotal.count()) {
currentfps = 16.0 / std::chrono::duration<long double>(fpstotal).count();
} else {
currentfps = 0.0;
}
}
//
// trace optimization tracking
//
@@ -1893,23 +1923,10 @@ command line completion
===========================================
*/
/*
==================
Field_Clear
==================
*/
void Field_Clear( field_t *edit ) {
memset(edit->buffer, 0, MAX_EDIT_LINE);
edit->cursor = 0;
edit->scroll = 0;
}
static const char *completionString;
static char shortestMatch[MAX_TOKEN_CHARS];
static int matchCount;
// field we are working on, passed to Field_AutoComplete(&g_consoleCommand for instance)
static field_t *completionField;
/*
===============
FindMatches
@@ -1968,200 +1985,4 @@ static void PrintCvarMatches( const char *s ) {
}
}
/*
===============
Field_FindFirstSeparator
===============
*/
static char *Field_FindFirstSeparator( char *s )
{
int i;
for( i = 0; i < strlen( s ); i++ )
{
if( s[ i ] == ';' )
return &s[ i ];
}
return NULL;
}
#ifndef DEDICATED
/*
===============
Field_CompleteKeyname
===============
*/
static void Field_CompleteKeyname( void )
{
matchCount = 0;
shortestMatch[ 0 ] = 0;
Key_KeynameCompletion( FindMatches );
if( matchCount == 0 )
return;
Q_strncpyz( &completionField->buffer[ strlen( completionField->buffer ) -
strlen( completionString ) ], shortestMatch,
sizeof( completionField->buffer ) );
completionField->cursor = ( int )strlen( completionField->buffer );
if( matchCount == 1 )
{
Q_strcat( completionField->buffer, sizeof( completionField->buffer ), " " );
completionField->cursor++;
return;
}
Com_Printf( "]%s\n", completionField->buffer );
Key_KeynameCompletion( PrintMatches );
}
#endif
/*
===============
Field_CompleteFilename
===============
*/
static void Field_CompleteFilename( const char *dir,
const char *ext, qboolean stripExt )
{
size_t pos;
matchCount = 0;
shortestMatch[ 0 ] = 0;
FS_FilenameCompletion( dir, ext, stripExt, FindMatches );
if( matchCount == 0 )
return;
pos = strlen( completionField->buffer ) - strlen( completionString );
Q_strncpyz( &completionField->buffer[ pos ], shortestMatch,
sizeof( completionField->buffer ) - pos );
completionField->cursor = ( int )strlen( completionField->buffer );
if( matchCount == 1 )
{
Q_strcat( completionField->buffer, sizeof( completionField->buffer ), " " );
completionField->cursor++;
return;
}
Com_Printf( "]%s\n", completionField->buffer );
FS_FilenameCompletion( dir, ext, stripExt, PrintMatches );
}
static void keyConcatArgs(void) {
int i;
char* arg;
for (i = 1; i < Cmd_Argc(); i++) {
Q_strcat(completionField->buffer, sizeof(completionField->buffer), " ");
arg = Cmd_Argv(i);
while (*arg) {
if (*arg == ' ') {
Q_strcat(completionField->buffer, sizeof(completionField->buffer), "\"");
break;
}
arg++;
}
Q_strcat(completionField->buffer, sizeof(completionField->buffer), Cmd_Argv(i));
if (*arg == ' ') {
Q_strcat(completionField->buffer, sizeof(completionField->buffer), "\"");
}
}
}
static void ConcatRemaining(const char* src, const char* start) {
const char* str;
str = strstr(src, start);
if (!str) {
keyConcatArgs();
return;
}
str += strlen(start);
Q_strcat(completionField->buffer, sizeof(completionField->buffer), str);
}
/*
===============
Field_CompleteCommand
perform Tab expansion
NOTE TTimo this was originally client code only
moved to common code when writing tty console for *nix dedicated server
===============
*/
void Field_CompleteCommand(field_t* field) {
field_t temp;
completionField = field;
// only look at the first token for completion purposes
Cmd_TokenizeString(completionField->buffer);
completionString = Cmd_Argv(0);
if (completionString[0] == '\\' || completionString[0] == '/') {
completionString++;
}
matchCount = 0;
shortestMatch[0] = 0;
if (strlen(completionString) == 0) {
return;
}
Cmd_CommandCompletion(FindMatches);
Cvar_CommandCompletion(FindMatches);
if (matchCount == 0) {
return; // no matches
}
Com_Memcpy(&temp, completionField, sizeof(field_t));
if (matchCount == 1) {
Com_sprintf(completionField->buffer, sizeof(completionField->buffer), "\\%s", shortestMatch);
if (Cmd_Argc() == 1) {
Q_strcat(completionField->buffer, sizeof(completionField->buffer), " ");
}
else {
ConcatRemaining(temp.buffer, completionString);
}
completionField->cursor = strlen(completionField->buffer);
return;
}
// multiple matches, complete to shortest
Com_sprintf(completionField->buffer, sizeof(completionField->buffer), "\\%s", shortestMatch);
completionField->cursor = strlen(completionField->buffer);
ConcatRemaining(temp.buffer, completionString);
Com_Printf("]%s\n", completionField->buffer);
// run through again, printing matches
Cmd_CommandCompletion(PrintMatches);
Cvar_CommandCompletion(PrintMatches);
}
/*
===============
Field_AutoComplete
Perform Tab expansion
===============
*/
void Field_AutoComplete( field_t *field )
{
completionField = field;
Field_CompleteCommand(field);
}
}
+27 -36
View File
@@ -30,7 +30,9 @@ extern "C" {
#endif
#define PRODUCT_NAME "OpenMoHAA"
#define PRODUCT_VERSION "0.50-alpha"
#define PRODUCT_VERSION_NUMBER "0.51"
#define PRODUCT_VERSION_STAGE "alpha"
#define PRODUCT_VERSION PRODUCT_VERSION_NUMBER "-" PRODUCT_VERSION_STAGE
#define PRODUCT_DATE __DATE__
#if TARGET_GAME_TYPE == 1
@@ -1608,7 +1610,7 @@ typedef struct {
// maybe this is better put somewhere else...
typedef struct server_sound_s {
float origin[3];
vec3_t origin;
int entity_number;
int channel;
short int sound_index;
@@ -1712,44 +1714,33 @@ typedef struct playerState_s {
//====================================================================
#define BUTTON_ATTACKRIGHT_BITINDEX 0
#define BUTTON_ATTACKLEFT_BITINDEX 1
#define BUTTON_SNEAK_BITINDEX 2
#define BUTTON_RUN_BITINDEX 3
#define BUTTON_HOLSTERWEAPON_BITINDEX 4
#define BUTTON_USE_BITINDEX 5
#define BUTTON_TALK_BITINDEX 6 // displays talk balloon and disables actions
#define BUTTON_ANY_BITINDEX 11 // any key whatsoever
#define BUTTON_MOUSE_BITINDEX 14 // mouse move
//
// usercmd_t->button bits, many of which are generated by the client system,
// so they aren't game/cgame only definitions
// so they aren't game-only definitions
//
#define BUTTON_ATTACK 1 // +/-attackprimary
#define BUTTON_ATTACK2 2 // +/-attacksecondary
#define BUTTON_RUN 4 // +/-speed
// walking can't just be infered from MOVE_RUN
// because a key pressed late in the frame will
// only generate a small move value for that frame
// walking will use different animations and
// won't generate footsteps
#define BUTTON_ATTACKLEFT_BITINDEX 0
#define BUTTON_ATTACKRIGHT_BITINDEX 1
#define BUTTON_RUN_BITINDEX 2
#define BUTTON_USE_BITINDEX 3
#define BUTTON_LEAN_LEFT_BITINDEX 4
#define BUTTON_LEAN_RIGHT_BITINDEX 5
#define BUTTON_TALK_BITINDEX 6 // displays talk balloon and disables actions
#define BUTTON_ANY_BITINDEX 10 // any key whatsoever
#define BUTTON_ANY2_BITINDEX 11 // any key whatsoever (regardless of keycatcher)
#define BUTTON_MOUSE_BITINDEX 14 // mouse move
#define BUTTON_HOLSTER_BITINDEX 15
#define BUTTON_USE 8
#define BUTTON_LEANLEFT 16 // +/-leanleft
#define BUTTON_LEANRIGHT 32 // +/-leanright
#define BUTTON_NEGATIVE 64
#define BUTTON_GETFLAG 128
#define BUTTON_GUARDBASE 256
#define BUTTON_PATROL 512
#define BUTTON_FOLLOWME 1024
#define BUTTON_HOLSTER 32768
#define BUTTON_TALK ( 1 << BUTTON_TALK_BITINDEX ) // displays talk balloon and disables actions
#define BUTTON_ANY ( 1 << BUTTON_ANY_BITINDEX ) // any key whatsoever
#define BUTTON_MOUSE ( 1 << BUTTON_MOUSE_BITINDEX )
#define BUTTON_ATTACKLEFT (1 << BUTTON_ATTACKLEFT_BITINDEX)
#define BUTTON_ATTACKRIGHT (1 << BUTTON_ATTACKRIGHT_BITINDEX)
#define BUTTON_RUN (1 << BUTTON_RUN_BITINDEX)
#define BUTTON_USE (1 << BUTTON_USE_BITINDEX)
#define BUTTON_LEAN_LEFT (1 << BUTTON_LEAN_LEFT_BITINDEX)
#define BUTTON_LEAN_RIGHT (1 << BUTTON_LEAN_RIGHT_BITINDEX)
#define BUTTON_TALK (1 << BUTTON_TALK_BITINDEX) // displays talk balloon and disables actions
#define BUTTON_ANY (1 << BUTTON_ANY_BITINDEX) // any key whatsoever
#define BUTTON_ANY2 (1 << BUTTON_ANY_BITINDEX) // any key whatsoever (regardless of keycatcher)
#define BUTTON_MOUSE (1 << BUTTON_MOUSE_BITINDEX)
#define BUTTON_HOLSTER (1 << BUTTON_HOLSTER_BITINDEX)
#define WEAPON_COMMAND_USE_PISTOL 1
#define WEAPON_COMMAND_USE_RIFLE 2
+1 -21
View File
@@ -798,26 +798,6 @@ MISC
/*
==============================================================
Edit fields and command line history/completion
==============================================================
*/
#define MAX_EDIT_LINE 256
typedef struct {
int cursor;
int scroll;
int widthInChars;
char buffer[MAX_EDIT_LINE];
} field_t;
void Field_Clear( field_t *edit );
void Field_CompleteCommand( field_t *edit );
void Field_AutoComplete( field_t *edit );
/*
==============================================================
MISC
==============================================================
@@ -882,10 +862,10 @@ void Com_StartupVariable( const char *match );
// only a set with the exact name. Only used during startup.
extern float currentfps;
extern cvar_t *paused;
extern cvar_t *config;
extern cvar_t *fps;
extern float currentfps;
extern cvar_t *developer;
extern cvar_t *com_dedicated;
extern cvar_t *com_speeds;
+2 -1
View File
@@ -708,6 +708,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
depthRange = qfalse;
backEnd.pc.c_surfaces += numDrawSurfs;
backEnd.numSpheresUsed = 0;
for (i = 0, drawSurf = drawSurfs ; i < numDrawSurfs ; i++, drawSurf++) {
if ( drawSurf->sort == oldSort ) {
@@ -852,7 +853,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
}
else
{
backEnd.currentSphere = &backEnd.spheres[backEnd.currentEntity->lightingSphere];
backEnd.currentSphere = &backEnd.spheres[backEnd.numSpheresUsed];
backEnd.currentEntity->lightingSphere = backEnd.numSpheresUsed++;
backEnd.currentEntity->sphereCalculated = 1;
}
+10
View File
@@ -42,6 +42,16 @@ R_PerformanceCounters
=====================
*/
void R_PerformanceCounters( void ) {
if (fps->integer) {
ri.SetPerformanceCounters(
backEnd.pc.c_totalIndexes / 3,
backEnd.pc.c_vertexes,
R_SumOfUsedImages(pc_save.c_totalIndexes / 3, pc_save.c_vertexes),
pc_save.c_totalIndexes / 3,
pc_save.c_vertexes,
backEnd.pc.c_characterlights
);
}
if ( !r_speeds->integer ) {
// clear the counters even if we aren't printing
Com_Memset( &tr.pc, 0, sizeof( tr.pc ) );
+9
View File
@@ -49,6 +49,8 @@ int gl_filter_max = GL_LINEAR;
#define FILE_HASH_SIZE 1024
static image_t* hashTable[FILE_HASH_SIZE];
extern qboolean scr_initialized;
/*
** R_GammaCorrect
*/
@@ -1881,6 +1883,7 @@ Loads any of the supported image types into a cannonical
*/
static void R_LoadImage(const char* name, byte** pic, int* width, int* height, qboolean* hasAlpha, int* glCompressMode, int* numMipmaps, int* piMipmapsAvailable) {
int len;
char tempName[MAX_STRING_TOKENS + 1];
*hasAlpha = qfalse;
*glCompressMode = 0;
@@ -1918,6 +1921,12 @@ static void R_LoadImage(const char* name, byte** pic, int* width, int* height, q
LoadJPG(name, pic, width, height);
*piMipmapsAvailable = 1;
}
if (scr_initialized)
{
sprintf(tempName, "n%s", name);
UI_LoadResource(tempName);
}
}
+2 -2
View File
@@ -330,10 +330,10 @@ void R_SetupEntityLighting( const trRefdef_t *refdef, trRefEntity_t *ent ) {
vec3_t lightOrigin;
// lighting calculations
if ( ent->lightingCalculated ) {
if ( ent->bLightGridCalculated ) {
return;
}
ent->lightingCalculated = qtrue;
ent->bLightGridCalculated = qtrue;
//
// trace a sample point down to find ambient light
+13 -11
View File
@@ -129,7 +129,7 @@ typedef struct {
vec3_t traceOrigin;
float radius;
struct mnode_s* leaves[8];
void(*TessFunction) ();
void(*TessFunction) (unsigned char* dstColors);
union {
unsigned char level[4];
int value;
@@ -170,17 +170,19 @@ typedef struct {
float axisLength; // compensate for non-normalized axis
qboolean needDlights; // true for bmodels that touch a dlight
qboolean lightingCalculated;
vec3_t lightDir; // normalized direction towards light
vec3_t ambientLight; // color normalized to 0-255
int ambientLightInt; // 32 bit rgba packed
vec3_t directedLight;
qboolean bLightGridCalculated;
int iGridLighting;
float lodpercentage[2];
qboolean sphereCalculated;
int lightingSphere;
//
// old lighting variables
//
vec3_t lightDir; // normalized direction towards light
vec3_t ambientLight; // color normalized to 0-255
int ambientLightInt; // 32 bit rgba packed
vec3_t directedLight;
} trRefEntity_t;
typedef struct refSprite_s {
@@ -724,9 +726,9 @@ typedef struct drawSurf_s {
typedef struct srfPoly_s {
surfaceType_t surfaceType;
qhandle_t hShader;
int fogIndex;
int numVerts;
polyVert_t *verts;
int renderfx;
} srfPoly_t;
typedef struct srfMarkFragment_s {
@@ -1962,7 +1964,7 @@ void RE_AddRefEntityToScene( const refEntity_t *ent, int parentEntityNumber);
void RE_AddRefSpriteToScene(const refEntity_t* ent);
void RE_AddTerrainMarkToScene(int iTerrainIndex, qhandle_t hShader, int numVerts, const polyVert_t* verts, int renderfx);
refEntity_t* RE_GetRenderEntity(int entityNumber);
qboolean RE_AddPolyToScene(qhandle_t hShader, int numVerts, const polyVert_t* verts, int numPolys);
qboolean RE_AddPolyToScene(qhandle_t hShader, int numVerts, polyVert_t* verts, int renderfx);
void RE_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b, int type );
void RE_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b );
void RE_RenderScene( const refdef_t *fd );
@@ -2253,8 +2255,8 @@ typedef enum {
// these are sort of arbitrary limits.
// the limits apply to the sum of all scenes in a frame --
// the main view, all the 3D icons, etc
#define MAX_POLYS 600
#define MAX_POLYVERTS 3000
#define MAX_POLYS 4096
#define MAX_POLYVERTS 16384
#define MAX_TERMARKS 1024
// all of the information needed by the back end must be
+39 -68
View File
@@ -131,83 +131,28 @@ RE_AddPolyToScene
=====================
*/
qboolean RE_AddPolyToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts, int numPolys ) {
qboolean RE_AddPolyToScene(qhandle_t hShader, int numVerts, polyVert_t* verts, int renderfx) {
srfPoly_t *poly;
int i, j;
int fogIndex;
fog_t *fog;
vec3_t bounds[2];
if ( !tr.registered ) {
return qfalse;
}
if ( !hShader ) {
ri.Printf( PRINT_WARNING, "WARNING: RE_AddPolyToScene: NULL poly shader\n");
if (numVerts + r_numpolyverts > max_polyverts || r_numpolys >= max_polys) {
ri.Printf(PRINT_WARNING, "Exceeded MAX POLYS\n");
return qfalse;
}
for ( j = 0; j < numPolys; j++ ) {
if ( r_numpolyverts + numVerts > max_polyverts || r_numpolys >= max_polys ) {
/*
NOTE TTimo this was initially a PRINT_WARNING
but it happens a lot with high fighting scenes and particles
since we don't plan on changing the const and making for room for those effects
simply cut this message to developer only
*/
ri.Printf( PRINT_DEVELOPER, "WARNING: RE_AddPolyToScene: r_max_polys or r_max_polyverts reached\n");
return qfalse;
}
poly = &backEndData[tr.smpFrame]->polys[r_numpolys];
poly->surfaceType = SF_POLY;
poly->hShader = hShader;
poly->numVerts = numVerts;
poly->verts = &backEndData[tr.smpFrame]->polyVerts[r_numpolyverts];
poly->renderfx = renderfx;
poly = &backEndData[tr.smpFrame]->polys[r_numpolys];
poly->surfaceType = SF_POLY;
poly->hShader = hShader;
poly->numVerts = numVerts;
poly->verts = &backEndData[tr.smpFrame]->polyVerts[r_numpolyverts];
Com_Memcpy( poly->verts, &verts[numVerts*j], numVerts * sizeof( *verts ) );
if ( glConfig.hardwareType == GLHW_RAGEPRO ) {
poly->verts->modulate[0] = 255;
poly->verts->modulate[1] = 255;
poly->verts->modulate[2] = 255;
poly->verts->modulate[3] = 255;
}
// done.
r_numpolys++;
r_numpolyverts += numVerts;
// if no world is loaded
if ( tr.world == NULL ) {
fogIndex = 0;
}
// see if it is in a fog volume
else if ( tr.world->numfogs == 1 ) {
fogIndex = 0;
} else {
// find which fog volume the poly is in
VectorCopy( poly->verts[0].xyz, bounds[0] );
VectorCopy( poly->verts[0].xyz, bounds[1] );
for ( i = 1 ; i < poly->numVerts ; i++ ) {
AddPointToBounds( poly->verts[i].xyz, bounds[0], bounds[1] );
}
for ( fogIndex = 1 ; fogIndex < tr.world->numfogs ; fogIndex++ ) {
fog = &tr.world->fogs[fogIndex];
if ( bounds[1][0] >= fog->bounds[0][0]
&& bounds[1][1] >= fog->bounds[0][1]
&& bounds[1][2] >= fog->bounds[0][2]
&& bounds[0][0] <= fog->bounds[1][0]
&& bounds[0][1] <= fog->bounds[1][1]
&& bounds[0][2] <= fog->bounds[1][2] ) {
break;
}
}
if ( fogIndex == tr.world->numfogs ) {
fogIndex = 0;
}
}
poly->fogIndex = fogIndex;
}
Com_Memcpy(poly->verts, verts, sizeof(polyVert_t) * numVerts);
++r_numpolys;
r_numpolyverts += numVerts;
return qtrue;
}
@@ -268,7 +213,33 @@ void RE_AddRefEntityToScene( const refEntity_t *ent, int parentEntityNumber) {
}
backEndData[tr.smpFrame]->entities[r_numentities].e = *ent;
backEndData[tr.smpFrame]->entities[r_numentities].lightingCalculated = qfalse;
backEndData[tr.smpFrame]->entities[r_numentities].bLightGridCalculated = qfalse;
backEndData[tr.smpFrame]->entities[r_numentities].sphereCalculated = qfalse;
if (parentEntityNumber != ENTITYNUM_NONE)
{
int i;
//
// Find the parent entity to attach to
//
for (i = r_firstSceneEntity; i < r_numentities; i++)
{
if (backEndData[tr.smpFrame]->entities[i].e.entityNumber == parentEntityNumber)
{
backEndData[tr.smpFrame]->entities[r_numentities].e.parentEntity = i - r_firstSceneEntity;
break;
}
}
if (i == r_numentities) {
backEndData[tr.smpFrame]->entities[i].e.parentEntity = ENTITYNUM_NONE;
}
}
else
{
backEndData[tr.smpFrame]->entities[r_numentities].e.parentEntity = ENTITYNUM_NONE;
}
r_numentities++;
}
+91 -2
View File
@@ -810,9 +810,98 @@ static void ComputeColors( shaderStage_t *pStage )
break;
case CGEN_LIGHTING_SPHERICAL:
case CGEN_STATIC:
if (!r_drawspherelights->integer)
if (!r_drawspherelights->integer) {
break;
// FIXME: unimplemented
}
if (!backEnd.currentStaticModel) {
if (backEnd.currentSphere->TessFunction) {
backEnd.currentSphere->TessFunction((unsigned char*)tess.svars.colors);
}
break;
}
if (!tess.vertexColorValid) {
ri.Printf(PRINT_WARNING, "Vertex color specified for shader '%s', but vertex colors are not valid for this model\n", tess.shader->name);
}
if (backEnd.currentStaticModel->useSpecialLighting)
{
for (i = 0; i < tess.numVertexes; i++)
{
int j;
vec3_t colorout;
int r, g, b;
colorout[0] = tess.vertexColors[i][0];
colorout[1] = tess.vertexColors[i][1];
colorout[2] = tess.vertexColors[i][2];
for (j = 0; j < backEnd.currentStaticModel->numdlights; j++)
{
float ooLightDistSquared;
float dot;
vec3_t diff;
dlight_t* dl;
dl = &backEnd.refdef.dlights[backEnd.currentStaticModel->dlights[j].index];
VectorSubtract(backEnd.currentStaticModel->dlights[j].transformed, tess.xyz[i], diff);
dot = DotProduct(diff, tess.normal[i]);
if (dot >= 0)
{
float ooLen;
ooLen = 1.0 / VectorLengthSquared(diff);
ooLightDistSquared = dot * (7500.0 * dl->radius * ooLen * sqrt(ooLen));
colorout[0] = dl->color[0] * ooLightDistSquared + colorout[0];
colorout[1] = dl->color[1] * ooLightDistSquared + colorout[1];
colorout[2] = dl->color[2] * ooLightDistSquared + colorout[2];
}
}
r = colorout[0];
g = colorout[1];
b = colorout[2];
if (tr.overbrightShift)
{
r = (int)((float)r * tr.overbrightMult);
g = (int)((float)g * tr.overbrightMult);
b = (int)((float)b * tr.overbrightMult);
}
if (r > 0xFF || g > 0xFF || b > 0xFF)
{
float t;
t = 255.0 / (float)max(r, max(g, b));
r = (int)((float)r * t);
g = (int)((float)g * t);
b = (int)((float)b * t);
}
tess.svars.colors[i][0] = r;
tess.svars.colors[i][1] = g;
tess.svars.colors[i][2] = b;
}
}
else
{
if (tr.identityLight == 1.0)
{
Com_Memcpy(tess.svars.colors, tess.vertexColors, tess.numVertexes * sizeof(tess.vertexColors[0]));
}
else
{
for (i = 0; i < tess.numVertexes; i++) {
tess.svars.colors[i][0] = tess.vertexColors[i][0] * tr.identityLight;
tess.svars.colors[i][1] = tess.vertexColors[i][1] * tr.identityLight;
tess.svars.colors[i][2] = tess.vertexColors[i][2] * tr.identityLight;
}
}
}
break;
case CGEN_CONSTANT:
RB_CalcColorFromConstant((unsigned char*)tess.svars.colors, pStage->colorConst);
+1 -1
View File
@@ -871,7 +871,7 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
ParseWaveForm( text, &stage->rgbWave );
stage->rgbGen = CGEN_WAVEFORM;
}
else if ( !Q_stricmp( token, "const" ) )
else if ( !Q_stricmp( token, "const" ) || !Q_stricmp(token, "constant"))
{
vec3_t color;
+5 -4
View File
@@ -216,7 +216,11 @@ extern uidef_t uid;
extern uiexport_t uie;
extern uiimport_t uii;
void UI_Init(void);
void UI_Shutdown(void);
void UI_InitExports();
qboolean CL_FinishedIntro(void);
void UI_StartStageKeyEvent(void);
void UI_GetMouseState( int *mouseX, int *mouseY, int *flags );
int UI_GetCvarInt( const char *name, int def );
float UI_GetCvarFloat( const char *name, float def );
@@ -226,8 +230,5 @@ void UI_SetCvarInt( const char *cvar, int value );
void UI_SetCvarFloat( const char *cvar, float value );
void UI_ListFiles( const char *filespec );
const char *UI_ConfigString( int index );
void UI_Init( void );
void UI_Shutdown( void );
void UI_InitExports();
#endif
+67 -9
View File
@@ -24,12 +24,35 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
CLASS_DECLARATION( UIWidget, UIList, NULL )
{
{ &W_LeftMouseDown, &UIList::Pressed },
{ &W_LeftMouseUp, &UIList::Released },
{ &EV_Layout_AddListItem, &UIList::LayoutAddListItem },
{ NULL, NULL }
};
UIList::UIList()
{
// FIXME: stub
m_arrow_width = 15.0;
m_arrow_width = 0.0;
m_currentItem = 0;
m_next_arrow_region = 0;
m_prev_arrow_region = 0;
m_prev_arrow_depressed = 0;
m_next_arrow_depressed = 0;
AllowActivate(true);
m_prev_arrow = uWinMan.RegisterShader("gfx/2d/arrow_left.tga");
if (!m_prev_arrow) {
uii.Sys_Printf("UIList::Ulist : Could not register shader gfx/2d/arrow_left.tga");
}
m_next_arrow = uWinMan.RegisterShader("gfx/2d/arrow_right.tga");
if (!m_next_arrow) {
uii.Sys_Printf("UIList::Ulist : Could not register shader gfx/2d/arrow_right.tga");
}
}
void UIList::Draw
@@ -48,8 +71,26 @@ qboolean UIList::KeyEvent
)
{
// FIXME: stub
return qfalse;
switch (key)
{
case K_RIGHTARROW:
ScrollNext();
UpdateData();
if (m_commandhandler) {
m_commandhandler(m_itemlist.ObjectAt(m_currentItem)->itemname.c_str(), NULL);
}
return qtrue;
case K_LEFTARROW:
ScrollPrev();
UpdateData();
if (m_commandhandler) {
m_commandhandler(m_itemlist.ObjectAt(m_currentItem)->itemname.c_str(), NULL);
}
return qtrue;
default:
return qfalse;
}
}
void UIList::CharEvent
@@ -58,7 +99,6 @@ void UIList::CharEvent
)
{
// FIXME: stub
}
void UIList::Pressed
@@ -85,7 +125,10 @@ void UIList::ScrollNext
)
{
// FIXME: stub
m_currentItem++;
if (m_currentItem > m_itemlist.NumObjects()) {
m_currentItem = m_itemlist.NumObjects();
}
}
void UIList::ScrollPrev
@@ -94,7 +137,10 @@ void UIList::ScrollPrev
)
{
// FIXME: stub
m_currentItem--;
if (m_currentItem < 1) {
m_currentItem = 1;
}
}
void UIList::FrameInitialized
@@ -103,7 +149,8 @@ void UIList::FrameInitialized
)
{
// FIXME: stub
m_prev_arrow_region = new UIRect2D(m_clippedframe.pos.x, m_clippedframe.pos.y, m_arrow_width, m_frame.size.height);
m_next_arrow_region = new UIRect2D(m_clippedframe.size.width - m_arrow_width + m_clippedframe.pos.x, m_clippedframe.pos.y, m_arrow_width, m_frame.size.height);
}
void UIList::LayoutAddListItem
@@ -155,6 +202,17 @@ qboolean UIListIndex::KeyEvent
)
{
// FIXME: stub
return qfalse;
switch (key)
{
case K_RIGHTARROW:
ScrollNext();
UpdateData();
return qtrue;
case K_LEFTARROW:
ScrollPrev();
UpdateData();
return qtrue;
default:
return qfalse;
}
}
+192 -29
View File
@@ -29,7 +29,10 @@ CLASS_DECLARATION( UIWidget, UIListBase, NULL )
UIListBase::UIListBase()
{
// FIXME: stub
m_currentItem = 0;
m_vertscroll = 0;
m_bUseVertScroll = 1;
AllowActivate(true);
}
void UIListBase::TrySelectItem
@@ -58,7 +61,13 @@ void UIListBase::FrameInitialized
)
{
// FIXME: stub
if (m_vertscroll) {
delete m_vertscroll;
}
m_vertscroll = new UIVertScroll();
m_vertscroll->InitFrame(this, m_frame.size.width - 16.0, 0.0, 16.0, m_frame.size.height, -1);
m_vertscroll->setTopItem(0);
}
int UIListBase::getCurrentItem
@@ -67,8 +76,7 @@ int UIListBase::getCurrentItem
)
{
// FIXME: stub
return 0;
return m_currentItem;
}
int UIListBase::getNumItems
@@ -77,8 +85,7 @@ int UIListBase::getNumItems
)
{
// FIXME: stub
return 0;
return -1;
}
void UIListBase::DeleteAllItems
@@ -87,7 +94,6 @@ void UIListBase::DeleteAllItems
)
{
// FIXME: stub
}
void UIListBase::DeleteItem
@@ -96,7 +102,6 @@ void UIListBase::DeleteItem
)
{
// FIXME: stub
}
UIVertScroll *UIListBase::GetScrollBar
@@ -105,8 +110,7 @@ UIVertScroll *UIListBase::GetScrollBar
)
{
// FIXME: stub
return NULL;
return m_vertscroll;
}
void UIListBase::SetUseScrollBar
@@ -115,12 +119,28 @@ void UIListBase::SetUseScrollBar
)
{
// FIXME: stub
m_bUseVertScroll = bUse;
if (bUse)
{
if (!m_vertscroll) {
m_vertscroll = new UIVertScroll();
}
m_vertscroll->InitFrame(this, m_frame.size.width - 16.0, 0.0, 16.0, m_frame.size.height, -1);
}
else
{
if (m_vertscroll) {
delete m_vertscroll;
m_vertscroll = NULL;
}
}
}
ListItem::ListItem()
{
// FIXME: stub
index = -1;
}
ListItem::ListItem
@@ -131,17 +151,71 @@ ListItem::ListItem
)
{
// FIXME: stub
this->string = string;
this->index = index;
this->command = command;
}
Event EV_UIListBase_ItemSelected
(
"listbase_item_selected",
EV_DEFAULT,
"i",
"index",
"Signaled when an item is selected"
);
Event EV_UIListBase_ItemDoubleClicked
(
"listbase_item_doubleclicked",
EV_DEFAULT,
"i",
"index",
"Signaled when an item is double clicked"
);
Event EV_Layout_AddListItem
(
"additem",
EV_DEFAULT,
"sS",
"itemname command",
"Add an item to the list"
);
Event EV_Layout_AddConfigstringListItem
(
"addconfigstringitem",
EV_DEFAULT,
"iS",
"index command",
"Add an item to the list that uses a configstring"
);
Event EV_UIListBox_DeleteAllItems
(
"deleteallitems",
EV_DEFAULT,
NULL,
NULL,
"Delete all the items from the widget"
);
CLASS_DECLARATION( UIListBase, UIListBox, NULL )
{
{ &W_LeftMouseDown, &UIListBox::MousePressed },
{ &W_LeftMouseUp, &UIListBox::MouseReleased },
{ &EV_Layout_AddListItem, &UIListBox::LayoutAddListItem },
{ &EV_Layout_AddConfigstringListItem, &UIListBox::LayoutAddConfigstringListItem },
{ &EV_UIListBox_DeleteAllItems, &UIListBox::DeleteAllItems },
{ &EV_Layout_Font, &UIListBox::SetListFont },
{ NULL, NULL }
};
UIListBox::UIListBox()
{
// FIXME: stub
m_clickState.point.x = 0.0;
m_clickState.point.y = 0.0;
}
void UIListBox::Draw
@@ -168,7 +242,6 @@ void UIListBox::MouseReleased
)
{
// FIXME: stub
}
void UIListBox::DeleteAllItems
@@ -177,7 +250,14 @@ void UIListBox::DeleteAllItems
)
{
// FIXME: stub
m_itemlist.ClearObjectList();
m_currentItem = 0;
if (m_vertscroll)
{
m_vertscroll->setNumItems(0);
m_vertscroll->setTopItem(0);
}
}
void UIListBox::SetListFont
@@ -186,7 +266,13 @@ void UIListBox::SetListFont
)
{
// FIXME: stub
LayoutFont(ev);
if (m_vertscroll) {
m_vertscroll->setPageHeight(m_frame.size.height / m_font->getHeight(m_bVirtual));
}
FrameInitialized();
}
void UIListBox::TrySelectItem
@@ -195,7 +281,16 @@ void UIListBox::TrySelectItem
)
{
// FIXME: stub
UIListBase::TrySelectItem(which);
if (!getNumItems()) {
return;
}
if (m_cvarname.length())
{
uii.Cvar_Set(m_cvarname.c_str(), m_itemlist.ObjectAt(m_currentItem)->string.c_str());
}
}
void UIListBox::AddItem
@@ -205,7 +300,27 @@ void UIListBox::AddItem
)
{
// FIXME: stub
ListItem* li;
li = new ListItem();
if (!li) {
uii.Sys_Error(ERR_DROP, "Couldn't create list item\n");
}
li->string = item;
if (command) {
li->command = command;
}
m_itemlist.AddObject(li);
if (!m_currentItem) {
m_currentItem = 1;
}
if (m_vertscroll) {
m_vertscroll->setNumItems(m_itemlist.NumObjects());
}
}
void UIListBox::AddItem
@@ -215,7 +330,27 @@ void UIListBox::AddItem
)
{
// FIXME: stub
ListItem* li;
li = new ListItem();
if (!li) {
uii.Sys_Error(ERR_DROP, "Couldn't create list item\n");
}
li->index = index;
if (command) {
li->command = command;
}
m_itemlist.AddObject(li);
if (!m_currentItem) {
m_currentItem = 1;
}
if (m_vertscroll) {
m_vertscroll->setNumItems(m_itemlist.NumObjects());
}
}
void UIListBox::FrameInitialized
@@ -224,7 +359,12 @@ void UIListBox::FrameInitialized
)
{
// FIXME: stub
UIListBase::FrameInitialized();
if (m_vertscroll) {
m_vertscroll->setPageHeight(m_frame.size.height / m_font->getHeight(m_bVirtual));
m_vertscroll->setNumItems(m_itemlist.NumObjects());
}
}
void UIListBox::LayoutAddListItem
@@ -233,7 +373,12 @@ void UIListBox::LayoutAddListItem
)
{
// FIXME: stub
if (ev->NumArgs() != 2) {
AddItem(ev->GetString(1), NULL);
return;
}
AddItem(ev->GetString(1), ev->GetString(2).c_str());
}
void UIListBox::LayoutAddConfigstringListItem
@@ -242,7 +387,12 @@ void UIListBox::LayoutAddConfigstringListItem
)
{
// FIXME: stub
if (ev->NumArgs() != 2) {
AddItem(ev->GetInteger(1), NULL);
return;
}
AddItem(ev->GetInteger(1), ev->GetString(2).c_str());
}
str UIListBox::getItemText
@@ -251,8 +401,7 @@ str UIListBox::getItemText
)
{
// FIXME: stub
return "";
return m_itemlist.ObjectAt(which)->string;
}
int UIListBox::getNumItems
@@ -261,8 +410,7 @@ int UIListBox::getNumItems
)
{
// FIXME: stub
return 0;
return m_itemlist.NumObjects();
}
void UIListBox::DeleteAllItems
@@ -271,7 +419,14 @@ void UIListBox::DeleteAllItems
)
{
// FIXME: stub
m_itemlist.ClearObjectList();
m_currentItem = 0;
if (m_vertscroll)
{
m_vertscroll->setNumItems(0);
m_vertscroll->setTopItem(0);
}
}
void UIListBox::DeleteItem
@@ -280,5 +435,13 @@ void UIListBox::DeleteItem
)
{
// FIXME: stub
m_itemlist.RemoveObjectAt(which);
if (m_vertscroll) {
m_vertscroll->setNumItems(m_itemlist.NumObjects());
}
if (m_currentItem > getNumItems()) {
TrySelectItem(getNumItems());
}
}
+2
View File
@@ -23,6 +23,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#ifndef __UILISTBOX_H__
#define __UILISTBOX_H__
extern Event EV_Layout_AddListItem;
class UIListBase : public UIWidget {
protected:
int m_currentItem;
+474 -84
View File
@@ -21,66 +21,35 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "ui_local.h"
#include "localization.h"
griditemtype_t UIListCtrlItem::getListItemType
(
int which
) const
static UISize2D s_columnpadding;
{
// FIXME: stub
return TYPE_STRING;
}
str UIListCtrlItem::getListItemString
(
int which
) const
{
// FIXME: stub
return "";
}
int UIListCtrlItem::getListItemValue
(
int which
) const
{
// FIXME: stub
return 0;
}
void UIListCtrlItem::DrawListItem
(
int,
UIRect2D const &,
bool, UIFont *
)
{
// FIXME: stub
}
qboolean UIListCtrlItem::IsHeaderEntry
(
void
) const
{
// FIXME: stub
return qfalse;
}
bool UIListCtrl::s_qsortreverse;
int UIListCtrl::s_qsortcolumn;
class UIListCtrl* UIListCtrl::s_qsortobject;
CLASS_DECLARATION( UIListBase, UIListCtrl, NULL )
{
{ &W_SizeChanged, &UIListCtrl::OnSizeChanged },
{ &W_LeftMouseDown, &UIListCtrl::MousePressed },
{ &W_LeftMouseUp, &UIListCtrl::MouseReleased },
{ &W_LeftMouseDragged, &UIListCtrl::MouseDragged },
{ &W_MouseEntered, &UIListCtrl::MouseEntered },
{ NULL, NULL }
};
UIListCtrl::UIListCtrl()
{
// FIXME: stub
m_clickState.point.x = m_clickState.point.y = 0;
m_sizestate.column = 0;
m_iLastSortColumn = 0;
m_bDrawHeader = qtrue;
m_headerfont = NULL;
Connect(this, W_SizeChanged, W_SizeChanged);
m_background_color = UColor(0.02f, 0.07f, 0.005f, 1.0f);
m_foreground_color = UHudColor;
}
int UIListCtrl::StringCompareFunction
@@ -91,8 +60,34 @@ int UIListCtrl::StringCompareFunction
)
{
// FIXME: stub
return 0;
if (i1->getListItemType(columnname) != TYPE_STRING || i2->getListItemType(columnname) != TYPE_STRING) {
return 0;
}
const char* s1 = i1->getListItemString(columnname);
const char* s2 = i2->getListItemString(columnname);
if (*s1 == '.')
{
if (*s2 != '.') {
return -1;
}
}
else if (*s2 == '.') {
return 1;
}
if (*s1 == '[')
{
if (*s2 != '[') {
return -1;
}
}
else if (*s2 == '[') {
return 1;
}
return Q_stricmp(s1, s2);
}
int UIListCtrl::StringNumberCompareFunction
@@ -103,8 +98,18 @@ int UIListCtrl::StringNumberCompareFunction
)
{
// FIXME: stub
return 0;
int val1, val2;
val1 = i1->getListItemValue(columnname);
val2 = i2->getListItemValue(columnname);
if (val1 > val2) {
return 1;
} else if (val1 < val2) {
return -1;
} else {
return 0;
}
}
int UIListCtrl::QsortCompare
@@ -114,8 +119,8 @@ int UIListCtrl::QsortCompare
)
{
// FIXME: stub
return 0;
int val = s_qsortobject->m_comparefunction((const UIListCtrlItem*)e1, (const UIListCtrlItem*)e2, s_qsortcolumn);
return s_qsortreverse ? -val : val;
}
void UIListCtrl::Draw
@@ -124,7 +129,11 @@ void UIListCtrl::Draw
)
{
// FIXME: stub
if (m_bDrawHeader) {
DrawColumns();
}
DrawContent();
}
int UIListCtrl::getHeaderHeight
@@ -133,8 +142,19 @@ int UIListCtrl::getHeaderHeight
)
{
// FIXME: stub
return 0;
if (!m_bDrawHeader) {
return 0;
}
if (m_headerfont) {
return (int)(m_headerfont->getHeight(m_bVirtual) + (s_columnpadding.height + s_columnpadding.height) * m_vVirtualScale[1]);
}
if (m_font) {
return (int)(m_font->getHeight(m_bVirtual) + (s_columnpadding.height + s_columnpadding.height) * m_vVirtualScale[1]);
}
return (int)((s_columnpadding.height + s_columnpadding.height) * m_vVirtualScale[1]);
}
void UIListCtrl::MousePressed
@@ -143,7 +163,73 @@ void UIListCtrl::MousePressed
)
{
// FIXME: stub
UIPoint2D p;
p = MouseEventToClientPoint(ev);
if (m_clicksound.length()) {
uii.Snd_PlaySound(m_clicksound.c_str());
}
if (getHeaderHeight() > p.y)
{
int closesep = 0;
int atleft = 0;
int closeatleft = 0;
int insep = 0;
for (int i = 1; i <= m_columnlist.NumObjects(); i++) {
const columndef_t& column = m_columnlist.ObjectAt(i);
atleft += column.width;
if (abs(atleft - p.x) > 2)
{
if (atleft - column.width < p.x && atleft > p.x) {
insep = i;
}
}
else
{
closesep = i;
closeatleft = atleft;
}
}
if (closesep)
{
m_sizestate.column = closesep;
m_sizestate.min = closeatleft - m_columnlist.ObjectAt(closesep).width;
uWinMan.setFirstResponder(this);
} else {
SortByColumn(m_columnlist.ObjectAt(insep).name);
}
}
else
{
if (m_vertscroll) {
TrySelectItem((m_vertscroll->getTopItem() + 1) + (p.y - getHeaderHeight()) / m_font->getHeight(m_bVirtual));
} else {
TrySelectItem(1.0 + (p.y - getHeaderHeight()) / m_font->getHeight(m_bVirtual));
}
if (m_clickState.time + 500 > uid.time
&& m_currentItem == m_clickState.selected
&& fabs(m_clickState.point.x - p.x) <= 2.0
&& fabs(m_clickState.point.y - p.y) <= 2.0)
{
Event newev;
newev.AddInteger(m_currentItem);
SendSignal(newev);
m_clickState.time = 0;
}
else
{
m_clickState.time = uid.time;
m_clickState.selected = m_currentItem;
m_clickState.point.x = p.x;
m_clickState.point.y = p.y;
}
}
}
void UIListCtrl::MouseDragged
@@ -152,7 +238,23 @@ void UIListCtrl::MouseDragged
)
{
// FIXME: stub
UIPoint2D p;
int newwidth;
p = MouseEventToClientPoint(ev);
if (m_sizestate.column)
{
columndef_t& column = m_columnlist.ObjectAt(m_sizestate.column);
newwidth = p.x - m_sizestate.min;
if (newwidth > 600) {
newwidth = 600;
} else if (newwidth < 0) {
newwidth = 0;
}
column.width = newwidth;
}
}
void UIListCtrl::MouseReleased
@@ -161,7 +263,11 @@ void UIListCtrl::MouseReleased
)
{
// FIXME: stub
m_sizestate.column = 0;
if (uWinMan.getFirstResponder() == this) {
uWinMan.setFirstResponder(NULL);
}
}
void UIListCtrl::MouseEntered
@@ -170,7 +276,7 @@ void UIListCtrl::MouseEntered
)
{
// FIXME: stub
uWinMan.ActivateControl(this);
}
void UIListCtrl::OnSizeChanged
@@ -179,7 +285,13 @@ void UIListCtrl::OnSizeChanged
)
{
// FIXME: stub
if (!m_vertscroll) {
return;
}
m_vertscroll->InitFrame(this, m_frame.size.width - 16.0, 0.0, 16.0, m_frame.size.height, -1);
m_vertscroll->setPageHeight((m_frame.size.height - getHeaderHeight()) / m_font->getHeight(m_bVirtual));
m_vertscroll->setNumItems(m_itemlist.NumObjects());
}
void UIListCtrl::DrawColumns
@@ -188,7 +300,57 @@ void UIListCtrl::DrawColumns
)
{
// FIXME: stub
int atleft;
int i;
int height;
UIFont* pFont;
UColor columnColor, textColor;
atleft = 0;
columnColor = UColor(0.07f, 0.06f, 0.005f, 1.0f);
textColor = UHudColor;
pFont = m_headerfont;
if (!pFont) pFont = m_font;
height = (s_columnpadding.height + s_columnpadding.height) * m_vVirtualScale[1] + pFont->getHeight(m_bVirtual);
pFont->setColor(textColor);
for (i = 1; i <= m_columnlist.NumObjects(); i++)
{
const columndef_t& column = m_columnlist.ObjectAt(i);
DrawBoxWithSolidBorder(
UIRect2D(atleft, 0, column.width + m_vVirtualScale[1], height),
columnColor,
textColor,
1,
3,
m_local_alpha
);
pFont->Print(
atleft / m_vVirtualScale[0] + s_columnpadding.width,
s_columnpadding.height,
Sys_LV_CL_ConvertString(column.title.c_str()),
-1,
m_bVirtual
);
atleft += column.width;
}
if (m_frame.size.width > atleft)
{
DrawBoxWithSolidBorder(
UIRect2D(atleft, 0, m_frame.size.width - atleft + 1.0, height),
columnColor,
textColor,
1,
3,
m_local_alpha
);
}
}
void UIListCtrl::DrawContent
@@ -197,7 +359,110 @@ void UIListCtrl::DrawContent
)
{
// FIXME: stub
int item;
int height, headerheight, iItemHeight;
UIFont* pFont;
int top;
UColor selColor, selText;
UColor backColor, textColor;
height = m_font->getHeight(m_bVirtual);
selColor = UColor(0.21f, 0.18f, 0.015f, 1.0f);
selText = UColor(0.9f, 0.8f, 0.6f, 1.0f);
backColor = m_background_color;
textColor = m_foreground_color;
if (m_headerfont) {
headerheight = m_headerfont->getHeight(m_bVirtual);
} else {
headerheight = 0;
}
selColor.a = m_local_alpha;
selText.a = m_local_alpha;
backColor.a = m_local_alpha;
textColor.a = m_local_alpha;
top = getHeaderHeight();
if (m_vertscroll) {
item = m_vertscroll->getTopItem() + 1;
} else {
item = 1;
}
for (; item <= m_itemlist.NumObjects(); item++)
{
UIListCtrlItem* theitem;
int col;
int atleft;
UColor* itemBg;
UColor* itemText;
theitem = m_itemlist.ObjectAt(item);
atleft = 0;
if (item == m_currentItem)
{
itemBg = &selColor;
itemText = &selText;
}
else
{
itemBg = &backColor;
itemText = &textColor;
}
if (theitem->IsHeaderEntry() && m_headerfont) {
pFont = m_headerfont;
iItemHeight = headerheight;
} else {
pFont = m_font;
iItemHeight = height;
}
pFont->setColor(*itemText);
for (col = 1; col <= m_columnlist.NumObjects(); col++)
{
columndef_t& column = m_columnlist.ObjectAt(col);
UIRect2D drawRect(atleft, top, column.width, iItemHeight);
griditemtype_t itemtype = theitem->getListItemType(column.name);
switch (itemtype)
{
case TYPE_STRING:
DrawBox(drawRect, *itemBg, m_local_alpha);
pFont->Print(
drawRect.pos.x / m_vVirtualScale[0] + 1.0,
drawRect.pos.y / m_vVirtualScale[1],
Sys_LV_CL_ConvertString(theitem->getListItemString(column.name)),
-1,
m_bVirtual
);
break;
case TYPE_OWNERDRAW:
theitem->DrawListItem(column.name, drawRect, item == m_currentItem, pFont);
break;
}
atleft += column.width;
}
if (m_frame.size.width > atleft)
{
DrawBox(
atleft,
top,
m_frame.size.width - atleft,
height,
*itemBg,
m_local_alpha
);
}
top += iItemHeight;
if (iItemHeight + top > m_frame.size.height) {
break;
}
}
}
void UIListCtrl::FrameInitialized
@@ -206,7 +471,8 @@ void UIListCtrl::FrameInitialized
)
{
// FIXME: stub
UIListBase::FrameInitialized();
OnSizeChanged(NULL);
}
void UIListCtrl::SetDrawHeader
@@ -215,7 +481,7 @@ void UIListCtrl::SetDrawHeader
)
{
// FIXME: stub
m_bDrawHeader = bDrawHeader;
}
void UIListCtrl::AddItem
@@ -224,7 +490,10 @@ void UIListCtrl::AddItem
)
{
// FIXME: stub
m_itemlist.AddObject(item);
if (m_vertscroll) {
m_vertscroll->setNumItems(m_itemlist.NumObjects());
}
}
void UIListCtrl::InsertItem
@@ -233,7 +502,26 @@ void UIListCtrl::InsertItem
)
{
// FIXME: stub
if (where > 0 && where <= m_itemlist.NumObjects())
{
int i;
m_itemlist.AddObject(NULL);
for (i = m_itemlist.NumObjects(); i > where; i++) {
m_itemlist.SetObjectAt(i, m_itemlist.ObjectAt(i - 1));
}
m_itemlist.SetObjectAt(where, item);
}
else
{
m_itemlist.AddObject(item);
}
if (m_vertscroll) {
m_vertscroll->setNumItems(m_itemlist.NumObjects());
}
}
int UIListCtrl::FindItem
@@ -242,8 +530,7 @@ int UIListCtrl::FindItem
)
{
// FIXME: stub
return 0;
return m_itemlist.IndexOfObject(item);
}
UIListCtrlItem *UIListCtrl::GetItem
@@ -252,8 +539,7 @@ UIListCtrlItem *UIListCtrl::GetItem
)
{
// FIXME: stub
return NULL;
return m_itemlist.ObjectAt(item);
}
void UIListCtrl::AddColumn
@@ -266,7 +552,15 @@ void UIListCtrl::AddColumn
)
{
// FIXME: stub
columndef_t column;
column.title = title;
column.name = name;
column.width = width;
column.numeric = numeric;
column.reverse_sort = reverse_sort;
m_columnlist.AddObject(column);
}
void UIListCtrl::RemoveAllColumns
@@ -275,7 +569,7 @@ void UIListCtrl::RemoveAllColumns
)
{
// FIXME: stub
m_columnlist.ClearObjectList();
}
int UIListCtrl::getNumItems
@@ -284,8 +578,7 @@ int UIListCtrl::getNumItems
)
{
// FIXME: stub
return 0;
return m_itemlist.NumObjects();
}
void UIListCtrl::DeleteAllItems
@@ -294,7 +587,14 @@ void UIListCtrl::DeleteAllItems
)
{
// FIXME: stub
m_itemlist.ClearObjectList();
m_currentItem = 0;
if (m_vertscroll)
{
m_vertscroll->setNumItems(0);
m_vertscroll->setTopItem(0);
}
}
void UIListCtrl::DeleteItem
@@ -303,7 +603,15 @@ void UIListCtrl::DeleteItem
)
{
// FIXME: stub
m_itemlist.RemoveObjectAt(which);
if (m_vertscroll) {
m_vertscroll->setNumItems(m_itemlist.NumObjects());
}
if (m_currentItem > getNumItems()) {
TrySelectItem(getNumItems());
}
}
void UIListCtrl::SortByColumn
@@ -312,7 +620,81 @@ void UIListCtrl::SortByColumn
)
{
// FIXME: stub
int i;
bool exists;
bool numeric;
bool reverse;
UIListCtrlItem* selected;
bool selvisible;
exists = 0;
numeric = 0;
reverse = 0;
selected = NULL;
selvisible = 0;
for (i = 1; i <= m_columnlist.NumObjects(); i++) {
columndef_t& def = m_columnlist.ObjectAt(i);
if (def.name == i) {
numeric = def.numeric;
reverse = def.reverse_sort;
exists = true;
break;
}
}
if (exists)
{
m_iLastSortColumn = column;
s_qsortcolumn = column;
s_qsortobject = this;
s_qsortreverse = reverse;
if (m_currentItem)
{
selected = m_itemlist.ObjectAt(m_currentItem);
if (m_vertscroll)
{
selvisible = false;
if (m_currentItem >= m_vertscroll->getTopItem() + 1) {
selvisible = m_currentItem <= m_vertscroll->getPageHeight() + m_vertscroll->getTopItem();
}
}
else
{
selvisible = false;
// FIXME: selvisible when there is no vertical scroll?
//
//if (m_currentItem > 0) {
// selvisible = m_currentItem <= m_vertscroll->m_pageheight + m_vertscroll->getTopItem();
//}
}
}
if (numeric) {
m_comparefunction = &UIListCtrl::StringNumberCompareFunction;
} else {
m_comparefunction = &UIListCtrl::StringCompareFunction;
}
if (m_itemlist.NumObjects()) {
m_itemlist.Sort(&UIListCtrl::QsortCompare);
}
if (selected)
{
if (selvisible) {
TrySelectItem(FindItem(selected));
} else {
m_currentItem = FindItem(selected);
}
}
}
else
{
m_iLastSortColumn = 0;
}
}
void UIListCtrl::SortByLastSortColumn
@@ -321,7 +703,7 @@ void UIListCtrl::SortByLastSortColumn
)
{
// FIXME: stub
SortByColumn(m_iLastSortColumn);
}
void UIListCtrl::setCompareFunction
@@ -330,7 +712,7 @@ void UIListCtrl::setCompareFunction
)
{
// FIXME: stub
m_comparefunction = func;
}
void UIListCtrl::setHeaderFont
@@ -339,5 +721,13 @@ void UIListCtrl::setHeaderFont
)
{
// FIXME: stub
if (m_headerfont) {
delete m_headerfont;
}
if (name) {
m_headerfont = new UIFont(name);
} else {
m_headerfont = NULL;
}
}
+7 -6
View File
@@ -27,11 +27,11 @@ typedef enum { TYPE_STRING, TYPE_OWNERDRAW } griditemtype_t;
class UIListCtrlItem {
public:
virtual griditemtype_t getListItemType( int which ) const;
virtual str getListItemString( int which ) const;
virtual int getListItemValue( int which ) const;
virtual void DrawListItem( int iColumn, const UIRect2D &drawRect, bool bSelected, UIFont *pFont );
virtual qboolean IsHeaderEntry( void ) const;
virtual griditemtype_t getListItemType( int which ) const = 0;
virtual str getListItemString( int which ) const = 0;
virtual int getListItemValue( int which ) const = 0;
virtual void DrawListItem( int iColumn, const UIRect2D &drawRect, bool bSelected, UIFont *pFont ) = 0;
virtual qboolean IsHeaderEntry( void ) const = 0;
};
typedef struct m_clickState_s {
@@ -54,6 +54,7 @@ protected:
static bool s_qsortreverse;
static int s_qsortcolumn;
static class UIListCtrl *s_qsortobject;
int m_iLastSortColumn;
class UIFont *m_headerfont;
Container<UIListCtrlItem *> m_itemlist;
@@ -66,7 +67,7 @@ protected:
} m_sizestate;
m_clickState_s m_clickState;
int( *m_comparefunction ) (/* unknown */ );
int (*m_comparefunction) (const UIListCtrlItem* i1, const UIListCtrlItem* i2, int columnname);
public:
CLASS_PROTOTYPE( UIListCtrl );
+8 -1
View File
@@ -600,7 +600,14 @@ void MenuManager::RealignMenus
)
{
// FIXME: stub
int i;
int num;
num = m_menulist.NumObjects();
for (i = 1; i <= num; i++)
{
m_menulist.ObjectAt(i)->RealignWidgets();
}
}
void MenuManager::AddMenu
+1 -1
View File
@@ -1601,7 +1601,7 @@ void UIWidget::TextAlignment
)
{
for( int i = 1; i < ev->NumArgs(); i++ )
for( int i = 1; i <= ev->NumArgs(); i++ )
{
str align = ev->GetString( 1 );
+13 -1
View File
@@ -1201,7 +1201,19 @@ Sys_PumpMessageLoop
*/
void Sys_PumpMessageLoop(void)
{
// FIXME: stub
MSG msg;
while (PeekMessageA(&msg, 0, 0, 0, 0))
{
if (!GetMessageA(&msg, 0, 0, 0)) {
Com_Quit_f();
}
g_wv.sysMsgTime = msg.time;
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
}
/*
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 996 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 881 KiB