- merged automap branch into trunk.
SVN r2609 (trunk)
This commit is contained in:
parent
9102200771
commit
9a4abe0915
47 changed files with 3355 additions and 609 deletions
133
src/p_setup.cpp
133
src/p_setup.cpp
|
|
@ -83,6 +83,8 @@ void P_ParseTextMap(MapData *map);
|
|||
extern int numinterpolations;
|
||||
extern unsigned int R_OldBlend;
|
||||
|
||||
EXTERN_CVAR(Bool, am_textured)
|
||||
|
||||
CVAR (Bool, genblockmap, false, CVAR_SERVERINFO|CVAR_GLOBALCONFIG);
|
||||
CVAR (Bool, gennodes, false, CVAR_SERVERINFO|CVAR_GLOBALCONFIG);
|
||||
CVAR (Bool, genglnodes, false, CVAR_SERVERINFO);
|
||||
|
|
@ -103,6 +105,7 @@ vertex_t* vertexes;
|
|||
|
||||
int numsegs;
|
||||
seg_t* segs;
|
||||
glsegextra_t* glsegextras;
|
||||
|
||||
int numsectors;
|
||||
sector_t* sectors;
|
||||
|
|
@ -122,6 +125,14 @@ side_t* sides;
|
|||
int numzones;
|
||||
zone_t* zones;
|
||||
|
||||
node_t * gamenodes;
|
||||
int numgamenodes;
|
||||
|
||||
subsector_t * gamesubsectors;
|
||||
int numgamesubsectors;
|
||||
|
||||
bool hasglnodes;
|
||||
|
||||
FExtraLight* ExtraLights;
|
||||
FLightStack* LightStacks;
|
||||
|
||||
|
|
@ -132,8 +143,6 @@ sidei_t *sidetemp;
|
|||
|
||||
TArray<int> linemap;
|
||||
|
||||
bool UsingGLNodes;
|
||||
|
||||
// BLOCKMAP
|
||||
// Created from axis aligned bounding box
|
||||
// of the map, a rectangular array of
|
||||
|
|
@ -152,7 +161,6 @@ fixed_t bmaporgx; // origin of block map
|
|||
fixed_t bmaporgy;
|
||||
|
||||
FBlockNode** blocklinks; // for thing chains
|
||||
|
||||
|
||||
|
||||
// REJECT
|
||||
|
|
@ -790,7 +798,6 @@ void P_LoadZSegs (FileReaderBase &data)
|
|||
segs[i].v2 = &vertexes[v2];
|
||||
segs[i].linedef = ldef = &lines[line];
|
||||
segs[i].sidedef = ldef->sidedef[side];
|
||||
segs[i].PartnerSeg = NULL;
|
||||
segs[i].frontsector = ldef->sidedef[side]->sector;
|
||||
if (ldef->flags & ML_TWOSIDED && ldef->sidedef[side^1] != NULL)
|
||||
{
|
||||
|
|
@ -846,14 +853,7 @@ void P_LoadGLZSegs (FileReaderBase &data, int type)
|
|||
{
|
||||
seg[-1].v2 = seg->v1;
|
||||
}
|
||||
if (partner == 0xFFFFFFFF)
|
||||
{
|
||||
seg->PartnerSeg = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
seg->PartnerSeg = &segs[partner];
|
||||
}
|
||||
glsegextras[seg - segs].PartnerSeg = partner;
|
||||
if (line != 0xFFFFFFFF)
|
||||
{
|
||||
line_t *ldef;
|
||||
|
|
@ -887,7 +887,7 @@ void P_LoadGLZSegs (FileReaderBase &data, int type)
|
|||
//
|
||||
//===========================================================================
|
||||
|
||||
static void LoadZNodes(FileReaderBase &data, int glnodes)
|
||||
void LoadZNodes(FileReaderBase &data, int glnodes)
|
||||
{
|
||||
// Read extra vertices added during node building
|
||||
DWORD orgVerts, newVerts;
|
||||
|
|
@ -956,6 +956,7 @@ static void LoadZNodes(FileReaderBase &data, int glnodes)
|
|||
numsegs = numSegs;
|
||||
segs = new seg_t[numsegs];
|
||||
memset (segs, 0, numsegs*sizeof(seg_t));
|
||||
glsegextras = NULL;
|
||||
|
||||
for (i = 0; i < numSubs; ++i)
|
||||
{
|
||||
|
|
@ -968,6 +969,7 @@ static void LoadZNodes(FileReaderBase &data, int glnodes)
|
|||
}
|
||||
else
|
||||
{
|
||||
glsegextras = new glsegextra_t[numsegs];
|
||||
P_LoadGLZSegs (data, glnodes);
|
||||
}
|
||||
|
||||
|
|
@ -1014,7 +1016,7 @@ static void LoadZNodes(FileReaderBase &data, int glnodes)
|
|||
}
|
||||
|
||||
|
||||
static void P_LoadZNodes (FileReader &dalump, DWORD id)
|
||||
void P_LoadZNodes (FileReader &dalump, DWORD id)
|
||||
{
|
||||
int type;
|
||||
bool compressed;
|
||||
|
|
@ -1162,7 +1164,6 @@ void P_LoadSegs (MapData * map)
|
|||
|
||||
li->v1 = &vertexes[vnum1];
|
||||
li->v2 = &vertexes[vnum2];
|
||||
li->PartnerSeg = NULL;
|
||||
|
||||
segangle = (WORD)LittleShort(ml->angle);
|
||||
|
||||
|
|
@ -2904,6 +2905,16 @@ static void P_GroupLines (bool buildmap)
|
|||
{
|
||||
subsectors[i].sector = subsectors[i].firstline->sidedef->sector;
|
||||
}
|
||||
if (glsegextras != NULL)
|
||||
{
|
||||
for (i = 0; i < numsubsectors; i++)
|
||||
{
|
||||
for (jj = 0; jj < subsectors[i].numlines; ++jj)
|
||||
{
|
||||
glsegextras[subsectors[i].firstline - segs + jj].Subsector = &subsectors[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
times[0].Unclock();
|
||||
|
||||
// count number of lines in each sector
|
||||
|
|
@ -3339,6 +3350,11 @@ void P_FreeLevelData ()
|
|||
delete[] segs;
|
||||
segs = NULL;
|
||||
}
|
||||
if (glsegextras != NULL)
|
||||
{
|
||||
delete[] glsegextras;
|
||||
glsegextras = NULL;
|
||||
}
|
||||
if (sectors != NULL)
|
||||
{
|
||||
delete[] sectors[0].e;
|
||||
|
|
@ -3346,6 +3362,18 @@ void P_FreeLevelData ()
|
|||
sectors = NULL;
|
||||
numsectors = 0; // needed for the pointer cleanup code
|
||||
}
|
||||
if (gamenodes && gamenodes!=nodes)
|
||||
{
|
||||
delete [] gamenodes;
|
||||
gamenodes = NULL;
|
||||
numgamenodes = 0;
|
||||
}
|
||||
if (gamesubsectors && gamesubsectors!=subsectors)
|
||||
{
|
||||
delete [] gamesubsectors;
|
||||
gamesubsectors = NULL;
|
||||
numgamesubsectors = 0;
|
||||
}
|
||||
if (subsectors != NULL)
|
||||
{
|
||||
for (int i = 0; i < numsubsectors; ++i)
|
||||
|
|
@ -3480,6 +3508,9 @@ void P_SetupLevel (char *lumpname, int position)
|
|||
int i;
|
||||
bool buildmap;
|
||||
|
||||
// This is motivated as follows:
|
||||
bool RequireGLNodes = am_textured;
|
||||
|
||||
for (i = 0; i < (int)countof(times); ++i)
|
||||
{
|
||||
times[i].Reset();
|
||||
|
|
@ -3537,6 +3568,7 @@ void P_SetupLevel (char *lumpname, int position)
|
|||
|
||||
// find map num
|
||||
level.lumpnum = map->lumpnum;
|
||||
hasglnodes = false;
|
||||
|
||||
// [RH] Support loading Build maps (because I felt like it. :-)
|
||||
buildmap = false;
|
||||
|
|
@ -3665,23 +3697,23 @@ void P_SetupLevel (char *lumpname, int position)
|
|||
{
|
||||
ForceNodeBuild = true;
|
||||
}
|
||||
bool reloop = false;
|
||||
|
||||
UsingGLNodes = false;
|
||||
if (!ForceNodeBuild)
|
||||
{
|
||||
// Check for compressed nodes first, then uncompressed nodes
|
||||
FWadLump test;
|
||||
DWORD id = MAKE_ID('X','x','X','x'), idcheck = 0, idcheck2 = 0, idcheck3 = 0, idcheck4 = 0;
|
||||
|
||||
if (map->MapLumps[ML_ZNODES].Size != 0 && !UsingGLNodes)
|
||||
if (map->MapLumps[ML_ZNODES].Size != 0)
|
||||
{
|
||||
// Test normal nodes first
|
||||
map->Seek(ML_ZNODES);
|
||||
idcheck = MAKE_ID('Z','N','O','D');
|
||||
idcheck2 = MAKE_ID('X','N','O','D');
|
||||
}
|
||||
else if (map->MapLumps[ML_GLZNODES].Size != 0)
|
||||
{
|
||||
// If normal nodes are not present but GL nodes are, use them.
|
||||
map->Seek(ML_GLZNODES);
|
||||
idcheck = MAKE_ID('Z','G','L','N');
|
||||
idcheck2 = MAKE_ID('Z','G','L','2');
|
||||
|
|
@ -3756,10 +3788,23 @@ void P_SetupLevel (char *lumpname, int position)
|
|||
else ForceNodeBuild = true;
|
||||
}
|
||||
else ForceNodeBuild = true;
|
||||
|
||||
// If loading the regular nodes failed try GL nodes before considering a rebuild
|
||||
if (ForceNodeBuild)
|
||||
{
|
||||
if (P_LoadGLNodes(map))
|
||||
{
|
||||
ForceNodeBuild=false;
|
||||
reloop = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else reloop = true;
|
||||
|
||||
unsigned int startTime=0, endTime=0;
|
||||
|
||||
if (ForceNodeBuild)
|
||||
{
|
||||
unsigned int startTime, endTime;
|
||||
|
||||
startTime = I_FPSTime ();
|
||||
TArray<FNodeBuilder::FPolyStart> polyspots, anchors;
|
||||
|
|
@ -3771,15 +3816,46 @@ void P_SetupLevel (char *lumpname, int position)
|
|||
lines, numlines
|
||||
};
|
||||
leveldata.FindMapBounds ();
|
||||
UsingGLNodes |= genglnodes;
|
||||
FNodeBuilder builder (leveldata, polyspots, anchors, UsingGLNodes);
|
||||
// We need GL nodes if am_textured is on.
|
||||
// In case a sync critical game mode is started, also build GL nodes to avoid problems
|
||||
// if the different machines' am_textured setting differs.
|
||||
bool BuildGLNodes = am_textured || multiplayer || demoplayback || demorecording || genglnodes;
|
||||
FNodeBuilder builder (leveldata, polyspots, anchors, BuildGLNodes);
|
||||
delete[] vertexes;
|
||||
builder.Extract (nodes, numnodes,
|
||||
segs, numsegs,
|
||||
segs, glsegextras, numsegs,
|
||||
subsectors, numsubsectors,
|
||||
vertexes, numvertexes);
|
||||
endTime = I_FPSTime ();
|
||||
DPrintf ("BSP generation took %.3f sec (%d segs)\n", (endTime - startTime) * 0.001, numsegs);
|
||||
reloop = true;
|
||||
}
|
||||
|
||||
// Copy pointers to the old nodes so that R_PointInSubsector can use them
|
||||
if (nodes && subsectors)
|
||||
{
|
||||
gamenodes = nodes;
|
||||
numgamenodes = numnodes;
|
||||
gamesubsectors = subsectors;
|
||||
numgamesubsectors = numsubsectors;
|
||||
}
|
||||
else
|
||||
{
|
||||
gamenodes=NULL;
|
||||
}
|
||||
|
||||
if (RequireGLNodes)
|
||||
{
|
||||
// Build GL nodes if we want a textured automap or GL nodes are forced to be built.
|
||||
// If the original nodes being loaded are not GL nodes they will be kept around for
|
||||
// use in P_PointInSubsector to avoid problems with maps that depend on the specific
|
||||
// nodes they were built with (P:AR E1M3 is a good example for a map where this is the case.)
|
||||
reloop |= P_CheckNodes(map, ForceNodeBuild, endTime - startTime);
|
||||
hasglnodes = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
hasglnodes = P_CheckForGLNodes();
|
||||
}
|
||||
|
||||
times[10].Clock();
|
||||
|
|
@ -3798,6 +3874,11 @@ void P_SetupLevel (char *lumpname, int position)
|
|||
P_FloodZones ();
|
||||
times[13].Unclock();
|
||||
|
||||
if (hasglnodes)
|
||||
{
|
||||
P_SetRenderSector();
|
||||
}
|
||||
|
||||
bodyqueslot = 0;
|
||||
// phares 8/10/98: Clear body queue so the corpses from previous games are
|
||||
// not assumed to be from this one.
|
||||
|
|
@ -3845,7 +3926,7 @@ void P_SetupLevel (char *lumpname, int position)
|
|||
P_SpawnSpecials ();
|
||||
|
||||
times[16].Clock();
|
||||
if (ForceNodeBuild) P_LoopSidedefs (false);
|
||||
if (reloop) P_LoopSidedefs (false);
|
||||
PO_Init (); // Initialize the polyobjs
|
||||
times[16].Unclock();
|
||||
|
||||
|
|
@ -3922,6 +4003,12 @@ void P_SetupLevel (char *lumpname, int position)
|
|||
}
|
||||
}
|
||||
MapThingsConverted.Clear();
|
||||
|
||||
if (glsegextras != NULL)
|
||||
{
|
||||
delete[] glsegextras;
|
||||
glsegextras = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue