diff options
author | Andrey Nazarov <skuller@skuller.net> | 2008-08-16 10:19:42 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2008-08-16 10:19:42 +0000 |
commit | 1526e22e4ff29153e9c127081e8ea8d9e2f33b8c (patch) | |
tree | b361766433d4a7b4a111865afd52803e2bbf7754 /source/cl_main.c | |
parent | e826e5f176f21cd18b3bbc22887a266835ada57c (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.c | 117 |
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(); |