shithub: nanobsp

Download patch

ref: 07d6d6d275121b613d063ccbe149560288c3adf0
parent: 61fd6eaba2a5361e5d83000b86010efe11547ba6
author: Andrew Apted <ajapted@gmail.com>
date: Fri Dec 15 08:48:46 EST 2023

restored code loading NODES, SSECTORS and SEGS lumps in p_setup.c

Kept the part in P_SetupLevel() which invokes the node builder.

--- a/p_setup.c
+++ b/p_setup.c
@@ -51,21 +51,18 @@
 int		numvertexes;
 vertex_t*	vertexes;
 
+int		numsegs;
+seg_t*		segs;
+
 int		numsectors;
 sector_t*	sectors;
 
-// andrewj: made these local to this file, added root_node.
-static int		numsegs;
-static seg_t*		segs;
+int		numsubsectors;
+subsector_t*	subsectors;
 
-static int		numsubsectors;
-static subsector_t*	subsectors;
+int		numnodes;
+node_t*		nodes;
 
-static int		numnodes;
-static node_t*		nodes;
-
-node_t*		root_node;
-
 int		numlines;
 line_t*		lines;
 
@@ -207,50 +204,49 @@
 //
 // P_LoadSegs
 //
-// andrewj: updated this code (etc) for nano-bsp.
-//
 void P_LoadSegs (int lump)
 {
-    byte*        data;
-    int          i;
-    mapseg_t*    ml;
-    seg_t*       li;
-    line_t*      ldef;
-    int          linedef;
-    int          sidenum;
-
+    byte*		data;
+    int			i;
+    mapseg_t*		ml;
+    seg_t*		li;
+    line_t*		ldef;
+    int			linedef;
+    int			side;
+    int                 sidenum;
+	
     numsegs = W_LumpLength (lump) / sizeof(mapseg_t);
-    segs = Z_Malloc (numsegs*sizeof(seg_t),PU_LEVEL,0);
+    segs = Z_Malloc (numsegs*sizeof(seg_t),PU_LEVEL,0);	
     memset (segs, 0, numsegs*sizeof(seg_t));
     data = W_CacheLumpNum (lump,PU_STATIC);
-
+	
     ml = (mapseg_t *)data;
     li = segs;
     for (i=0 ; i<numsegs ; i++, li++, ml++)
     {
-        li->v1 = &vertexes[LE_SHORT(ml->v1)];
-        li->v2 = &vertexes[LE_SHORT(ml->v2)];
+	li->v1 = &vertexes[LE_SHORT(ml->v1)];
+	li->v2 = &vertexes[LE_SHORT(ml->v2)];
 
-        li->angle = (LE_SHORT(ml->angle))<<FRACBITS;
-        li->offset = (LE_SHORT(ml->offset))<<FRACBITS;
-        linedef = LE_SHORT(ml->linedef);
-        ldef = &lines[linedef];
-        li->linedef = ldef;
-        li->side = LE_SHORT(ml->side);
+	li->angle = (LE_SHORT(ml->angle))<<FRACBITS;
+	li->offset = (LE_SHORT(ml->offset))<<FRACBITS;
+	linedef = LE_SHORT(ml->linedef);
+	ldef = &lines[linedef];
+	li->linedef = ldef;
+	side = LE_SHORT(ml->side);
 
         // e6y: check for wrong indexes
-        if ((unsigned)ldef->sidenum[li->side] >= (unsigned)numsides)
+        if ((unsigned)ldef->sidenum[side] >= (unsigned)numsides)
         {
             I_Error("P_LoadSegs: linedef %d for seg %d references a non-existent sidedef %d",
-                    linedef, i, (unsigned)ldef->sidenum[li->side]);
+                    linedef, i, (unsigned)ldef->sidenum[side]);
         }
 
-        li->sidedef = &sides[ldef->sidenum[li->side]];
-        li->frontsector = sides[ldef->sidenum[li->side]].sector;
+	li->sidedef = &sides[ldef->sidenum[side]];
+	li->frontsector = sides[ldef->sidenum[side]].sector;
 
         if (ldef-> flags & ML_TWOSIDED)
         {
-            sidenum = ldef->sidenum[li->side ^ 1];
+            sidenum = ldef->sidenum[side ^ 1];
 
             // If the sidenum is out of range, this may be a "glass hack"
             // impassible window.  Point at side #0 (this may not be
@@ -269,10 +265,10 @@
         }
         else
         {
-            li->backsector = NULL;
+	    li->backsector = 0;
         }
     }
