1
0
Fork 0
forked from fte/fteqw

dedicated server fixes for hunk-less stuff.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4423 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2013-07-14 23:06:14 +00:00
parent c1fde0e079
commit 09eb26c396
2 changed files with 56 additions and 46 deletions

View file

@ -2416,7 +2416,7 @@ static void *Alias_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremap
#ifndef SERVERONLY #ifndef SERVERONLY
pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, sizeof(galiaspose_t) + (sizeof(vecV_t)+sizeof(vec3_t)*3)*galias->numverts); pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, sizeof(galiaspose_t) + (sizeof(vecV_t)+sizeof(vec3_t)*3)*galias->numverts);
#else #else
pose = (galiaspose_t *)Hunk_Alloc(sizeof(galiaspose_t) + (sizeof(vecV_t))*galias->numverts); pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, sizeof(galiaspose_t) + (sizeof(vecV_t))*galias->numverts);
#endif #endif
frame->poseofs = pose; frame->poseofs = pose;
frame->numposes = 1; frame->numposes = 1;
@ -2451,7 +2451,7 @@ static void *Alias_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremap
frame->numposes = LittleLong(ingroup->numframes); frame->numposes = LittleLong(ingroup->numframes);
#ifdef SERVERONLY #ifdef SERVERONLY
pose = (galiaspose_t *)Hunk_Alloc(frame->numposes*(sizeof(galiaspose_t) + sizeof(vecV_t)*galias->numverts)); pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, frame->numposes*(sizeof(galiaspose_t) + sizeof(vecV_t)*galias->numverts));
verts = (vecV_t *)(pose+frame->numposes); verts = (vecV_t *)(pose+frame->numposes);
#else #else
pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, frame->numposes*(sizeof(galiaspose_t) + (sizeof(vecV_t)+sizeof(vec3_t)*3)*galias->numverts)); pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, frame->numposes*(sizeof(galiaspose_t) + (sizeof(vecV_t)+sizeof(vec3_t)*3)*galias->numverts));
@ -2924,8 +2924,8 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer)
galias->numverts = pq1inmodel->numverts; galias->numverts = pq1inmodel->numverts;
galias->numindexes = pq1inmodel->numtris*3; galias->numindexes = pq1inmodel->numtris*3;
indexes = ZG_Malloc(&memgroup, galias->numindexes*sizeof(*indexes)); indexes = ZG_Malloc(&loadmodel->memgroup, galias->numindexes*sizeof(*indexes));
galias->ofs_indexes = (char *)indexes - (char *)galias; galias->ofs_indexes = indexes;
for (i = 0; i < pq1inmodel->numverts; i++) for (i = 0; i < pq1inmodel->numverts; i++)
seamremap[i] = i; seamremap[i] = i;
for (i = 0; i < pq1inmodel->numtris; i++) for (i = 0; i < pq1inmodel->numtris; i++)
@ -5848,9 +5848,9 @@ galiasinfo_t *Mod_ParseIQMMeshModel(model_t *mod, char *buffer)
/*allocate a nice big block of memory and figure out where stuff is*/ /*allocate a nice big block of memory and figure out where stuff is*/
gai = ZG_Malloc(&loadmodel->memgroup, sizeof(*gai)*h->num_meshes + gai = ZG_Malloc(&loadmodel->memgroup, sizeof(*gai)*h->num_meshes +
//#ifndef SERVERONLY #ifndef SERVERONLY
sizeof(*skin)*h->num_meshes + sizeof(*shaders)*h->num_meshes + sizeof(*skin)*h->num_meshes + sizeof(*shaders)*h->num_meshes +
//#endif #endif
sizeof(*fgroup)*numgroups + sizeof(float)*12*(h->num_joints + (h->num_poses*h->num_frames)) + sizeof(*bones)*h->num_joints + sizeof(*fgroup)*numgroups + sizeof(float)*12*(h->num_joints + (h->num_poses*h->num_frames)) + sizeof(*bones)*h->num_joints +
(sizeof(*opos) + sizeof(*onorm1) + sizeof(*onorm2) + sizeof(*onorm3) + sizeof(*otcoords) + (noweights?0:(sizeof(*oindex)+sizeof(*oweight)))) * h->num_vertexes); (sizeof(*opos) + sizeof(*onorm1) + sizeof(*onorm2) + sizeof(*onorm3) + sizeof(*otcoords) + (noweights?0:(sizeof(*oindex)+sizeof(*oweight)))) * h->num_vertexes);
bones = (galiasbone_t*)(gai + h->num_meshes); bones = (galiasbone_t*)(gai + h->num_meshes);

