- changed line_t's sidenum into sidedef pointers.

SVN r1801 (trunk)
This commit is contained in:
Christoph Oelckers 2009-09-06 20:45:56 +00:00
commit 14a42bbada
28 changed files with 211 additions and 202 deletions

View file

@ -188,9 +188,6 @@ TArray<FMapThing> deathmatchstarts (16);
FMapThing playerstarts[MAXPLAYERS];
static void P_AllocateSideDefs (int count);
static void P_SetSideNum (DWORD *sidenum_p, WORD sidenum);
//===========================================================================
@ -583,7 +580,7 @@ static void SetTexture (side_t *side, int position, const char *name8)
{
for(int j = 0; j < 2; j++)
{
if (lines[i].sidenum[j] == (DWORD)(side - sides))
if (lines[i].sidedef[j] == side)
{
Printf("Unknown %s texture '%s' on %s side of linedef %d\n",
positionnames[position], name, sidenames[j], i);
@ -703,7 +700,7 @@ void P_FloodZone (sector_t *sec, int zonenum)
line_t *check = sec->lines[i];
sector_t *other;
if (check->sidenum[1] == NO_SIDE || (check->flags & ML_ZONEBOUNDARY))
if (check->sidedef[1] == NULL || (check->flags & ML_ZONEBOUNDARY))
continue;
if (check->frontsector == sec)
@ -790,12 +787,12 @@ void P_LoadZSegs (FileReaderZ &data)
segs[i].v1 = &vertexes[v1];
segs[i].v2 = &vertexes[v2];
segs[i].linedef = ldef = &lines[line];
segs[i].sidedef = &sides[ldef->sidenum[side]];
segs[i].sidedef = ldef->sidedef[side];
segs[i].PartnerSeg = NULL;
segs[i].frontsector = sides[ldef->sidenum[side]].sector;
if (ldef->flags & ML_TWOSIDED && ldef->sidenum[side^1] != NO_SIDE)
segs[i].frontsector = ldef->sidedef[side]->sector;
if (ldef->flags & ML_TWOSIDED && ldef->sidedef[side^1] != NULL)
{
segs[i].backsector = sides[ldef->sidenum[side^1]].sector;
segs[i].backsector = ldef->sidedef[side^1]->sector;
}
else
{
@ -860,11 +857,11 @@ void P_LoadGLZSegs (FileReaderZ &data, DWORD id)
line_t *ldef;
seg->linedef = ldef = &lines[line];
seg->sidedef = &sides[ldef->sidenum[side]];
seg->frontsector = sides[ldef->sidenum[side]].sector;
if (ldef->flags & ML_TWOSIDED && ldef->sidenum[side^1] != NO_SIDE)
seg->sidedef = ldef->sidedef[side];
seg->frontsector = ldef->sidedef[side]->sector;
if (ldef->flags & ML_TWOSIDED && ldef->sidedef[side^1] != NULL)
{
seg->backsector = sides[ldef->sidenum[side^1]].sector;
seg->backsector = ldef->sidedef[side^1]->sector;
}
else
{
@ -1152,17 +1149,17 @@ void P_LoadSegs (MapData * map)
ldef = &lines[linedef];
li->linedef = ldef;
side = LittleShort(ml->side);
if ((unsigned)ldef->sidenum[side] >= (unsigned)numsides)
if ((unsigned)(ldef->sidedef[side] - sides) >= (unsigned)numsides)
{
throw i * 4 + 2;
}
li->sidedef = &sides[ldef->sidenum[side]];
li->frontsector = sides[ldef->sidenum[side]].sector;
li->sidedef = ldef->sidedef[side];
li->frontsector = ldef->sidedef[side]->sector;
// killough 5/3/98: ignore 2s flag if second sidedef missing:
if (ldef->flags & ML_TWOSIDED && ldef->sidenum[side^1] != NO_SIDE)
if (ldef->flags & ML_TWOSIDED && ldef->sidedef[side^1] != NULL)
{
li->backsector = sides[ldef->sidenum[side^1]].sector;
li->backsector = ldef->sidedef[side^1]->sector;
}
else
{
@ -1718,20 +1715,20 @@ void P_SetLineID (line_t *ld)
void P_SaveLineSpecial (line_t *ld)
{
if (*ld->sidenum == NO_SIDE)
if (ld->sidedef[0] == NULL)
return;
DWORD sidenum = DWORD(ld->sidedef[0]-sides);
// killough 4/4/98: support special sidedef interpretation below
if ((ld->sidenum[0] != NO_SIDE) &&
// [RH] Save Static_Init only if it's interested in the textures
(ld->special != Static_Init || ld->args[1] == Init_Color))
// [RH] Save Static_Init only if it's interested in the textures
if (ld->special != Static_Init || ld->args[1] == Init_Color)
{
sidetemp[*ld->sidenum].a.special = ld->special;
sidetemp[*ld->sidenum].a.tag = ld->args[0];
sidetemp[sidenum].a.special = ld->special;
sidetemp[sidenum].a.tag = ld->args[0];
}
else
{
sidetemp[*ld->sidenum].a.special = 0;
sidetemp[sidenum].a.special = 0;
}
}
@ -1739,8 +1736,8 @@ void P_FinishLoadingLineDef(line_t *ld, int alpha)
{
bool additive = false;
ld->frontsector = ld->sidenum[0]!=NO_SIDE ? sides[ld->sidenum[0]].sector : 0;
ld->backsector = ld->sidenum[1]!=NO_SIDE ? sides[ld->sidenum[1]].sector : 0;
ld->frontsector = ld->sidedef[0] != NULL ? ld->sidedef[0]->sector : NULL;
ld->backsector = ld->sidedef[1] != NULL ? ld->sidedef[1]->sector : NULL;
float dx = FIXED2FLOAT(ld->v2->x - ld->v1->x);
float dy = FIXED2FLOAT(ld->v2->y - ld->v1->y);
int linenum = int(ld-lines);
@ -1753,16 +1750,16 @@ void P_FinishLoadingLineDef(line_t *ld, int alpha)
// [RH] Set some new sidedef properties
int len = (int)(sqrtf (dx*dx + dy*dy) + 0.5f);
if (ld->sidenum[0] != NO_SIDE)
if (ld->sidedef[0] != NULL)
{
sides[ld->sidenum[0]].linedef = ld;
sides[ld->sidenum[0]].TexelLength = len;
ld->sidedef[0]->linedef = ld;
ld->sidedef[0]->TexelLength = len;
}
if (ld->sidenum[1] != NO_SIDE)
if (ld->sidedef[1] != NULL)
{
sides[ld->sidenum[1]].linedef = ld;
sides[ld->sidenum[1]].TexelLength = len;
ld->sidedef[1]->linedef = ld;
ld->sidedef[1]->TexelLength = len;
}
switch (ld->special)
@ -1814,7 +1811,24 @@ void P_FinishLoadingLineDefs ()
{
for (int i = 0; i < numlines; i++)
{
P_FinishLoadingLineDef(&lines[i], sidetemp[lines[i].sidenum[0]].a.alpha);
P_FinishLoadingLineDef(&lines[i], sidetemp[lines[i].sidedef[0]-sides].a.alpha);
}
}
static void P_SetSideNum (side_t **sidenum_p, WORD sidenum)
{
if (sidenum == NO_INDEX)
{
*sidenum_p = NULL;
}
else if (sidecount < numsides)
{
sidetemp[sidecount].a.map = sidenum;
*sidenum_p = &sides[sidecount++];
}
else
{
I_Error ("%d sidedefs is not enough\n", sidecount);
}
}
@ -1886,8 +1900,8 @@ void P_LoadLineDefs (MapData * map)
ld->v2 = &vertexes[LittleShort(mld->v2)];
//ld->id = -1; ID has been assigned in P_TranslateLineDef
P_SetSideNum (&ld->sidenum[0], LittleShort(mld->sidenum[0]));
P_SetSideNum (&ld->sidenum[1], LittleShort(mld->sidenum[1]));
P_SetSideNum (&ld->sidedef[0], LittleShort(mld->sidenum[0]));
P_SetSideNum (&ld->sidedef[1], LittleShort(mld->sidenum[1]));
P_AdjustLine (ld);
P_SaveLineSpecial (ld);
@ -1963,8 +1977,8 @@ void P_LoadLineDefs2 (MapData * map)
ld->Alpha = FRACUNIT; // [RH] Opaque by default
ld->id = -1;
P_SetSideNum (&ld->sidenum[0], LittleShort(mld->sidenum[0]));
P_SetSideNum (&ld->sidenum[1], LittleShort(mld->sidenum[1]));
P_SetSideNum (&ld->sidedef[0], LittleShort(mld->sidenum[0]));
P_SetSideNum (&ld->sidedef[1], LittleShort(mld->sidenum[1]));
P_AdjustLine (ld);
P_SetLineID(ld);
@ -2013,22 +2027,6 @@ static void P_AllocateSideDefs (int count)
sidecount = 0;
}
static void P_SetSideNum (DWORD *sidenum_p, WORD sidenum)
{
if (sidenum == NO_INDEX)
{
*sidenum_p = NO_SIDE;
}
else if (sidecount < numsides)
{
sidetemp[sidecount].a.map = sidenum;
*sidenum_p = sidecount++;
}
else
{
I_Error ("%d sidedefs is not enough\n", sidecount);
}
}
// [RH] Group sidedefs into loops so that we can easily determine
// what walls any particular wall neighbors.
@ -2057,7 +2055,7 @@ static void P_LoopSidedefs ()
// For each vertex, build a list of sidedefs that use that vertex
// as their left edge.
line_t *line = sides[i].linedef;
int lineside = (line->sidenum[0] != (DWORD)i);
int lineside = (line->sidedef[0] != &sides[i]);
int vert = int((lineside ? line->v2 : line->v1) - vertexes);
sidetemp[i].b.lineside = lineside;
@ -2082,7 +2080,7 @@ static void P_LoopSidedefs ()
// instead of as part of another loop
if (line->frontsector == line->backsector)
{
right = line->sidenum[!sidetemp[i].b.lineside];
right = DWORD(line->sidedef[!sidetemp[i].b.lineside] - sides);
}
else
{