-
+	
     W_ReleaseLumpNum(lump);
 }
 
@@ -282,35 +278,25 @@
 //
 void P_LoadSubsectors (int lump)
 {
-    byte*            data;
-    int              i;
-    mapsubsector_t*  ms;
-    subsector_t*     ss;
-
+    byte*		data;
+    int			i;
+    mapsubsector_t*	ms;
+    subsector_t*	ss;
+	
     numsubsectors = W_LumpLength (lump) / sizeof(mapsubsector_t);
-    subsectors = Z_Malloc (numsubsectors*sizeof(subsector_t),PU_LEVEL,0);
-    memset (subsectors, 0, numsubsectors*sizeof(subsector_t));
+    subsectors = Z_Malloc (numsubsectors*sizeof(subsector_t),PU_LEVEL,0);	
     data = W_CacheLumpNum (lump,PU_STATIC);
-
+	
     ms = (mapsubsector_t *)data;
     memset (subsectors,0, numsubsectors*sizeof(subsector_t));
     ss = subsectors;
-
+    
     for (i=0 ; i<numsubsectors ; i++, ss++, ms++)
     {
-        int numlines  = LE_SHORT(ms->numsegs);
-        int firstline = LE_SHORT(ms->firstseg);
-
-        if (numlines > 0)
-        {
-            ss->segs = &segs[firstline];
-
-            int i;
-            for (i = 1 ; i < numlines ; i++)
-                segs[firstline + i - 1].next = &segs[firstline + i];
-        }
+	ss->numlines = LE_SHORT(ms->numsegs);
+	ss->firstline = LE_SHORT(ms->firstseg);
     }
-
+	
     W_ReleaseLumpNum(lump);
 }
 
@@ -320,30 +306,30 @@
 //
 void P_LoadSectors (int lump)
 {
-    byte*        data;
-    int          i;
-    mapsector_t* ms;
-    sector_t*    ss;
-
+    byte*		data;
+    int			i;
+    mapsector_t*	ms;
+    sector_t*		ss;
+	
     numsectors = W_LumpLength (lump) / sizeof(mapsector_t);
-    sectors = Z_Malloc (numsectors*sizeof(sector_t),PU_LEVEL,0);
+    sectors = Z_Malloc (numsectors*sizeof(sector_t),PU_LEVEL,0);	
     memset (sectors, 0, numsectors*sizeof(sector_t));
     data = W_CacheLumpNum (lump,PU_STATIC);
-
+	
     ms = (mapsector_t *)data;
     ss = sectors;
     for (i=0 ; i<numsectors ; i++, ss++, ms++)
     {
-        ss->floorheight = LE_SHORT(ms->floorheight)<<FRACBITS;
-        ss->ceilingheight = LE_SHORT(ms->ceilingheight)<<FRACBITS;
-        ss->floorpic = R_FlatNumForName(ms->floorpic);
-        ss->ceilingpic = R_FlatNumForName(ms->ceilingpic);
-        ss->lightlevel = LE_SHORT(ms->lightlevel);
-        ss->special = LE_SHORT(ms->special);
-        ss->tag = LE_SHORT(ms->tag);
-        ss->thinglist = NULL;
+	ss->floorheight = LE_SHORT(ms->floorheight)<<FRACBITS;
+	ss->ceilingheight = LE_SHORT(ms->ceilingheight)<<FRACBITS;
+	ss->floorpic = R_FlatNumForName(ms->floorpic);
+	ss->ceilingpic = R_FlatNumForName(ms->ceilingpic);
+	ss->lightlevel = LE_SHORT(ms->lightlevel);
+	ss->special = LE_SHORT(ms->special);
+	ss->tag = LE_SHORT(ms->tag);
+	ss->thinglist = NULL;
     }
-
+	
     W_ReleaseLumpNum(lump);
 }
 