View file

@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifdef SERVERONLY #ifdef SERVERONLY
model_t *loadmodel; model_t *loadmodel;
char loadname[32]; // for hunk tags char loadname[32]; // for hunk tags
static int mod_datasequence;
qboolean Terr_LoadTerrainModel (model_t *mod, void *buffer); qboolean Terr_LoadTerrainModel (model_t *mod, void *buffer);
qboolean Mod_LoadBrushModel (model_t *mod, void *buffer); qboolean Mod_LoadBrushModel (model_t *mod, void *buffer);
@ -321,17 +322,33 @@ qbyte *Mod_LeafnumPVS (int ln, model_t *model, qbyte *buffer)
/* /*
=================== ===================
Mod_ClearAll Mod_Flush
=================== ===================
*/ */
void Mod_ClearAll (void) void Mod_Flush(qboolean force)
{ {
int i; int i;
model_t *mod; model_t *mod;
for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++) for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
if (mod->type != mod_alias) {
if (mod->datasequence != mod_datasequence || force)
{
//and obliterate anything else remaining in memory.
ZG_FreeGroup(&mod->memgroup);
mod->meshinfo = NULL;
mod->needload = true; mod->needload = true;
}
}
}
/*
===================
Mod_ClearAll
===================
*/
void Mod_ClearAll (void)
{
mod_datasequence++;
} }
/* /*
@ -379,7 +396,6 @@ Loads a model into the cache
*/ */
model_t *Mod_LoadModel (model_t *mod, qboolean crash) model_t *Mod_LoadModel (model_t *mod, qboolean crash)
{ {
void *d;
unsigned *buf; unsigned *buf;
qbyte stackbuf[1024]; // avoid dirtying the cache heap qbyte stackbuf[1024]; // avoid dirtying the cache heap
@ -387,8 +403,7 @@ model_t *Mod_LoadModel (model_t *mod, qboolean crash)
{ {
if (mod->type == mod_alias) if (mod->type == mod_alias)
{ {
d = Cache_Check (&mod->cache); if (mod->meshinfo)
if (d)
return mod; return mod;
} }
else else
@ -558,7 +573,7 @@ void Mod_LoadTextures (lump_t *l)
m->nummiptex = LittleLong (m->nummiptex); m->nummiptex = LittleLong (m->nummiptex);
loadmodel->numtextures = m->nummiptex; loadmodel->numtextures = m->nummiptex;
loadmodel->textures = Hunk_AllocName (m->nummiptex * sizeof(*loadmodel->textures) , loadname); loadmodel->textures = ZG_Malloc(&loadmodel->memgroup, m->nummiptex * sizeof(*loadmodel->textures));
for (i=0 ; i<m->nummiptex ; i++) for (i=0 ; i<m->nummiptex ; i++)
{ {
@ -574,7 +589,7 @@ void Mod_LoadTextures (lump_t *l)
if ( (mt->width & 15) || (mt->height & 15) ) if ( (mt->width & 15) || (mt->height & 15) )
SV_Error ("Texture %s is not 16 aligned", mt->name); SV_Error ("Texture %s is not 16 aligned", mt->name);
pixels = mt->width*mt->height/64*85; pixels = mt->width*mt->height/64*85;
tx = Hunk_AllocName (sizeof(texture_t) +pixels, loadname ); tx = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t) +pixels);
loadmodel->textures[i] = tx; loadmodel->textures[i] = tx;
memcpy (tx->name, mt->name, sizeof(tx->name)); memcpy (tx->name, mt->name, sizeof(tx->name));
@ -698,12 +713,12 @@ qboolean Mod_LoadLighting (lump_t *l)
if (loadmodel->fromgame == fg_halflife) if (loadmodel->fromgame == fg_halflife)
{ {
loadmodel->lightdata = Hunk_AllocName ( l->filelen, loadname); loadmodel->lightdata = ZG_Malloc(&loadmodel->memgroup, l->filelen);
memcpy (loadmodel->lightdata, mod_base + l->fileofs, l->filelen); memcpy (loadmodel->lightdata, mod_base + l->fileofs, l->filelen);
} }
else else
{ {
loadmodel->lightdata = Hunk_AllocName ( l->filelen*3, loadname); loadmodel->lightdata = ZG_Malloc(&loadmodel->memgroup, l->filelen*3);
in = mod_base + l->fileofs; in = mod_base + l->fileofs;
out = loadmodel->lightdata; out = loadmodel->lightdata;
@ -732,7 +747,7 @@ void Mod_LoadVisibility (lump_t *l)
loadmodel->visdata = NULL; loadmodel->visdata = NULL;
return; return;
} }
loadmodel->visdata = Hunk_AllocName ( l->filelen, loadname); loadmodel->visdata = ZG_Malloc(&loadmodel->memgroup, l->filelen);
memcpy (loadmodel->visdata, mod_base + l->fileofs, l->filelen); memcpy (loadmodel->visdata, mod_base + l->fileofs, l->filelen);
} }
@ -749,7 +764,7 @@ void Mod_LoadEntities (lump_t *l)
loadmodel->entities = NULL; loadmodel->entities = NULL;
return; return;
} }
loadmodel->entities = Hunk_AllocName ( l->filelen + 1, loadname); loadmodel->entities = ZG_Malloc(&loadmodel->memgroup, l->filelen + 1);
memcpy (loadmodel->entities, mod_base + l->fileofs, l->filelen); memcpy (loadmodel->entities, mod_base + l->fileofs, l->filelen);
loadmodel->entities[l->filelen] = 0; loadmodel->entities[l->filelen] = 0;
} }
@ -773,7 +788,7 @@ qboolean Mod_LoadVertexes (lump_t *l)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->vertexes = out; loadmodel->vertexes = out;
loadmodel->numvertexes = count; loadmodel->numvertexes = count;
@ -813,7 +828,7 @@ qboolean Mod_LoadSubmodels (lump_t *l)
return false; return false;
} }
count = l->filelen / sizeof(*inh); count = l->filelen / sizeof(*inh);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->submodels = out; loadmodel->submodels = out;
loadmodel->numsubmodels = count; loadmodel->numsubmodels = count;
@ -851,7 +866,7 @@ qboolean Mod_LoadSubmodels (lump_t *l)
return false; return false;
} }
count = l->filelen / sizeof(*inq); count = l->filelen / sizeof(*inq);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->submodels = out; loadmodel->submodels = out;
loadmodel->numsubmodels = count; loadmodel->numsubmodels = count;
@ -902,7 +917,7 @@ qboolean Mod_LoadEdges (lump_t *l, qboolean lm)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( (count + 1) * sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, (count + 1) * sizeof(*out));
loadmodel->edges = out; loadmodel->edges = out;
loadmodel->numedges = count; loadmodel->numedges = count;
@ -922,7 +937,7 @@ qboolean Mod_LoadEdges (lump_t *l, qboolean lm)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( (count + 1) * sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, (count + 1) * sizeof(*out));
loadmodel->edges = out; loadmodel->edges = out;
loadmodel->numedges = count; loadmodel->numedges = count;
@ -956,7 +971,7 @@ qboolean Mod_LoadTexinfo (lump_t *l)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->texinfo = out; loadmodel->texinfo = out;
loadmodel->numtexinfo = count; loadmodel->numtexinfo = count;
@ -1096,7 +1111,7 @@ qboolean Mod_LoadFaces (lump_t *l, qboolean lm)
} }
count = l->filelen / sizeof(*ins); count = l->filelen / sizeof(*ins);
} }
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->surfaces = out; loadmodel->surfaces = out;
loadmodel->numsurfaces = count; loadmodel->numsurfaces = count;
@ -1205,7 +1220,7 @@ qboolean Mod_LoadNodes (lump_t *l, qboolean lm)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->nodes = out; loadmodel->nodes = out;
loadmodel->numnodes = count; loadmodel->numnodes = count;
@ -1244,7 +1259,7 @@ qboolean Mod_LoadNodes (lump_t *l, qboolean lm)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->nodes = out; loadmodel->nodes = out;
loadmodel->numnodes = count; loadmodel->numnodes = count;
@ -1298,7 +1313,7 @@ qboolean Mod_LoadLeafs (lump_t *l, qboolean lm)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->leafs = out; loadmodel->leafs = out;
loadmodel->numleafs = count; loadmodel->numleafs = count;
@ -1338,7 +1353,7 @@ qboolean Mod_LoadLeafs (lump_t *l, qboolean lm)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->leafs = out; loadmodel->leafs = out;
loadmodel->numleafs = count; loadmodel->numleafs = count;
@ -1394,7 +1409,7 @@ qboolean Mod_LoadClipnodes (lump_t *l, qboolean lm)
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
for (i=0 ; i<count ; i++, in++) for (i=0 ; i<count ; i++, in++)
{ {
out[i].planenum = LittleLong(in->planenum); out[i].planenum = LittleLong(in->planenum);
@ -1413,7 +1428,7 @@ qboolean Mod_LoadClipnodes (lump_t *l, qboolean lm)
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
for (i=0 ; i<count ; i++, in++) for (i=0 ; i<count ; i++, in++)
{ {
out[i].planenum = LittleLong(in->planenum); out[i].planenum = LittleLong(in->planenum);
@ -1605,7 +1620,7 @@ void Mod_MakeHull0 (void)
in = loadmodel->nodes; in = loadmodel->nodes;
count = loadmodel->numnodes; count = loadmodel->numnodes;
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
hull->clipnodes = out; hull->clipnodes = out;
hull->firstclipnode = 0; hull->firstclipnode = 0;
@ -1641,7 +1656,7 @@ void Mod_LoadMarksurfaces (lump_t *l)
if (l->filelen % sizeof(*in)) if (l->filelen % sizeof(*in))
SV_Error ("MOD_LoadBmodel: funny lump size in %s",loadmodel->name); SV_Error ("MOD_LoadBmodel: funny lump size in %s",loadmodel->name);
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->marksurfaces = out; loadmodel->marksurfaces = out;
loadmodel->nummarksurfaces = count; loadmodel->nummarksurfaces = count;
@ -1672,7 +1687,7 @@ qboolean Mod_LoadSurfedges (lump_t *l)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out));
loadmodel->surfedges = out; loadmodel->surfedges = out;
loadmodel->numsurfedges = count; loadmodel->numsurfedges = count;
@ -1703,7 +1718,7 @@ qboolean Mod_LoadPlanes (lump_t *l)
return false; return false;
} }
count = l->filelen / sizeof(*in); count = l->filelen / sizeof(*in);
out = Hunk_AllocName ( count*2*sizeof(*out), loadname); out = ZG_Malloc(&loadmodel->memgroup, count*2*sizeof(*out));
loadmodel->planes = out; loadmodel->planes = out;
loadmodel->numplanes = count; loadmodel->numplanes = count;
@ -1737,15 +1752,12 @@ qboolean Mod_LoadBrushModel (model_t *mod, void *buffer)
dheader_t *header; dheader_t *header;
mmodel_t *bm; mmodel_t *bm;
unsigned int chksum; unsigned int chksum;
int start;
qboolean noerrors; qboolean noerrors;
qboolean longm = false; qboolean longm = false;
#ifdef TERRAIN #ifdef TERRAIN
model_t *lm = loadmodel; model_t *lm = loadmodel;
#endif #endif
start = Hunk_LowMark();
loadmodel->type = mod_brush; loadmodel->type = mod_brush;
header = (dheader_t *)buffer; header = (dheader_t *)buffer;
@ -1829,7 +1841,7 @@ qboolean Mod_LoadBrushModel (model_t *mod, void *buffer)
if (!noerrors) if (!noerrors)
{ {
Hunk_FreeToLowMark(start); ZG_FreeGroup(&mod->memgroup);
return false; return false;
} }
@ -1875,6 +1887,7 @@ qboolean Mod_LoadBrushModel (model_t *mod, void *buffer)
*loadmodel = *mod; *loadmodel = *mod;
strcpy (loadmodel->name, name); strcpy (loadmodel->name, name);
mod = loadmodel; mod = loadmodel;
memset(&mod->memgroup, 0, sizeof(mod->memgroup));
} }
} }
@ -1889,17 +1902,14 @@ qboolean Mod_LoadBrushModel (model_t *mod, void *buffer)
void *Mod_Extradata (model_t *mod) void *Mod_Extradata (model_t *mod)
{ {
void *r; if (mod->meshinfo)
return mod->meshinfo;
r = Cache_Check (&mod->cache);
if (r)
return r;
Mod_LoadModel (mod, true); Mod_LoadModel (mod, true);
if (!mod->cache.data) if (!mod->meshinfo)
Sys_Error ("Mod_Extradata: caching failed"); Sys_Error ("Mod_Extradata: caching failed");
return mod->cache.data; return mod->meshinfo;
} }