diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 49f07a82d3..22b6636b5f 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,5 @@ September 6, 2009 (Changes by Graf Zahl) +- changed side_t's linenum into a linedef pointer. - Added PinkSilver's SetActorVelocity code submission (with optimizations.) September 5, 2009 diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index b69bb42955..06f42a3020 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -174,7 +174,7 @@ void DBaseDecal::SerializeChain (FArchive &arc, DBaseDecal **first) void DBaseDecal::GetXY (side_t *wall, fixed_t &ox, fixed_t &oy) const { - line_t *line = &lines[wall->linenum]; + line_t *line = wall->linedef; DWORD wallnum = DWORD(wall - sides); vertex_t *v1, *v2; @@ -234,7 +234,7 @@ FTextureID DBaseDecal::StickToWall (side_t *wall, fixed_t x, fixed_t y, F3DFloor line_t *line; FTextureID tex; - line = &lines[wall->linenum]; + line = wall->linedef; if (line->sidenum[0] == DWORD(wall - sides)) { front = line->frontsector; @@ -304,7 +304,7 @@ FTextureID DBaseDecal::StickToWall (side_t *wall, fixed_t x, fixed_t y, F3DFloor fixed_t DBaseDecal::GetRealZ (const side_t *wall) const { - const line_t *line = &lines[wall->linenum]; + const line_t *line = wall->linedef; const sector_t *front, *back; if (line->sidenum[0] == DWORD(wall - sides)) @@ -358,7 +358,7 @@ fixed_t DBaseDecal::GetRealZ (const side_t *wall) const void DBaseDecal::CalcFracPos (side_t *wall, fixed_t x, fixed_t y) { - line_t *line = &lines[wall->linenum]; + line_t *line = line = wall->linedef; DWORD wallnum = DWORD(wall - sides); vertex_t *v1, *v2; @@ -392,7 +392,7 @@ void DBaseDecal::CalcFracPos (side_t *wall, fixed_t x, fixed_t y) static void GetWallStuff (side_t *wall, vertex_t *&v1, fixed_t &ldx, fixed_t &ldy) { - line_t *line = &lines[wall->linenum]; + line_t *line = line = wall->linedef; if (line->sidenum[0] == DWORD(wall - sides)) { v1 = line->v1; @@ -414,7 +414,7 @@ static fixed_t Length (fixed_t dx, fixed_t dy) static side_t *NextWall (const side_t *wall) { - line_t *line = &lines[wall->linenum]; + line_t *line = line = wall->linedef;; DWORD wallnum = DWORD(wall - sides); if (line->sidenum[0] == wallnum) @@ -540,7 +540,7 @@ void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, fixed_t x, fix // Then try spreading right SpreadRight (rorg + DecalRight, wall, - Length (lines[wall->linenum].dx, lines[wall->linenum].dy), ffloor); + Length (wall->linedef->dx, wall->linedef->dy), ffloor); SpreadStack.Clear (); } diff --git a/src/p_buildmap.cpp b/src/p_buildmap.cpp index e44b724a53..ee1d442640 100644 --- a/src/p_buildmap.cpp +++ b/src/p_buildmap.cpp @@ -519,11 +519,11 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) if (walls[i].nextwall >= 0 && walls[i].nextwall <= i) { - sides[i].linenum = sides[walls[i].nextwall].linenum; + sides[i].linedef = sides[walls[i].nextwall].linedef; } else { - sides[i].linenum = numlines++; + sides[i].linedef = (line_t*)(intptr_t)(numlines++); } } @@ -538,7 +538,7 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) continue; } - j = sides[i].linenum; + j = int(intptr_t(sides[i].linedef)); lines[j].sidenum[0] = i; lines[j].sidenum[1] = walls[i].nextwall; lines[j].v1 = FindVertex (walls[i].x, walls[i].y); @@ -620,17 +620,20 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) slope.z[0] = slope.z[1] = slope.z[2] = -bsec->ceilingz; CalcPlane (slope, sectors[i].ceilingplane); } + int linenum = int(intptr_t(sides[bsec->wallptr].linedef)); if (bsec->floorstat & 64) { // floor is aligned to first wall - R_AlignFlat (sides[bsec->wallptr].linenum, - lines[sides[bsec->wallptr].linenum].sidenum[1] == (DWORD)bsec->wallptr, 0); + R_AlignFlat (linenum, lines[linenum].sidenum[1] == (DWORD)bsec->wallptr, 0); } if (bsec->ceilingstat & 64) { // ceiling is aligned to first wall - R_AlignFlat (sides[bsec->wallptr].linenum, - lines[sides[bsec->wallptr].linenum].sidenum[1] == (DWORD)bsec->wallptr, 0); + R_AlignFlat (linenum, lines[linenum].sidenum[1] == (DWORD)bsec->wallptr, 0); } } + for(i = 0; i < numsides; i++) + { + sides[i].linedef = &lines[intptr_t(sides[i].linedef)]; + } } //========================================================================== diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 1ce33214e9..0c10d9cae5 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -1867,8 +1867,8 @@ static void SetWallScroller (int id, int sidechoice, fixed_t dx, fixed_t dy, int { int wallnum = scroller->GetWallNum (); - if (wallnum >= 0 && lines[sides[wallnum].linenum].id == id && - lines[sides[wallnum].linenum].sidenum[sidechoice] == (DWORD)wallnum && + if (wallnum >= 0 && sides[wallnum].linedef->id == id && + sides[wallnum].linedef->sidenum[sidechoice] == (DWORD)wallnum && Where == scroller->GetScrollParts()) { scroller->Destroy (); @@ -1886,8 +1886,8 @@ static void SetWallScroller (int id, int sidechoice, fixed_t dx, fixed_t dy, int while ( (collect.Obj = iterator.Next ()) ) { if ((collect.RefNum = ((DScroller *)collect.Obj)->GetWallNum ()) != -1 && - lines[sides[collect.RefNum].linenum].id == id && - lines[sides[collect.RefNum].linenum].sidenum[sidechoice] == (DWORD)collect.RefNum && + sides[collect.RefNum].linedef->id == id && + sides[collect.RefNum].linedef->sidenum[sidechoice] == (DWORD)collect.RefNum && Where == ((DScroller *)collect.Obj)->GetScrollParts()) { ((DScroller *)collect.Obj)->SetRate (dx, dy); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 70e88c3554..b409e591bd 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -1755,13 +1755,13 @@ void P_FinishLoadingLineDef(line_t *ld, int alpha) if (ld->sidenum[0] != NO_SIDE) { - sides[ld->sidenum[0]].linenum = linenum; + sides[ld->sidenum[0]].linedef = ld; sides[ld->sidenum[0]].TexelLength = len; } if (ld->sidenum[1] != NO_SIDE) { - sides[ld->sidenum[1]].linenum = linenum; + sides[ld->sidenum[1]].linedef = ld; sides[ld->sidenum[1]].TexelLength = len; } @@ -2056,7 +2056,7 @@ static void P_LoopSidedefs () { // For each vertex, build a list of sidedefs that use that vertex // as their left edge. - line_t *line = &lines[sides[i].linenum]; + line_t *line = sides[i].linedef; int lineside = (line->sidenum[0] != (DWORD)i); int vert = int((lineside ? line->v2 : line->v1) - vertexes); @@ -2075,7 +2075,7 @@ static void P_LoopSidedefs () for (i = 0; i < numsides; ++i) { DWORD right; - line_t *line = &lines[sides[i].linenum]; + line_t *line = sides[i].linedef; // If the side's line only exists in a single sector, // then consider that line to be a self-contained loop @@ -2110,7 +2110,7 @@ static void P_LoopSidedefs () line_t *leftline, *rightline; angle_t ang1, ang2, ang; - leftline = &lines[sides[i].linenum]; + leftline = sides[i].linedef; ang1 = R_PointToAngle2 (0, 0, leftline->dx, leftline->dy); if (!sidetemp[i].b.lineside) { @@ -2121,7 +2121,7 @@ static void P_LoopSidedefs () { if (sides[right].LeftSide == NO_SIDE) { - rightline = &lines[sides[right].linenum]; + rightline = sides[right].linedef; if (rightline->frontsector != rightline->backsector) { ang2 = R_PointToAngle2 (0, 0, rightline->dx, rightline->dy); @@ -2332,7 +2332,7 @@ void P_LoadSideDefs2 (MapData * map) sd->SetTextureYOffset(LittleShort(msd->rowoffset)<SetTextureXScale(FRACUNIT); sd->SetTextureYScale(FRACUNIT); - sd->linenum = NO_INDEX; + sd->linedef = NULL; sd->Flags = 0; sd->Index = i; diff --git a/src/p_spec.cpp b/src/p_spec.cpp index e977a29999..e1145fdf3d 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -1146,8 +1146,8 @@ void DScroller::Tick () sides[m_Affectee].AddTextureXOffset(side_t::top, dx); sides[m_Affectee].AddTextureYOffset(side_t::top, dy); } - if (m_Parts & scw_mid && (lines[sides[m_Affectee].linenum].backsector == NULL || - !(lines[sides[m_Affectee].linenum].flags&ML_3DMIDTEX))) + if (m_Parts & scw_mid && (sides[m_Affectee].linedef->backsector == NULL || + !(sides[m_Affectee].linedef->flags&ML_3DMIDTEX))) { sides[m_Affectee].AddTextureXOffset(side_t::mid, dx); sides[m_Affectee].AddTextureYOffset(side_t::mid, dy); @@ -1226,8 +1226,8 @@ DScroller::DScroller (EScrollType type, fixed_t dx, fixed_t dy, { m_Interpolations[0] = sides[m_Affectee].SetInterpolation(side_t::top); } - if (m_Parts & scw_mid && (lines[sides[m_Affectee].linenum].backsector == NULL || - !(lines[sides[m_Affectee].linenum].flags&ML_3DMIDTEX))) + if (m_Parts & scw_mid && (sides[m_Affectee].linedef->backsector == NULL || + !(sides[m_Affectee].linedef->flags&ML_3DMIDTEX))) { m_Interpolations[1] = sides[m_Affectee].SetInterpolation(side_t::mid); } @@ -1298,8 +1298,8 @@ DScroller::DScroller (fixed_t dx, fixed_t dy, const line_t *l, { m_Interpolations[0] = sides[m_Affectee].SetInterpolation(side_t::top); } - if (m_Parts & scw_mid && (lines[sides[m_Affectee].linenum].backsector == NULL || - !(lines[sides[m_Affectee].linenum].flags&ML_3DMIDTEX))) + if (m_Parts & scw_mid && (sides[m_Affectee].linedef->backsector == NULL || + !(sides[m_Affectee].linedef->flags&ML_3DMIDTEX))) { m_Interpolations[1] = sides[m_Affectee].SetInterpolation(side_t::mid); } diff --git a/src/p_switch.cpp b/src/p_switch.cpp index 584e893c8c..cd2b65413f 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -576,7 +576,7 @@ bool P_ChangeSwitchTexture (side_t *side, int useAgain, BYTE special, bool *ques // facing a big sector (and which wasn't necessarily for the // button just activated, either). fixed_t pt[2]; - line_t *line = &lines[side->linenum]; + line_t *line = side->linedef; bool playsound; pt[0] = line->v1->x + (line->dx >> 1); diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index 298d2db68f..dedef053c4 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -1306,7 +1306,7 @@ struct UDMFParser { int mapside = lines[line].sidenum[sd]; sides[side] = ParsedSides[mapside]; - sides[side].linenum = line; + sides[side].linedef = &lines[line]; sides[side].sector = §ors[intptr_t(sides[side].sector)]; lines[line].sidenum[sd] = side; diff --git a/src/r_defs.h b/src/r_defs.h index 3c072803db..b4361adc35 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -156,6 +156,7 @@ public: // class DSectorEffect; struct sector_t; +struct line_t; struct FRemapTable; enum @@ -348,10 +349,6 @@ struct FExtraLight void InsertLight (const secplane_t &plane, line_t *line, int type); }; -// this substructure contains a few sector properties that are stored in dynamic arrays -// These must not be copied by R_FakeFlat etc. or bad things will happen. -struct sector_t; - struct FLinkedSector { sector_t *Sector; @@ -359,6 +356,8 @@ struct FLinkedSector }; +// this substructure contains a few sector properties that are stored in dynamic arrays +// These must not be copied by R_FakeFlat etc. or bad things will happen. struct extsector_t { // Boom sector transfer information @@ -747,7 +746,8 @@ struct side_t sector_t* sector; // Sector the SideDef is facing. DBaseDecal* AttachedDecals; // [RH] Decals bound to the wall part textures[3]; - DWORD linenum; + line_t *linedef; + //DWORD linenum; DWORD LeftSide, RightSide; // [RH] Group walls into loops WORD TexelLength; SWORD Light; diff --git a/src/r_segs.cpp b/src/r_segs.cpp index db076362a4..7fb5800c9c 100644 --- a/src/r_segs.cpp +++ b/src/r_segs.cpp @@ -1465,19 +1465,19 @@ int side_t::GetLightLevel (bool foggy, int baselight) const if (!(Flags & WALLF_NOFAKECONTRAST)) { if (((level.flags2 & LEVEL2_SMOOTHLIGHTING) || (Flags & WALLF_SMOOTHLIGHTING) || r_smoothlighting) && - lines[linenum].dx != 0) + linedef->dx != 0) { baselight += int // OMG LEE KILLOUGH LIVES! :/ ( (float(level.WallHorizLight) - +abs(atan(float(lines[linenum].dy)/float(lines[linenum].dx))/float(1.57079)) + +abs(atan(float(linedef->dy)/float(linedef->dx))/float(1.57079)) *float(level.WallVertLight - level.WallHorizLight)) ); } else { - baselight += lines[linenum].dx==0? level.WallVertLight : - lines[linenum].dy==0? level.WallHorizLight : 0; + baselight += linedef->dx==0? level.WallVertLight : + linedef->dy==0? level.WallHorizLight : 0; } } if (!(Flags & WALLF_ABSLIGHTING))