From: sajt Date: Sat, 10 Sep 2005 06:49:57 +0000 (+0000) Subject: MCBSP version 2 loading in the engine.. Some very ugly code (will be rewritten).... X-Git-Tag: xonotic-v0.1.0preview~4572 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=6a3503802b09163bef8aba815277841463391b1e;p=xonotic%2Fdarkplaces.git MCBSP version 2 loading in the engine.. Some very ugly code (will be rewritten). Also, I haven't thought of how bboxes will round to hull sizes yet, so don't even bother trying to use the format yet. Also, someone might want to add a dhullinfo_t instance in the model struct or something, so the rounding functions would be able to access the hull sizes. I'm not sure how that will all work yet. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@5706 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/bspfile.h b/bspfile.h index 80e54a2c..730fbde4 100644 --- a/bspfile.h +++ b/bspfile.h @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define MAX_MAP_HULLS 4 +#define MAX_MAP_HULLS 16 // was 4 #define MAX_MAP_LEAFS 65536 // was 8192 // key / value pair sizes @@ -31,8 +31,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define BSPVERSION 29 -#define MCBSPVERSION 1 -#define TOOLVERSION 2 +#define MCBSPVERSION 2 typedef struct { @@ -56,6 +55,13 @@ typedef struct #define LUMP_MODELS 14 #define HEADER_LUMPS 15 +typedef struct +{ + int numhulls; + int filehulls; + float hullsizes[MAX_MAP_HULLS][2][3]; +} dhullinfo_t; + typedef struct { float mins[3], maxs[3]; diff --git a/model_brush.c b/model_brush.c index 18dc01fe..3d5e5953 100644 --- a/model_brush.c +++ b/model_brush.c @@ -1562,35 +1562,42 @@ static void Mod_Q1BSP_LoadVertexes(lump_t *l) } } -static void Mod_Q1BSP_LoadSubmodels(lump_t *l) +static void Mod_Q1BSP_LoadSubmodels(lump_t *l, dhullinfo_t *hullinfo) { - dmodel_t *in; + byte *index; dmodel_t *out; int i, j, count; - in = (void *)(mod_base + l->fileofs); - if (l->filelen % sizeof(*in)) - Host_Error("Mod_Q1BSP_LoadSubmodels: funny lump size in %s",loadmodel->name); - count = l->filelen / sizeof(*in); - out = Mem_Alloc(loadmodel->mempool, count*sizeof(*out)); + index = (byte *)(mod_base + l->fileofs); + if (l->filelen % (48+4*hullinfo->filehulls)) + Host_Error ("Mod_Q1BSP_LoadSubmodels: funny lump size in %s", loadmodel->name); + + count = l->filelen / (48+4*hullinfo->filehulls); + out = Mem_Alloc (loadmodel->mempool, count*sizeof(*out)); loadmodel->brushq1.submodels = out; loadmodel->brush.numsubmodels = count; - for ( i=0 ; imins[0] = LittleFloat(*(float*)index) - 1; index += 4; + out->mins[1] = LittleFloat(*(float*)index) - 1; index += 4; + out->mins[2] = LittleFloat(*(float*)index) - 1; index += 4; + out->maxs[0] = LittleFloat(*(float*)index) + 1; index += 4; + out->maxs[1] = LittleFloat(*(float*)index) + 1; index += 4; + out->maxs[2] = LittleFloat(*(float*)index) + 1; index += 4; + out->origin[0] = LittleFloat (*(float*)index); index += 4; + out->origin[1] = LittleFloat (*(float*)index); index += 4; + out->origin[2] = LittleFloat (*(float*)index); index += 4; + for (j = 0; j < hullinfo->filehulls; j++) { - // spread the mins / maxs by a pixel - out->mins[j] = LittleFloat(in->mins[j]) - 1; - out->maxs[j] = LittleFloat(in->maxs[j]) + 1; - out->origin[j] = LittleFloat(in->origin[j]); + out->headnode[j] = LittleLong (*(int*)index); + index += 4; } - for (j=0 ; jheadnode[j] = LittleLong(in->headnode[j]); - out->visleafs = LittleLong(in->visleafs); - out->firstface = LittleLong(in->firstface); - out->numfaces = LittleLong(in->numfaces); + out->visleafs = LittleLong (*(int*)index); index += 4; + out->firstface = LittleLong (*(int*)index); index += 4; + out->numfaces = LittleLong (*(int*)index); index += 4; } } @@ -2114,7 +2121,7 @@ static void Mod_Q1BSP_LoadLeafs(lump_t *l) } } -static void Mod_Q1BSP_LoadClipnodes(lump_t *l) +static void Mod_Q1BSP_LoadClipnodes(lump_t *l, dhullinfo_t *hullinfo) { dclipnode_t *in, *out; int i, count; @@ -2129,101 +2136,19 @@ static void Mod_Q1BSP_LoadClipnodes(lump_t *l) loadmodel->brushq1.clipnodes = out; loadmodel->brushq1.numclipnodes = count; - if (loadmodel->brush.ismcbsp) + for (i = 1; i < hullinfo->numhulls; i++) { - hull = &loadmodel->brushq1.hulls[1]; + hull = &loadmodel->brushq1.hulls[i]; hull->clipnodes = out; hull->firstclipnode = 0; hull->lastclipnode = count-1; hull->planes = loadmodel->brush.data_planes; - hull->clip_mins[0] = -12; - hull->clip_mins[1] = -12; - hull->clip_mins[2] = -24; - hull->clip_maxs[0] = 12; - hull->clip_maxs[1] = 12; - hull->clip_maxs[2] = 32; - VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size); - - hull = &loadmodel->brushq1.hulls[2]; - hull->clipnodes = out; - hull->firstclipnode = 0; - hull->lastclipnode = count-1; - hull->planes = loadmodel->brush.data_planes; - hull->clip_mins[0] = -12; - hull->clip_mins[1] = -12; - hull->clip_mins[2] = -24; - hull->clip_maxs[0] = 12; - hull->clip_maxs[1] = 12; - hull->clip_maxs[2] = 16; - VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size); - } - else if (loadmodel->brush.ishlbsp) - { - hull = &loadmodel->brushq1.hulls[1]; - hull->clipnodes = out; - hull->firstclipnode = 0; - hull->lastclipnode = count-1; - hull->planes = loadmodel->brush.data_planes; - hull->clip_mins[0] = -16; - hull->clip_mins[1] = -16; - hull->clip_mins[2] = -36; - hull->clip_maxs[0] = 16; - hull->clip_maxs[1] = 16; - hull->clip_maxs[2] = 36; - VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size); - - hull = &loadmodel->brushq1.hulls[2]; - hull->clipnodes = out; - hull->firstclipnode = 0; - hull->lastclipnode = count-1; - hull->planes = loadmodel->brush.data_planes; - hull->clip_mins[0] = -32; - hull->clip_mins[1] = -32; - hull->clip_mins[2] = -32; - hull->clip_maxs[0] = 32; - hull->clip_maxs[1] = 32; - hull->clip_maxs[2] = 32; - VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size); - - hull = &loadmodel->brushq1.hulls[3]; - hull->clipnodes = out; - hull->firstclipnode = 0; - hull->lastclipnode = count-1; - hull->planes = loadmodel->brush.data_planes; - hull->clip_mins[0] = -16; - hull->clip_mins[1] = -16; - hull->clip_mins[2] = -18; - hull->clip_maxs[0] = 16; - hull->clip_maxs[1] = 16; - hull->clip_maxs[2] = 18; - VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size); - } - else - { - hull = &loadmodel->brushq1.hulls[1]; - hull->clipnodes = out; - hull->firstclipnode = 0; - hull->lastclipnode = count-1; - hull->planes = loadmodel->brush.data_planes; - hull->clip_mins[0] = -16; - hull->clip_mins[1] = -16; - hull->clip_mins[2] = -24; - hull->clip_maxs[0] = 16; - hull->clip_maxs[1] = 16; - hull->clip_maxs[2] = 32; - VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size); - - hull = &loadmodel->brushq1.hulls[2]; - hull->clipnodes = out; - hull->firstclipnode = 0; - hull->lastclipnode = count-1; - hull->planes = loadmodel->brush.data_planes; - hull->clip_mins[0] = -32; - hull->clip_mins[1] = -32; - hull->clip_mins[2] = -24; - hull->clip_maxs[0] = 32; - hull->clip_maxs[1] = 32; - hull->clip_maxs[2] = 64; + hull->clip_mins[0] = hullinfo->hullsizes[i][0][0]; + hull->clip_mins[1] = hullinfo->hullsizes[i][0][1]; + hull->clip_mins[2] = hullinfo->hullsizes[i][0][2]; + hull->clip_maxs[0] = hullinfo->hullsizes[i][1][0]; + hull->clip_maxs[1] = hullinfo->hullsizes[i][1][1]; + hull->clip_maxs[2] = hullinfo->hullsizes[i][1][2]; VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size); } @@ -2970,18 +2895,50 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend) float dist, modelyawradius, modelradius, *vec; msurface_t *surface; int numshadowmeshtriangles; + dheader_t _header; + dhullinfo_t hullinfo; mod->type = mod_brushq1; - if (!memcmp(buffer, "MCBSP", 5)) + if (!memcmp (buffer, "MCBSP", 5)) { - header = (dheader_t *)((unsigned char*)buffer + 5); + qbyte *index; - i = LittleLong(header->version); - if (i != MCBSPVERSION) - Host_Error("Mod_Q1BSP_Load: %s has wrong version number(MCBSP %i should be %i", mod->name, i, MCBSPVERSION); mod->brush.ismcbsp = true; mod->brush.ishlbsp = false; + + mod_base = (qbyte*)buffer; + + index = mod_base; + index += 5; + i = LittleLong(*(int*)index); index += 4; + if (i != MCBSPVERSION) + Host_Error("Mod_Q1BSP_Load: %s has wrong version number(%i should be %i)", mod->name, i, MCBSPVERSION); + + // read hull info + hullinfo.numhulls = LittleLong(*(int*)index); index += 4; + hullinfo.filehulls = hullinfo.numhulls; + VectorClear (hullinfo.hullsizes[0][0]); + VectorClear (hullinfo.hullsizes[0][1]); + for (i = 1; i < hullinfo.numhulls; i++) + { + hullinfo.hullsizes[i][0][0] = LittleFloat(*(float*)index); index += 4; + hullinfo.hullsizes[i][0][1] = LittleFloat(*(float*)index); index += 4; + hullinfo.hullsizes[i][0][2] = LittleFloat(*(float*)index); index += 4; + hullinfo.hullsizes[i][1][0] = LittleFloat(*(float*)index); index += 4; + hullinfo.hullsizes[i][1][1] = LittleFloat(*(float*)index); index += 4; + hullinfo.hullsizes[i][1][2] = LittleFloat(*(float*)index); index += 4; + } + + // read lumps + _header.version = 0; + for (i = 0; i < HEADER_LUMPS; i++) + { + _header.lumps[i].fileofs = LittleLong(*(int*)index); index += 4; + _header.lumps[i].filelen = LittleLong(*(int*)index); index += 4; + } + + header = &_header; } else { @@ -2991,6 +2948,39 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend) if (i != BSPVERSION && i != 30) Host_Error("Mod_Q1BSP_Load: %s has wrong version number(%i should be %i(Quake) or 30(HalfLife)", mod->name, i, BSPVERSION); mod->brush.ishlbsp = i == 30; + mod->brush.ismcbsp = false; + + // fill in hull info + VectorClear (hullinfo.hullsizes[0][0]); + VectorClear (hullinfo.hullsizes[0][1]); + if (mod->brush.ishlbsp) + { + hullinfo.numhulls = 4; + hullinfo.filehulls = 4; + VectorSet (hullinfo.hullsizes[0][0], -16, -16, -36); + VectorSet (hullinfo.hullsizes[0][1], 16, 16, 36); + VectorSet (hullinfo.hullsizes[1][0], -32, -32, -32); + VectorSet (hullinfo.hullsizes[1][1], 32, 32, 32); + VectorSet (hullinfo.hullsizes[2][0], -16, -16, -18); + VectorSet (hullinfo.hullsizes[2][1], 16, 16, 18); + } + else + { + hullinfo.numhulls = 3; + hullinfo.filehulls = 4; + VectorSet (hullinfo.hullsizes[0][0], -16, -16, -24); + VectorSet (hullinfo.hullsizes[0][1], 16, 16, 32); + VectorSet (hullinfo.hullsizes[1][0], -32, -32, -24); + VectorSet (hullinfo.hullsizes[1][1], 32, 32, 64); + } + + // read lumps + mod_base = (qbyte*)buffer; + for (i = 0; i < HEADER_LUMPS; i++) + { + header->lumps[i].fileofs = LittleLong(header->lumps[i].fileofs); + header->lumps[i].filelen = LittleLong(header->lumps[i].filelen); + } } mod->soundfromcenter = true; @@ -3014,16 +3004,6 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend) Cvar_SetValue("mcbsp", mod->brush.ismcbsp); } -// swap all the lumps - mod_base = (qbyte *)header; - - header->version = LittleLong(header->version); - for (i = 0;i < HEADER_LUMPS;i++) - { - header->lumps[i].fileofs = LittleLong(header->lumps[i].fileofs); - header->lumps[i].filelen = LittleLong(header->lumps[i].filelen); - } - // load into heap // store which lightmap format to use @@ -3041,10 +3021,10 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend) Mod_Q1BSP_LoadLeaffaces(&header->lumps[LUMP_MARKSURFACES]); Mod_Q1BSP_LoadVisibility(&header->lumps[LUMP_VISIBILITY]); // load submodels before leafs because they contain the number of vis leafs - Mod_Q1BSP_LoadSubmodels(&header->lumps[LUMP_MODELS]); + Mod_Q1BSP_LoadSubmodels(&header->lumps[LUMP_MODELS], &hullinfo); Mod_Q1BSP_LoadLeafs(&header->lumps[LUMP_LEAFS]); Mod_Q1BSP_LoadNodes(&header->lumps[LUMP_NODES]); - Mod_Q1BSP_LoadClipnodes(&header->lumps[LUMP_CLIPNODES]); + Mod_Q1BSP_LoadClipnodes(&header->lumps[LUMP_CLIPNODES], &hullinfo); if (!mod->brushq1.lightdata) mod->brush.LightPoint = NULL;