summaryrefslogtreecommitdiff
path: root/source/cl_main.c
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2008-08-16 10:19:42 +0000
committerAndrey Nazarov <skuller@skuller.net>2008-08-16 10:19:42 +0000
commit1526e22e4ff29153e9c127081e8ea8d9e2f33b8c (patch)
treeb361766433d4a7b4a111865afd52803e2bbf7754 /source/cl_main.c
parente826e5f176f21cd18b3bbc22887a266835ada57c (diff)
Split some monolithic include files into smaller ones.
Use single BSP models cache for refresh and collision subsystems. Refresh libraries may not longer be dynamically loaded. Made gi.TagMalloc use separate tag namespace to avoid conflicts with engine reserverd tags. Fixed listing order of MVD channels in chooser menu. A lot of misc changes... MSVC build is definitely broken now.
Diffstat (limited to 'source/cl_main.c')
-rw-r--r--source/cl_main.c117
1 files changed, 86 insertions, 31 deletions
diff --git a/source/cl_main.c b/source/cl_main.c
index 2a6b22a..39864e8 100644
--- a/source/cl_main.c
+++ b/source/cl_main.c
@@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// cl_main.c -- client main loop
#include "cl_local.h"
+#include "d_md2.h"
cvar_t *adr0;
cvar_t *adr1;
@@ -343,7 +344,9 @@ static void CL_CheckForResend( void ) {
cls.passive = qfalse;
Con_Close();
+#if USE_UI
UI_OpenMenu( UIMENU_NONE );
+#endif
}
// resend if we haven't gotten a reply yet
@@ -481,7 +484,9 @@ usage:
Cvar_Set( "timedemo", "0" );
Con_Close();
+#if USE_UI
UI_OpenMenu( UIMENU_NONE );
+#endif
}
static void CL_PassiveConnect_f( void ) {
@@ -583,7 +588,7 @@ void CL_ClearState( void ) {
LOC_FreeLocations();
// wipe the entire cl structure
- CM_FreeMap( &cl.cm );
+ BSP_Free( cl.bsp );
memset( &cl, 0, sizeof( cl ) );
memset( &cl_entities, 0, sizeof( cl_entities ) );
@@ -606,9 +611,6 @@ void CL_Disconnect( comErrorType_t type, const char *text ) {
EXEC_TRIGGER( cl_disconnectcmd );
}
- if( cls.ref_initialized )
- ref.CinematicSetPalette( NULL );
-
cls.connect_time = 0;
cls.connect_count = 0;
cls.passive = qfalse;
@@ -660,7 +662,9 @@ void CL_Disconnect( comErrorType_t type, const char *text ) {
cls.messageString[ 0 ] = 0;
cls.userinfo_modified = 0;
+#if USE_UI
UI_ErrorMenu( type, text );
+#endif
}
/*
@@ -872,11 +876,13 @@ static void CL_ParsePrintMessage( void ) {
break;
case REQ_INFO:
break;
+#if USE_UI
case REQ_PING:
if( CL_ServerStatusResponse( string, &net_from, &serverStatus ) ) {
UI_AddToServerList( &serverStatus );
}
break;
+#endif
case REQ_RCON:
Com_Printf( "%s", string );
CL_AddRequest( &net_from, REQ_RCON );
@@ -1411,7 +1417,7 @@ static void CL_ConnectionlessPacket( void ) {
CL_PacketEvent
=================
*/
-void CL_PacketEvent( neterr_t ret ) {
+static void CL_PacketEvent( neterr_t ret ) {
//
// remote command packet
//
@@ -1573,7 +1579,7 @@ static void CL_RegisterModels( void ) {
break;
}
if( name[0] == '*' )
- cl.model_clip[i] = CM_InlineModel( &cl.cm, name );
+ cl.model_clip[i] = BSP_InlineModel( cl.bsp, name );
else
cl.model_clip[i] = NULL;
}
@@ -1603,9 +1609,8 @@ static void *precache_model; // used for skin checking in alias models
static const char env_suf[6][3] = { "rt", "bk", "lf", "ft", "up", "dn" };
void CL_RequestNextDownload ( void ) {
- unsigned map_checksum; // for detecting cheater maps
char fn[ MAX_QPATH ];
- dmdl_t *pheader;
+ dmd2header_t *pheader;
size_t length;
if ( cls.state != ca_connected && cls.state != ca_loading )
@@ -1648,10 +1653,10 @@ void CL_RequestNextDownload ( void ) {
precache_check++;
continue; // couldn't load it
}
- pheader = ( dmdl_t * ) precache_model;
+ pheader = ( dmd2header_t * ) precache_model;
if( length < sizeof( *pheader ) ||
- LittleLong( pheader->ident ) != IDALIASHEADER ||
- LittleLong( pheader->version ) != ALIAS_VERSION )
+ LittleLong( pheader->ident ) != MD2_IDENT ||
+ LittleLong( pheader->version ) != MD2_VERSION )
{
// not an alias model
FS_FreeFile( precache_model );
@@ -1662,8 +1667,8 @@ void CL_RequestNextDownload ( void ) {
}
num_skins = LittleLong( pheader->num_skins );
ofs_skins = LittleLong( pheader->ofs_skins );
- end_skins = ofs_skins + num_skins * MAX_SKINNAME;
- if( num_skins > MAX_MD2SKINS || end_skins < ofs_skins || end_skins > length ) {
+ end_skins = ofs_skins + num_skins * MD2_MAX_SKINNAME;
+ if( num_skins > MD2_MAX_SKINS || end_skins < ofs_skins || end_skins > length ) {
// bad alias model
FS_FreeFile( precache_model );
precache_model = NULL;
@@ -1673,13 +1678,13 @@ void CL_RequestNextDownload ( void ) {
}
}
- pheader = ( dmdl_t * ) precache_model;
+ pheader = ( dmd2header_t * ) precache_model;
num_skins = LittleLong( pheader->num_skins );
ofs_skins = LittleLong( pheader->ofs_skins );
while ( precache_model_skin - 1 < num_skins ) {
Q_strncpyz( fn, ( char * )precache_model + ofs_skins +
- ( precache_model_skin - 1 ) * MAX_SKINNAME, sizeof( fn ) );
+ ( precache_model_skin - 1 ) * MD2_MAX_SKINNAME, sizeof( fn ) );
if ( !CL_CheckOrDownloadFile( fn ) ) {
precache_model_skin++;
return; // started a download
@@ -1808,12 +1813,15 @@ void CL_RequestNextDownload ( void ) {
if ( precache_check == ENV_CNT ) {
precache_check = ENV_CNT + 1;
- CM_LoadMap ( &cl.cm, cl.configstrings[ CS_MODELS + 1 ], CM_LOAD_CLIENT, &map_checksum );
+ if( ( cl.bsp = BSP_Load( cl.configstrings[ CS_MODELS + 1 ] ) ) == NULL ) {
+ Com_Error( ERR_DROP, "Couldn't load %s: %s",
+ cl.configstrings[ CS_MODELS + 1 ], BSP_GetError() );
+ }
#if USE_MAPCHECKSUM
- if ( map_checksum != atoi( cl.configstrings[ CS_MAPCHECKSUM ] ) ) {
+ if ( cl.bsp->checksum != atoi( cl.configstrings[ CS_MAPCHECKSUM ] ) ) {
Com_Error ( ERR_DROP, "Local map version differs from server: %i != '%s'\n",
- map_checksum, cl.configstrings[ CS_MAPCHECKSUM ] );
+ cl.bsp->checksum, cl.configstrings[ CS_MAPCHECKSUM ] );
return;
}
#endif
@@ -1846,8 +1854,8 @@ void CL_RequestNextDownload ( void ) {
// confirm existance of textures, download any that don't exist
if ( precache_check == TEXTURE_CNT + 1 ) {
if ( allow_download->integer && allow_download_maps->integer ) {
- while ( precache_tex < cl.cm.cache->numtexinfo ) {
- char *texname = cl.cm.cache->surfaces[ precache_tex++ ].rname;
+ while ( precache_tex < cl.bsp->numtexinfo ) {
+ char *texname = cl.bsp->texinfo[ precache_tex++ ].name;
// Also check if 32bit images are present
Q_concat( fn, sizeof( fn ), "textures/", texname, ".jpg", NULL );
@@ -1908,8 +1916,10 @@ static void CL_Precache_f( void ) {
//Yet another hack to let old demos work
//the old precache sequence
if( cls.demo.playback ) {
- CM_LoadMap( &cl.cm, cl.configstrings[ CS_MODELS + 1 ],
- CM_LOAD_CLIENT, NULL );
+ if( ( cl.bsp = BSP_Load( cl.configstrings[ CS_MODELS + 1 ] ) ) == NULL ) {
+ Com_Error( ERR_DROP, "Couldn't load %s: %s",
+ cl.configstrings[ CS_MODELS + 1 ], BSP_GetError() );
+ }
CL_RegisterModels();
CL_PrepRefresh();
CL_LoadState( LOAD_SOUNDS );
@@ -2194,39 +2204,46 @@ Flush caches and restart the VFS.
void CL_RestartFilesystem( void ) {
int cls_state;
- if ( !cl_running->integer ) {
+ if( !cl_running->integer ) {
FS_Restart();
return;
}
// temporary switch to loading state
cls_state = cls.state;
- if ( cls.state >= ca_precached ) {
+ if( cls.state >= ca_precached ) {
cls.state = ca_loading;
}
+#if USE_UI
UI_Shutdown();
+#endif
S_StopAllSounds();
S_FreeAllSounds();
if( cls.ref_initialized ) {
- ref.Shutdown( qfalse );
+ R_Shutdown( qfalse );
FS_Restart();
- ref.Init( qfalse );
+ R_Init( qfalse );
SCR_RegisterMedia();
Con_RegisterMedia();
+#if USE_UI
UI_Init();
+#endif
} else {
FS_Restart();
}
- if ( cls_state == ca_disconnected ) {
+#if USE_UI
+ if( cls_state == ca_disconnected ) {
UI_OpenMenu( UIMENU_MAIN );
- } else if ( cls_state >= ca_loading ) {
+ } else
+#endif
+ if( cls_state >= ca_loading ) {
CL_LoadState( LOAD_MAP );
CL_RegisterModels();
CL_PrepRefresh();
@@ -2237,7 +2254,6 @@ void CL_RestartFilesystem( void ) {
// switch back to original state
cls.state = cls_state;
-
}
/*
@@ -2265,9 +2281,12 @@ static void CL_RestartRefresh_f( void ) {
CL_InitRefresh();
IN_Init();
- if ( cls_state == ca_disconnected ) {
+#if USE_UI
+ if( cls_state == ca_disconnected ) {
UI_OpenMenu( UIMENU_MAIN );
- } else if ( cls_state >= ca_loading ) {
+ } else
+#endif
+ if( cls_state >= ca_loading ) {
CL_LoadState( LOAD_MAP );
CL_PrepRefresh();
CL_LoadState( LOAD_FINISH );
@@ -2803,6 +2822,40 @@ void CL_Frame( int msec ) {
main_extra = 0;
}
+/*
+============
+CL_ProcessEvents
+============
+*/
+void CL_ProcessEvents( void ) {
+ neterr_t ret;
+
+ if( !cl_running->integer ) {
+ return;
+ }
+
+ CL_RunRefresh();
+
+ IN_Frame();
+
+ memset( &net_from, 0, sizeof( net_from ) );
+ net_from.type = NA_LOOPBACK;
+
+ // process loopback packets
+ while( NET_GetLoopPacket( NS_CLIENT ) ) {
+ CL_PacketEvent( NET_OK );
+ }
+
+ do {
+ ret = NET_GetPacket( NS_CLIENT );
+ if( ret == NET_AGAIN ) {
+ break;
+ }
+ CL_PacketEvent( ret );
+ } while( ret == NET_OK );
+
+}
+
//============================================================================
/*
@@ -2841,7 +2894,9 @@ void CL_Init( void ) {
}
#endif
+#if USE_UI
UI_OpenMenu( UIMENU_MAIN );
+#endif
Con_PostInit();
Con_RunConsole();