- merged automap branch into trunk.

SVN r2609 (trunk)
This commit is contained in:
Christoph Oelckers 2010-08-27 15:20:05 +00:00
commit 9a4abe0915
47 changed files with 3355 additions and 609 deletions

View file

@ -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;
}
}