summaryrefslogtreecommitdiff
path: root/source/mvd_parse.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/mvd_parse.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/mvd_parse.c')
-rw-r--r--source/mvd_parse.c79
1 files changed, 33 insertions, 46 deletions
diff --git a/source/mvd_parse.c b/source/mvd_parse.c
index e357964..adfd78f 100644
--- a/source/mvd_parse.c
+++ b/source/mvd_parse.c
@@ -68,9 +68,9 @@ const char *MVD_ServerCommandString( int cmd ) {
static void MVD_LinkEdict( mvd_t *mvd, edict_t *ent ) {
int index;
- cmodel_t *cm;
+ mmodel_t *cm;
int x, zd, zu;
- cmcache_t *cache = mvd->cm.cache;
+ bsp_t *cache = mvd->cm.cache;
if( !cache ) {
return;
@@ -78,12 +78,12 @@ static void MVD_LinkEdict( mvd_t *mvd, edict_t *ent ) {
if( ent->s.solid == 31 ) {
index = ent->s.modelindex;
- if( index < 1 || index > cache->numcmodels ) {
+ if( index < 1 || index > cache->nummodels ) {
Com_WPrintf( "%s: entity %d: bad inline model index: %d\n",
__func__, ent->s.number, index );
return;
}
- cm = &cache->cmodels[ index - 1 ];
+ cm = &cache->models[ index - 1 ];
VectorCopy( cm->mins, ent->mins );
VectorCopy( cm->maxs, ent->maxs );
ent->solid = SOLID_BSP;
@@ -205,10 +205,8 @@ void MVD_ParseEntityString( mvd_t *mvd ) {
static void MVD_ParseMulticast( mvd_t *mvd, mvd_ops_t op, int extrabits ) {
udpClient_t *client;
client_t *cl;
- byte *mask;
- cleaf_t *leaf;
- int cluster;
- int area1, area2;
+ byte mask[MAX_MAP_VIS];
+ mleaf_t *leaf1, *leaf2;
vec3_t org;
qboolean reliable = qfalse;
player_state_t *ps;
@@ -220,33 +218,27 @@ static void MVD_ParseMulticast( mvd_t *mvd, mvd_ops_t op, int extrabits ) {
switch( op ) {
case mvd_multicast_all_r:
- reliable = qtrue; // intentional fallthrough
+ reliable = qtrue;
+ // intentional fallthrough
case mvd_multicast_all:
- area1 = 0;
- cluster = 0;
- mask = NULL;
+ leaf1 = NULL;
break;
-
case mvd_multicast_phs_r:
- reliable = qtrue; // intentional fallthrough
+ reliable = qtrue;
+ // intentional fallthrough
case mvd_multicast_phs:
leafnum = MSG_ReadShort();
- leaf = CM_LeafNum( &mvd->cm, leafnum );
- area1 = CM_LeafArea( leaf );
- cluster = CM_LeafCluster( leaf );
- mask = CM_ClusterPHS( &mvd->cm, cluster );
+ leaf1 = CM_LeafNum( &mvd->cm, leafnum );
+ BSP_ClusterVis( mvd->cm.cache, mask, leaf1->cluster, DVIS_PHS );
break;
-
case mvd_multicast_pvs_r:
- reliable = qtrue; // intentional fallthrough
+ reliable = qtrue;
+ // intentional fallthrough
case mvd_multicast_pvs:
leafnum = MSG_ReadShort();
- leaf = CM_LeafNum( &mvd->cm, leafnum );
- area1 = CM_LeafArea( leaf );
- cluster = CM_LeafCluster( leaf );
- mask = CM_ClusterPVS( &mvd->cm, cluster );
+ leaf1 = CM_LeafNum( &mvd->cm, leafnum );
+ BSP_ClusterVis( mvd->cm.cache, mask, leaf1->cluster, DVIS_PVS );
break;
-
default:
MVD_Destroyf( mvd, "bad op" );
}
@@ -270,16 +262,14 @@ static void MVD_ParseMulticast( mvd_t *mvd, mvd_ops_t op, int extrabits ) {
continue;
}
- if( mask ) {
+ if( leaf1 ) {
// find the client's PVS
ps = &client->ps;
VectorMA( ps->viewoffset, 0.125f, ps->pmove.origin, org );
- leaf = CM_PointLeaf( &mvd->cm, org );
- area2 = CM_LeafArea( leaf );
- if( !CM_AreasConnected( &mvd->cm, area1, area2 ) )
+ leaf2 = CM_PointLeaf( &mvd->cm, org );
+ if( !CM_AreasConnected( &mvd->cm, leaf1->area, leaf2->area ) )
continue;
- cluster = CM_LeafCluster( leaf );
- if( !Q_IsBitSet( mask, cluster ) ) {
+ if( !Q_IsBitSet( mask, leaf2->cluster ) ) {
continue;
}
}
@@ -511,9 +501,9 @@ static void MVD_ParseSound( mvd_t *mvd, int extrabits ) {
vec3_t origin;
udpClient_t *client;
client_t *cl;
- byte *mask;
- cleaf_t *leaf;
- int area, cluster;
+ byte mask[MAX_MAP_VIS];
+ mleaf_t *leaf;
+ int area;
player_state_t *ps;
sound_packet_t *msg;
edict_t *entity;
@@ -560,8 +550,7 @@ static void MVD_ParseSound( mvd_t *mvd, int extrabits ) {
continue; // blocked by a door
}
}
- cluster = CM_LeafCluster( leaf );
- mask = CM_ClusterPHS( &mvd->cm, cluster );
+ BSP_ClusterVis( mvd->cm.cache, mask, leaf->cluster, DVIS_PHS );
if( !SV_EdictPV( &mvd->cm, entity, mask ) ) {
continue; // not in PHS
}
@@ -777,6 +766,11 @@ static void MVD_ParsePacketEntities( mvd_t *mvd ) {
MSG_ParseDeltaEntity( &ent->s, &ent->s, number, bits );
+ // lazily relink even if removed
+ if( number > mvd->maxclients && ( bits & RELINK_MASK ) ) {
+ MVD_LinkEdict( mvd, ent );
+ }
+
if( bits & U_REMOVE ) {
if( mvd_shownet->integer > 2 ) {
Com_Printf( " remove: %d\n", number );
@@ -789,10 +783,6 @@ static void MVD_ParsePacketEntities( mvd_t *mvd ) {
if( number >= mvd->pool.num_edicts ) {
mvd->pool.num_edicts = number + 1;
}
-
- if( number > mvd->maxclients && ( bits & RELINK_MASK ) ) {
- MVD_LinkEdict( mvd, ent );
- }
}
}
@@ -894,8 +884,6 @@ static void MVD_ParseServerData( mvd_t *mvd ) {
int protocol;
size_t length;
char *gamedir, *string, *p;
- const char *error;
- uint32_t checksum;
int i, index;
mvd_player_t *player;
@@ -984,13 +972,12 @@ static void MVD_ParseServerData( mvd_t *mvd ) {
// load the world model (we are only interesed in
// visibility info, do not load brushes and such)
Com_Printf( "[%s] Loading %s...\n", mvd->name, string );
- error = CM_LoadMapEx( &mvd->cm, string, CM_LOAD_VISONLY, &checksum );
- if( error ) {
- MVD_Destroyf( mvd, "Couldn't load %s: %s", string, error );
+ if( !CM_LoadMap( &mvd->cm, string ) ) {
+ MVD_Destroyf( mvd, "Couldn't load %s: %s", string, BSP_GetError() );
}
#if USE_MAPCHECKSUM
- if( checksum != atoi( mvd->configstrings[CS_MAPCHECKSUM] ) ) {
+ if( mvd->cm.cache->checksum != atoi( mvd->configstrings[CS_MAPCHECKSUM] ) ) {
MVD_Destroyf( mvd, "Local map version differs from server" );
}
#endif