@@ -353,78 +339,35 @@
 //
 void P_LoadNodes (int lump)
 {
-    byte*       data;
-    int         i;
-    int         j;
-    int         k;
-    mapnode_t*  mn;
-    node_t*     no;
-
+    byte*	data;
+    int		i;
+    int		j;
+    int		k;
+    mapnode_t*	mn;
+    node_t*	no;
+	
     numnodes = W_LumpLength (lump) / sizeof(mapnode_t);
-    nodes = Z_Malloc (numnodes*sizeof(node_t),PU_LEVEL,0);
-    memset (nodes, 0, numnodes*sizeof(node_t));
+    nodes = Z_Malloc (numnodes*sizeof(node_t),PU_LEVEL,0);	
     data = W_CacheLumpNum (lump,PU_STATIC);
-
+	
     mn = (mapnode_t *)data;
     no = nodes;
-
-    for (i=0 ; i < numnodes ; i++, no++, mn++)
+    
+    for (i=0 ; i<numnodes ; i++, no++, mn++)
     {
-        no->x  = LE_SHORT(mn->x)  << FRACBITS;
-        no->y  = LE_SHORT(mn->y)  << FRACBITS;
-        no->dx = LE_SHORT(mn->dx) << FRACBITS;
-        no->dy = LE_SHORT(mn->dy) << FRACBITS;
-
-        for (j=0 ; j < 2 ; j++)
-        {
-            unsigned short childnum = LE_SHORT(mn->children[j]);
-
-            node_t * child;
-
-            if (childnum & NF_SUBSECTOR)
-            {
-                child = BSP_NewNode ();
-                child->sub = &subsectors[childnum ^ NF_SUBSECTOR];
-            }
-            else
-            {
-                child = &nodes[childnum];
-            }
-
-            if (j == 0)
-                no->right = child;
-            else
-                no->left = child;
-        }
+	no->x = LE_SHORT(mn->x)<<FRACBITS;
+	no->y = LE_SHORT(mn->y)<<FRACBITS;
+	no->dx = LE_SHORT(mn->dx)<<FRACBITS;
+	no->dy = LE_SHORT(mn->dy)<<FRACBITS;
+	for (j=0 ; j<2 ; j++)
+	{
+	    no->children[j] = LE_SHORT(mn->children[j]);
+	    for (k=0 ; k<4 ; k++)
+		no->bbox[j][k] = LE_SHORT(mn->bbox[j][k])<<FRACBITS;
+	}
     }
-
-    // the second pass handles the bounding boxes
-
-    mn = (mapnode_t *)data;
-    no = nodes;
-
-    for (i=0 ; i < numnodes ; i++, no++, mn++)
-    {
-        for (j=0 ; j < 2 ; j++)
-        {
-            node_t * child = (j == 0) ? no->right : no->left;
-
-            for (k=0 ; k < 4 ; k++)
-                child->bbox[k] = LE_SHORT(mn->bbox[j][k]) << FRACBITS;
-        }
-    }
-
+	
     W_ReleaseLumpNum(lump);
-
-    if (numnodes > 0)
-    {
-        root_node = &nodes[numnodes-1];
-    }
-    else
-    {
-        root_node = BSP_NewNode ();
-        root_node->sub = &subsectors[0];
-    }
 }
 
 
@@ -651,14 +594,16 @@
     line_t*		li;
     sector_t*		sector;
     subsector_t*	ss;
+    seg_t*		seg;
     fixed_t		bbox[4];
     int			block;
-
+	
     // look up sector number for each subsector
     ss = subsectors;
     for (i=0 ; i<numsubsectors ; i++, ss++)
     {
-	ss->sector = ss->segs->sidedef->sector;
+	seg = &segs[ss->firstline];
+	ss->sector = seg->sidedef->sector;
     }
 
     // count number of lines in each sector
@@ -904,9 +849,9 @@
     //          *WILL* desync otherwise.
     if (demoplayback || M_CheckParm("-nobsp") > 0)
     {
-        P_LoadSegs (lumpnum+ML_SEGS);
         P_LoadSubsectors (lumpnum+ML_SSECTORS);
         P_LoadNodes (lumpnum+ML_NODES);
+        P_LoadSegs (lumpnum+ML_SEGS);
     }
     else
     {
--