From 75fa0c6042136f0d314fcddc724d531d0bd454b3 Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 1 Oct 2007 03:39:40 +0000 Subject: [PATCH] implemented support for more than 32768 clipnodes (again a case of arguire qbsp producing files that violate the q1bsp format), this fixes large monsters falling out of levels in warpspasm git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7600 d7cf8633-e32d-0410-b094-e92efae38249 --- model_brush.c | 41 ++++++++++++++++++++--------------------- model_brush.h | 8 +++++++- model_shared.h | 2 +- todo | 4 ++-- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/model_brush.c b/model_brush.c index 00df8ca0..bbef49b5 100644 --- a/model_brush.c +++ b/model_brush.c @@ -629,7 +629,7 @@ static int Mod_Q1BSP_RecursiveHullCheck(RecursiveHullCheckTraceInfo_t *t, int nu double t1, t2; // variables that need to be stored on the stack when recursing - dclipnode_t *node; + mclipnode_t *node; int side; double midf, mid[3]; @@ -925,7 +925,7 @@ void Collision_ClipTrace_Box(trace_t *trace, const vec3_t cmins, const vec3_t cm #else RecursiveHullCheckTraceInfo_t rhc; static hull_t box_hull; - static dclipnode_t box_clipnodes[6]; + static mclipnode_t box_clipnodes[6]; static mplane_t box_planes[6]; // fill in a default trace memset(&rhc, 0, sizeof(rhc)); @@ -2480,18 +2480,12 @@ static void Mod_Q1BSP_LoadNodes(lump_t *l) for (j=0 ; j<2 ; j++) { - // LordHavoc: this code supports more than 32768 nodes or leafs, - // by simply assuming that there are no more than 65536 combined, - // this makes it compatible with the broken arguire qbsp utility - // which can produce more than 32768 nodes (breaking the format) - // note that arguire light and vis utilities still crash on this - // - // I do not encourage support for this weirdness, this code was - // reworked simply to allow flying around leaky maps that exceed - // the limits, with the assumption that a final compile will be - // valid after the leak is fixed. + // LordHavoc: this code supports broken bsp files produced by + // arguire qbsp which can produce more than 32768 nodes, any value + // below count is assumed to be a node number, any other value is + // assumed to be a leaf number p = (unsigned short)LittleShort(in->children[j]); - if (p < 65536 - loadmodel->brush.num_leafs) + if (p < count) { if (p < loadmodel->brush.num_nodes) out->children[j] = loadmodel->brush.data_nodes + p; @@ -2504,6 +2498,7 @@ static void Mod_Q1BSP_LoadNodes(lump_t *l) } else { + // note this uses 65535 intentionally, -1 is leaf 0 p = 65535 - p; if (p < loadmodel->brush.num_leafs) out->children[j] = (mnode_t *)(loadmodel->brush.data_leafs + p); @@ -2604,7 +2599,8 @@ qboolean Mod_Q1BSP_CheckWaterAlphaSupport(void) static void Mod_Q1BSP_LoadClipnodes(lump_t *l, hullinfo_t *hullinfo) { - dclipnode_t *in, *out; + dclipnode_t *in; + mclipnode_t *out; int i, count; hull_t *hull; @@ -2612,7 +2608,7 @@ static void Mod_Q1BSP_LoadClipnodes(lump_t *l, hullinfo_t *hullinfo) if (l->filelen % sizeof(*in)) Host_Error("Mod_Q1BSP_LoadClipnodes: funny lump size in %s",loadmodel->name); count = l->filelen / sizeof(*in); - out = (dclipnode_t *)Mem_Alloc(loadmodel->mempool, count*sizeof(*out)); + out = (mclipnode_t *)Mem_Alloc(loadmodel->mempool, count*sizeof(*out)); loadmodel->brushq1.clipnodes = out; loadmodel->brushq1.numclipnodes = count; @@ -2636,12 +2632,15 @@ static void Mod_Q1BSP_LoadClipnodes(lump_t *l, hullinfo_t *hullinfo) for (i=0 ; iplanenum = LittleLong(in->planenum); - out->children[0] = LittleShort(in->children[0]); - out->children[1] = LittleShort(in->children[1]); + // LordHavoc: this code supports arguire qbsp's broken clipnodes indices (more than 32768 clipnodes), values above count are assumed to be contents values + out->children[0] = (unsigned short)LittleShort(in->children[0]); + out->children[1] = (unsigned short)LittleShort(in->children[1]); + if (out->children[0] >= count) + out->children[0] -= 65536; + if (out->children[1] >= count) + out->children[1] -= 65536; if (out->planenum < 0 || out->planenum >= loadmodel->brush.num_planes) Host_Error("Corrupt clipping hull(out of range planenum)"); - if (out->children[0] >= count || out->children[1] >= count) - Host_Error("Corrupt clipping hull(out of range child)"); } } @@ -2649,14 +2648,14 @@ static void Mod_Q1BSP_LoadClipnodes(lump_t *l, hullinfo_t *hullinfo) static void Mod_Q1BSP_MakeHull0(void) { mnode_t *in; - dclipnode_t *out; + mclipnode_t *out; int i; hull_t *hull; hull = &loadmodel->brushq1.hulls[0]; in = loadmodel->brush.data_nodes; - out = (dclipnode_t *)Mem_Alloc(loadmodel->mempool, loadmodel->brush.num_nodes * sizeof(dclipnode_t)); + out = (mclipnode_t *)Mem_Alloc(loadmodel->mempool, loadmodel->brush.num_nodes * sizeof(*out)); hull->clipnodes = out; hull->firstclipnode = 0; diff --git a/model_brush.h b/model_brush.h index 56466319..b4cce7b7 100644 --- a/model_brush.h +++ b/model_brush.h @@ -163,9 +163,15 @@ typedef struct mleaf_s } mleaf_t; +typedef struct mclipnode_s +{ + int planenum; + int children[2]; // negative numbers are contents +} mclipnode_t; + typedef struct hull_s { - dclipnode_t *clipnodes; + mclipnode_t *clipnodes; mplane_t *planes; int firstclipnode; int lastclipnode; diff --git a/model_shared.h b/model_shared.h index ea5e5877..2c4be375 100644 --- a/model_shared.h +++ b/model_shared.h @@ -666,7 +666,7 @@ typedef struct model_brushq1_s int *surfedges; int numclipnodes; - dclipnode_t *clipnodes; + mclipnode_t *clipnodes; hull_t hulls[MAX_MAP_HULLS]; diff --git a/todo b/todo index 7a016f33..9b417894 100644 --- a/todo +++ b/todo @@ -1,6 +1,4 @@ - todo: difficulty ratings are: 0 = trivial, 1 = easy, 2 = easy-moderate, 3 = moderate, 4 = moderate-hard, 5 = hard, 6 = hard++, 7 = nightmare, d = done, -d = done but have not notified the people who asked for it, f = failed, -f = failed but have not notified the people who asked for it --d (Amish, Fuh) feature darkplaces client: add qw protocol support (making darkplaces work as a qwcl client) (Amish, Fuh) --d (Stribbs, Jimmy Freestone) feature darkplaces renderer: add HalfLife2 style water rendering (Mitchell, Stribbs, Jimmy Freestone) 0 bug darkplaces client qw: add .mvd demo support 0 bug darkplaces client qw: add .qwd demo support 0 bug darkplaces client qw: add spectator cvar (Plague Monkey Rat) @@ -1215,6 +1213,7 @@ d feature darkplaces client: add .loc file support and say macros d feature darkplaces client: add BX_WAL_SUPPORT to extensions and document it, the feature has been in for a long time, also update wiki.quakesrc.org accordingly d feature darkplaces client: add a dot crosshair texture (HellToupee) d feature darkplaces client: add a sv_fixedframeratesingleplayer cvar (default off), to allow fixed framerate singleplayer mods, mainly useful for physics (Urre) +d feature darkplaces client: add qw protocol support (making darkplaces work as a qwcl client) (Amish, Fuh) d feature darkplaces client: add showbrand cvar which would show gfx/brand.tga in the left/right top/bottom corner (depending on value of scr_showbrand) all the time, this would be useful for screenshots (Spirit_of_85) d feature darkplaces client: cl_capture_video avi support would be nice, the Intel(r) 4:2:0 codec seems to be standard on Windows XP so this should be easy d feature darkplaces client: make tab completion able to complete map names when using a map or changelevel command (Zenex, Eksess) @@ -1252,6 +1251,7 @@ d feature darkplaces protocol: add PRYDON_CLIENTCURSOR extension - clientside mo d feature darkplaces protocol: add back colormod extension (FrikaC, Uffe, Gilgamesh, Wazat) d feature darkplaces protocol: add buttons 9-16 (yummyluv) d feature darkplaces protocol: allow sending of additional precaches during game, this needs to send a reliable message to all connected clients stating the new filename to load, and also to be sent to new connections (VorteX, Vermeulen) +d feature darkplaces renderer: add HalfLife2 style water rendering (Mitchell, Stribbs, Jimmy Freestone) d feature darkplaces renderer: add a nearclip cvar (Tomaz) d feature darkplaces renderer: add q3bsp water rendering, both scrolling and watershader (Zombie) d feature darkplaces renderer: add r_shadow_visiblelighting cvar which draws redish orange polygons similar to visiblevolumes for measuring number of light passes per pixel (Harbish) -- 2.39.2