From 030f0815912d90b261e9c30cbf4680acc6a3c31b Mon Sep 17 00:00:00 2001 From: g-cont Date: Wed, 1 Nov 2017 00:00:00 +0300 Subject: [PATCH] 01 Nov 2017 --- engine/common/mod_local.h | 1 + engine/common/model.c | 61 +++++++++++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/engine/common/mod_local.h b/engine/common/mod_local.h index f3a5dd4d..a818df1e 100644 --- a/engine/common/mod_local.h +++ b/engine/common/mod_local.h @@ -99,6 +99,7 @@ typedef struct dclipnode2_t *clipnodes; // temporary 32-bit array to hold clipnodes int numclipnodes; // may be exceeds 32768 + int numnodes; // worldcount of nodes // visibility info byte *visdata; // uncompressed visdata diff --git a/engine/common/model.c b/engine/common/model.c index 29023450..a92b3676 100644 --- a/engine/common/model.c +++ b/engine/common/model.c @@ -123,7 +123,7 @@ void Mod_PrintBSPFileSizes_f( void ) totalmemory += Mod_ArrayUsage( "models", w->numsubmodels, MAX_MAP_MODELS, sizeof( dmodel_t )); totalmemory += Mod_ArrayUsage( "planes", w->numplanes, MAX_MAP_PLANES, sizeof( dplane_t )); totalmemory += Mod_ArrayUsage( "vertexes", w->numvertexes, MAX_MAP_VERTS, sizeof( dvertex_t )); - totalmemory += Mod_ArrayUsage( "nodes", w->numnodes, MAX_MAP_NODES, sizeof( dnode_t )); + totalmemory += Mod_ArrayUsage( "nodes", world.numnodes, MAX_MAP_NODES, sizeof( dnode_t )); totalmemory += Mod_ArrayUsage( "texinfos", w->numtexinfo, MAX_MAP_TEXINFO, sizeof( dtexinfo_t )); totalmemory += Mod_ArrayUsage( "faces", w->numsurfaces, MAX_MAP_FACES, sizeof( dface_t )); totalmemory += Mod_ArrayUsage( "clipnodes", w->numclipnodes, MAX_TOTAL_CLIPNODES, clipnode_size ); @@ -1647,7 +1647,9 @@ static void Mod_SetParent( mnode_t *node, mnode_t *parent ) { node->parent = parent; - if( node->contents < 0 ) return; // it's node + if( node->contents < 0 ) return; // it's leaf + if( world.loading ) world.numnodes++; + Mod_SetParent( node->children[0], node ); Mod_SetParent( node->children[1], node ); } @@ -1728,6 +1730,9 @@ static void Mod_LoadNodes( const dlump_t *l ) } } + if( world.loading ) + world.numnodes = 0; + // sets nodes and leafs Mod_SetParent( loadmodel->nodes, NULL ); } @@ -2000,6 +2005,22 @@ static void Mod_LoadEntities( const dlump_t *l ) } } +/* +================== +CountClipNodes_r +================== +*/ +static void CountClipNodes_r( dclipnode2_t *src, hull_t *hull, int nodenum ) +{ + // leaf? + if( nodenum < 0 ) return; + + hull->lastclipnode++; + + CountClipNodes_r( src, hull, src[nodenum].children[0] ); + CountClipNodes_r( src, hull, src[nodenum].children[1] ); +} + /* ================== RemapClipNodes_r @@ -2043,18 +2064,13 @@ Mod_SetupHull static void Mod_SetupHull( model_t *mod, byte *mempool, int headnode, int hullnum ) { hull_t *hull = &mod->hulls[hullnum]; + int count; - hull->clipnodes = (mclipnode_t *)Mem_Alloc( mempool, sizeof( mclipnode_t ) * MAX_MAP_CLIPNODES ); + // assume no hull hull->firstclipnode = hull->lastclipnode = 0; - hull->planes = mod->planes; // share planes - // remap clipnodes to 16-bit indexes - RemapClipNodes_r( world.clipnodes, hull, headnode ); - - // fit array to real count - Msg( "resize clipnodes for hull%d from %d to %d\n", hullnum, MAX_MAP_CLIPNODES, hull->lastclipnode ); - hull->clipnodes = (mclipnode_t *)Mem_Realloc( mempool, hull->clipnodes, sizeof( mclipnode_t ) * hull->lastclipnode ); - if( !hull->lastclipnode ) hull->planes = NULL; // hull is missed + if(( headnode == -1 ) || ( hullnum != 1 && headnode == 0 )) + return; // hull missed switch( hullnum ) { @@ -2074,6 +2090,22 @@ static void Mod_SetupHull( model_t *mod, byte *mempool, int headnode, int hullnu Host_Error( "Mod_SetupHull: bad hull number %i\n", hullnum ); break; } + + if( VectorIsNull( hull->clip_mins ) && VectorIsNull( hull->clip_maxs )) + return; // no hull specified + + CountClipNodes_r( world.clipnodes, hull, headnode ); + count = hull->lastclipnode; + + hull->clipnodes = (mclipnode_t *)Mem_Alloc( mempool, sizeof( mclipnode_t ) * hull->lastclipnode ); + hull->planes = mod->planes; // share planes + hull->lastclipnode = 0; // restart counting + + // remap clipnodes to 16-bit indexes + RemapClipNodes_r( world.clipnodes, hull, headnode ); + + // fit array to real count +// Msg( "%s hull%d, %i clipnodes (headnode %i)\n", mod->name, hullnum, hull->lastclipnode, headnode ); } /* @@ -2089,8 +2121,13 @@ static void Mod_LoadClipnodes( const dlump_t *l ) qboolean extended = false; int i, count; - if( bmodel_version == QBSP2_VERSION || ( l->filelen % sizeof( *in16 )) || ( l->filelen / sizeof( *in16 )) >= MAX_MAP_CLIPNODES ) + if( bmodel_version == QBSP2_VERSION ) extended = true; + else if( bmodel_version != Q1BSP_VERSION ) + { + if(( l->filelen % sizeof( *in16 )) || ( l->filelen / sizeof( *in16 )) >= MAX_MAP_CLIPNODES ) + extended = true; + } if( extended ) {