diff --git a/src/edata.cpp b/src/edata.cpp index 8176e6a98..da41400a8 100644 --- a/src/edata.cpp +++ b/src/edata.cpp @@ -140,10 +140,10 @@ struct EDSector bool colorSet; // colormaptop//bottom cannot be used because ZDoom has no corresponding properties. - - FTransform planexform[2]; + double xoffs[2], yoffs[2]; + DAngle angle[2]; DWORD portalflags[2]; - fixed_t overlayalpha[2]; + double Overlayalpha[2]; }; static FString EDMap; @@ -275,7 +275,7 @@ static void parseSector(FScanner &sc) EDSector sec; memset(&sec, 0, sizeof(sec)); - sec.overlayalpha[sector_t::floor] = sec.overlayalpha[sector_t::ceiling] = OPAQUE; + sec.Overlayalpha[sector_t::floor] = sec.Overlayalpha[sector_t::ceiling] = 1.; sec.floorterrain = sec.ceilingterrain = -1; sc.MustGetStringName("{"); @@ -398,19 +398,19 @@ static void parseSector(FScanner &sc) { sc.CheckString("="); sc.MustGetFloat(); - sec.planexform[sector_t::floor].angle = FLOAT2ANGLE(sc.Float); + sec.angle[sector_t::floor] = sc.Float; } else if (sc.Compare("flooroffsetx")) { sc.CheckString("="); sc.MustGetFloat(); - sec.planexform[sector_t::floor].xoffs = FLOAT2FIXED(sc.Float); + sec.xoffs[sector_t::floor] = sc.Float; } else if (sc.Compare("flooroffsety")) { sc.CheckString("="); sc.MustGetFloat(); - sec.planexform[sector_t::floor].yoffs = FLOAT2FIXED(sc.Float); + sec.yoffs[sector_t::floor] = sc.Float; } else if (sc.Compare("ceilingterrain")) { @@ -422,19 +422,19 @@ static void parseSector(FScanner &sc) { sc.CheckString("="); sc.MustGetFloat(); - sec.planexform[sector_t::ceiling].angle = FLOAT2ANGLE(sc.Float); + sec.angle[sector_t::ceiling] = sc.Float; } else if (sc.Compare("ceilingoffsetx")) { sc.CheckString("="); sc.MustGetFloat(); - sec.planexform[sector_t::ceiling].xoffs = FLOAT2FIXED(sc.Float); + sec.xoffs[sector_t::ceiling] = sc.Float; } else if (sc.Compare("ceilingoffsety")) { sc.CheckString("="); sc.MustGetFloat(); - sec.planexform[sector_t::ceiling].yoffs = FLOAT2FIXED(sc.Float); + sec.yoffs[sector_t::ceiling] = sc.Float; } else if (sc.Compare("colormaptop") || sc.Compare("colormapbottom")) { @@ -464,14 +464,14 @@ static void parseSector(FScanner &sc) sc.MustGetNumber(); if (sc.CheckString("%")) sc.Float = sc.Number / 100.f; else sc.Float = sc.Number / 255.f; - sec.overlayalpha[sector_t::floor] = FLOAT2FIXED(sc.Float); + sec.Overlayalpha[sector_t::floor] = sc.Float; } else if (sc.Compare("ceiling")) { sc.MustGetFloat(); if (sc.CheckString("%")) sc.Float = sc.Number / 100.f; else sc.Float = sc.Number / 255.f; - sec.overlayalpha[sector_t::floor] = FLOAT2FIXED(sc.Float); + sec.Overlayalpha[sector_t::floor] = sc.Float; } } else if (sc.Compare("portalflags")) @@ -742,10 +742,10 @@ void ProcessEDSector(sector_t *sec, int recordnum) const DWORD pflagmask = PLANEF_DISABLED | PLANEF_NORENDER | PLANEF_NOPASS | PLANEF_BLOCKSOUND | PLANEF_ADDITIVE; for (int i = 0; i < 2; i++) { - sec->planes[i].xform.xoffs = esec->planexform[i].xoffs; - sec->planes[i].xform.yoffs = esec->planexform[i].yoffs; - sec->planes[i].xform.angle = esec->planexform[i].angle; - sec->planes[i].alpha = esec->overlayalpha[i]; + sec->SetXOffset(i, esec->xoffs[i]); + sec->SetYOffset(i, esec->yoffs[i]); + sec->SetAngle(i, esec->angle[i]); + sec->SetAlpha(i, esec->Overlayalpha[i]); sec->planes[i].Flags = (sec->planes[i].Flags & ~pflagmask) | esec->portalflags[i]; } } diff --git a/src/m_bbox.cpp b/src/m_bbox.cpp index 6baba2a56..be6721209 100644 --- a/src/m_bbox.cpp +++ b/src/m_bbox.cpp @@ -76,27 +76,27 @@ int FBoundingBox::BoxOnLineSide (const line_t *ld) const int p1; int p2; - if (ld->dx == 0) + if (ld->Delta().X == 0) { // ST_VERTICAL p1 = m_Box[BOXRIGHT] < ld->v1->fixX(); p2 = m_Box[BOXLEFT] < ld->v1->fixX(); - if (ld->dy < 0) + if (ld->Delta().Y < 0) { p1 ^= 1; p2 ^= 1; } } - else if (ld->dy == 0) + else if (ld->Delta().Y == 0) { // ST_HORIZONTAL: p1 = m_Box[BOXTOP] > ld->v1->fixY(); p2 = m_Box[BOXBOTTOM] > ld->v1->fixY(); - if (ld->dx < 0) + if (ld->Delta().X < 0) { p1 ^= 1; p2 ^= 1; } } - else if ((ld->dy ^ ld->dx) >= 0) + else if ((ld->Delta().X * ld->Delta().Y) >= 0) { // ST_POSITIVE: p1 = P_PointOnLineSide (m_Box[BOXLEFT], m_Box[BOXTOP], ld); p2 = P_PointOnLineSide (m_Box[BOXRIGHT], m_Box[BOXBOTTOM], ld); diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index ffdb7cec7..a029f7ad9 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -135,14 +135,12 @@ static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flag { ffloor->bottom.plane = &sec2->floorplane; ffloor->bottom.texture = &sec2->planes[sector_t::floor].Texture; - ffloor->bottom.texheight = &sec2->planes[sector_t::floor].TexZ; ffloor->bottom.isceiling = sector_t::floor; } else { ffloor->bottom.plane = &sec2->ceilingplane; ffloor->bottom.texture = &sec2->planes[sector_t::ceiling].Texture; - ffloor->bottom.texheight = &sec2->planes[sector_t::ceiling].TexZ; ffloor->bottom.isceiling = sector_t::ceiling; } @@ -150,7 +148,6 @@ static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flag { ffloor->top.plane = &sec2->ceilingplane; ffloor->top.texture = &sec2->planes[sector_t::ceiling].Texture; - ffloor->top.texheight = &sec2->planes[sector_t::ceiling].TexZ; ffloor->toplightlevel = &sec2->lightlevel; ffloor->top.isceiling = sector_t::ceiling; } @@ -158,7 +155,6 @@ static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flag { ffloor->top.plane = &sec->floorplane; ffloor->top.texture = &sec2->planes[sector_t::floor].Texture; - ffloor->top.texheight = &sec2->planes[sector_t::floor].TexZ; ffloor->toplightlevel = &sec->lightlevel; ffloor->top.isceiling = sector_t::floor; ffloor->top.model = sec; diff --git a/src/p_3dfloors.h b/src/p_3dfloors.h index 02e25f882..5268da0e2 100644 --- a/src/p_3dfloors.h +++ b/src/p_3dfloors.h @@ -68,7 +68,6 @@ struct F3DFloor { secplane_t * plane; const FTextureID * texture; - const fixed_t * texheight; sector_t * model; int isceiling; int vindex; diff --git a/src/p_glnodes.cpp b/src/p_glnodes.cpp index cc80296da..e4993a273 100644 --- a/src/p_glnodes.cpp +++ b/src/p_glnodes.cpp @@ -129,10 +129,10 @@ struct gl5_mapnode_t static int CheckForMissingSegs() { - float *added_seglen = new float[numsides]; + double *added_seglen = new double[numsides]; int missing = 0; - memset(added_seglen, 0, sizeof(float)*numsides); + memset(added_seglen, 0, sizeof(double)*numsides); for(int i=0;isidedef!=NULL) { // check all the segs and calculate the length they occupy on their sidedef - DVector2 vec1(seg->v2->fixX() - seg->v1->fixX(), seg->v2->fixY() - seg->v1->fixY()); - added_seglen[seg->sidedef - sides] += float(vec1.Length()); + DVector2 vec1(seg->v2->fX() - seg->v1->fX(), seg->v2->fY() - seg->v1->fY()); + added_seglen[seg->sidedef - sides] += vec1.Length(); } } for(int i=0;ilinedef; - - DVector2 lvec(line->dx, line->dy); - float linelen = float(lvec.Length()); - - missing += (added_seglen[i] < linelen - FRACUNIT); + double linelen = sides[i].linedef->Delta().Length(); + missing += (added_seglen[i] < linelen - 1.); } delete [] added_seglen; diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 2e6004a89..39953bf66 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -410,38 +410,37 @@ bool AActor::FixMapthingPos() continue; // Get the exact distance to the line - fdivline_t dll, dlv; - fixed_t linelen = (fixed_t)g_sqrt((double)ldef->dx*ldef->dx + (double)ldef->dy*ldef->dy); + divline_t dll, dlv; + double linelen = ldef->Delta().Length(); P_MakeDivline(ldef, &dll); - dlv.x = _f_X(); - dlv.y = _f_Y(); - dlv.dx = FixedDiv(dll.dy, linelen); - dlv.dy = -FixedDiv(dll.dx, linelen); + dlv.x = X(); + dlv.y = Y(); + dlv.dx = dll.dy / linelen; + dlv.dy = -dll.dx / linelen; - fixed_t distance = abs(P_InterceptVector(&dlv, &dll)); + double distance = fabs(P_InterceptVector(&dlv, &dll)); - if (distance < _f_radius()) + if (distance < radius) { - DPrintf("%s at (%d,%d) lies on %s line %td, distance = %f\n", - this->GetClass()->TypeName.GetChars(), _f_X() >> FRACBITS, _f_Y() >> FRACBITS, - ldef->dx == 0 ? "vertical" : ldef->dy == 0 ? "horizontal" : "diagonal", + DPrintf("%s at (%f,%f) lies on %s line %td, distance = %f\n", + this->GetClass()->TypeName.GetChars(), X(), Y(), + ldef->Delta().X == 0 ? "vertical" : ldef->Delta().Y == 0 ? "horizontal" : "diagonal", ldef - lines, FIXED2DBL(distance)); - angle_t finean = R_PointToAngle2(0, 0, ldef->dx, ldef->dy); + DAngle ang = ldef->Delta().Angle(); if (ldef->backsector != NULL && ldef->backsector == secstart) { - finean += ANGLE_90; + ang += 90.; } else { - finean -= ANGLE_90; + ang -= 90.; } - finean >>= ANGLETOFINESHIFT; // Get the distance we have to move the object away from the wall - distance = _f_radius() - distance; - SetXY(_f_X() + FixedMul(distance, finecosine[finean]), _f_Y() + FixedMul(distance, finesine[finean])); + distance = radius - distance; + SetXY(Pos().XY() + ang.ToVector(distance)); ClearInterpolation(); success = true; } @@ -1936,27 +1935,32 @@ int P_VanillaPointOnLineSide(fixed_t x, fixed_t y, const line_t* line) fixed_t dy; fixed_t left; fixed_t right; + DVector2 delta = line->Delta(); - if (!line->dx) + if (delta.X == 0) { if (x <= line->v1->fixX()) - return line->dy > 0; + return delta.Y > 0; - return line->dy < 0; + return delta.Y < 0; } - if (!line->dy) + if (delta.Y == 0) { if (y <= line->v1->fixY()) - return line->dx < 0; + return delta.X < 0; - return line->dx > 0; + return delta.X > 0; } + // Note: This cannot really be converted to floating point + // without breaking the intended use of this function + // (i.e. to emulate the horrible imprecision of the entire methpd) + dx = (x - line->v1->fixX()); dy = (y - line->v1->fixY()); - left = FixedMul ( line->dy>>FRACBITS , dx ); - right = FixedMul ( dy , line->dx>>FRACBITS ); + left = FixedMul ( int(delta.Y * 256) , dx ); + right = FixedMul ( dy , int(delta.X * 256) ); if (right < left) return 0; // front side diff --git a/src/p_maputl.h b/src/p_maputl.h index 56e5a7615..2a68898c1 100644 --- a/src/p_maputl.h +++ b/src/p_maputl.h @@ -53,12 +53,12 @@ inline int P_PointOnLineSide (fixed_t x, fixed_t y, const line_t *line) return i_compatflags2 & COMPATF2_POINTONLINE ? P_VanillaPointOnLineSide(x, y, line) - : DMulScale32 (y-line->v1->fixY(), line->dx, line->v1->fixX()-x, line->dy) > 0; + : DMulScale32 (y-line->v1->fixY(), line->fixDx(), line->v1->fixX()-x, line->fixDy()) > 0; } inline int P_PointOnLineSidePrecise (fixed_t x, fixed_t y, const line_t *line) { - return DMulScale32 (y-line->v1->fixY(), line->dx, line->v1->fixX()-x, line->dy) > 0; + return DMulScale32 (y-line->v1->fixY(), line->fixDx(), line->v1->fixX()-x, line->fixDy()) > 0; } inline int P_PointOnLineSide(double x, double y, const line_t *line) @@ -125,8 +125,8 @@ inline void P_MakeDivline (const line_t *li, fdivline_t *dl) { dl->x = li->v1->fixX(); dl->y = li->v1->fixY(); - dl->dx = li->dx; - dl->dy = li->dy; + dl->dx = li->fixDx(); + dl->dy = li->fixDy(); } inline void P_MakeDivline(const line_t *li, divline_t *dl) diff --git a/src/p_sectors.cpp b/src/p_sectors.cpp index 678828657..4533fb138 100644 --- a/src/p_sectors.cpp +++ b/src/p_sectors.cpp @@ -877,7 +877,7 @@ void sector_t::CheckPortalPlane(int plane) AActor *portal = SkyBoxes[plane]; if (!portal || portal->special1 != SKYBOX_LINKEDPORTAL) return; - double planeh = FIXED2DBL(planes[plane].TexZ); + double planeh = GetPlaneTexZF(plane); int obstructed = PLANEF_OBSTRUCTED * (plane == sector_t::floor ? planeh > portal->specialf1 : planeh < portal->specialf1); planes[plane].Flags = (planes[plane].Flags & ~PLANEF_OBSTRUCTED) | obstructed; @@ -1225,21 +1225,22 @@ int side_t::GetLightLevel (bool foggy, int baselight, bool is3dlight, int *pfake { if (!(Flags & WALLF_NOFAKECONTRAST) && r_fakecontrast != 0) { + DVector2 delta = linedef->Delta(); int rel; if (((level.flags2 & LEVEL2_SMOOTHLIGHTING) || (Flags & WALLF_SMOOTHLIGHTING) || r_fakecontrast == 2) && - linedef->dx != 0) + delta.X != 0) { rel = xs_RoundToInt // OMG LEE KILLOUGH LIVES! :/ ( level.WallHorizLight - + fabs(atan(double(linedef->dy) / linedef->dx) / 1.57079) + + fabs(atan(delta.Y / delta.X) / 1.57079) * (level.WallVertLight - level.WallHorizLight) ); } else { - rel = linedef->dx == 0 ? level.WallVertLight : - linedef->dy == 0 ? level.WallHorizLight : 0; + rel = delta.X == 0 ? level.WallVertLight : + delta.Y == 0 ? level.WallHorizLight : 0; } if (pfakecontrast != NULL) { diff --git a/src/p_setup.cpp b/src/p_setup.cpp index a2f4468ff..e751957d3 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -1903,8 +1903,7 @@ void P_AdjustLine (line_t *ld) v1 = ld->v1; v2 = ld->v2; - ld->dx = v2->fixX() - v1->fixX(); - ld->dy = v2->fixY() - v1->fixY(); + ld->setDelta(v2->fX() - v1->fX(), v2->fY() - v1->fY()); if (v1->fixX() < v2->fixX()) { @@ -2423,15 +2422,15 @@ static void P_LoopSidedefs (bool firstloop) if (sidetemp[right].b.next != NO_SIDE) { int bestright = right; // Shut up, GCC - angle_t bestang = ANGLE_MAX; + DAngle bestang = 360.; line_t *leftline, *rightline; - angle_t ang1, ang2, ang; + DAngle ang1, ang2, ang; leftline = sides[i].linedef; - ang1 = R_PointToAngle2 (0, 0, leftline->dx, leftline->dy); + ang1 = leftline->Delta().Angle(); if (!sidetemp[i].b.lineside) { - ang1 += ANGLE_180; + ang1 += 180; } while (right != NO_SIDE) @@ -2441,13 +2440,13 @@ static void P_LoopSidedefs (bool firstloop) rightline = sides[right].linedef; if (rightline->frontsector != rightline->backsector) { - ang2 = R_PointToAngle2 (0, 0, rightline->dx, rightline->dy); + ang2 = rightline->Delta().Angle(); if (sidetemp[right].b.lineside) { - ang2 += ANGLE_180; + ang2 += 180; } - ang = ang2 - ang1; + ang = (ang2 - ang1).Normalized360(); if (ang != 0 && ang <= bestang) { diff --git a/src/p_slopes.cpp b/src/p_slopes.cpp index 1da018281..49c9c5a35 100644 --- a/src/p_slopes.cpp +++ b/src/p_slopes.cpp @@ -79,14 +79,14 @@ static void P_SlopeLineToPoint (int lineid, fixed_t x, fixed_t y, fixed_t z, boo DVector3 p, v1, v2, cross; - p[0] = FIXED2DBL (line->v1->fixX()); - p[1] = FIXED2DBL (line->v1->fixY()); - p[2] = FIXED2DBL (plane->ZatPoint (line->v1->fixX(), line->v1->fixY())); - v1[0] = FIXED2DBL (line->dx); - v1[1] = FIXED2DBL (line->dy); - v1[2] = FIXED2DBL (plane->ZatPoint (line->v2->fixX(), line->v2->fixY())) - p[2]; - v2[0] = FIXED2DBL (x - line->v1->fixX()); - v2[1] = FIXED2DBL (y - line->v1->fixY()); + p[0] = line->v1->fX(); + p[1] = line->v1->fY(); + p[2] = plane->ZatPointF (line->v1); + v1[0] = line->Delta().X; + v1[1] = line->Delta().Y; + v1[2] = plane->ZatPointF (line->v2) - p[2]; + v2[0] = FIXED2DBL (x) - p[0]; + v2[1] = FIXED2DBL (y) - p[1]; v2[2] = FIXED2DBL (z) - p[2]; cross = v1 ^ v2; @@ -487,8 +487,8 @@ static void P_AlignPlane (sector_t *sec, line_t *line, int which) vert = (*probe++)->v2; else vert = (*probe)->v1; - dist = fabs((double(line->v1->fixY()) - vert->fixY()) * line->dx - - (double(line->v1->fixX()) - vert->fixX()) * line->dy); + dist = fabs((double(line->v1->fixY()) - vert->fixY()) * line->fixDx() - + (double(line->v1->fixX()) - vert->fixX()) * line->fixDy()); if (dist > bestdist) { @@ -508,14 +508,14 @@ static void P_AlignPlane (sector_t *sec, line_t *line, int which) srcheight = (which == 0) ? sec->GetPlaneTexZ(sector_t::floor) : sec->GetPlaneTexZ(sector_t::ceiling); destheight = (which == 0) ? refsec->GetPlaneTexZ(sector_t::floor) : refsec->GetPlaneTexZ(sector_t::ceiling); - p[0] = FIXED2DBL (line->v1->fixX()); - p[1] = FIXED2DBL(line->v1->fixY()); + p[0] = line->v1->fX(); + p[1] = line->v1->fY(); p[2] = FIXED2DBL(destheight); - v1[0] = FIXED2DBL(line->dx); - v1[1] = FIXED2DBL(line->dy); + v1[0] = line->Delta().X; + v1[1] = line->Delta().Y; v1[2] = 0; - v2[0] = FIXED2DBL(refvert->fixX() - line->v1->fixX()); - v2[1] = FIXED2DBL(refvert->fixY() - line->v1->fixY()); + v2[0] = refvert->fX() - line->v1->fX(); + v2[1] = refvert->fY() - line->v1->fY(); v2[2] = FIXED2DBL(srcheight - destheight); cross = (v1 ^ v2).Unit(); diff --git a/src/po_man.cpp b/src/po_man.cpp index 7fbef05f2..5d397c724 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -943,8 +943,9 @@ void FPolyObj::UpdateBBox () } // Update the line's slopetype - line->dx = line->v2->fixX() - line->v1->fixX(); - line->dy = line->v2->fixY() - line->v1->fixY(); + line->setDelta( + line->v2->fixX() - line->v1->fixX(), + line->v2->fixY() - line->v1->fixY()); } CalcCenter(); } diff --git a/src/portal.cpp b/src/portal.cpp index 3b31284f1..a4d46c5f0 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -251,10 +251,10 @@ static void SetRotation(FLinePortal *port) { line_t *dst = port->mDestination; line_t *line = port->mOrigin; - double angle = g_atan2(dst->dy, dst->dx) - g_atan2(line->dy, line->dx) + M_PI; - port->mSinRot = FLOAT2FIXED(g_sin(angle)); - port->mCosRot = FLOAT2FIXED(g_cos(angle)); - port->mAngleDiff = ToDegrees(angle); + DAngle angle = dst->Delta().Angle() - line->Delta().Angle() + 180.; + port->mSinRot = FLOAT2FIXED(angle.Sin()); + port->mCosRot = FLOAT2FIXED(angle.Cos()); + port->mAngleDiff = angle; } } @@ -513,7 +513,7 @@ inline int P_PointOnLineSideExplicit (fixed_t x, fixed_t y, fixed_t x1, fixed_t inline int P_GetLineSide(fixed_t x, fixed_t y, const line_t *line) { - return DMulScale32(y - line->v1->fixY(), line->dx, line->v1->fixX() - x, line->dy); + return DMulScale32(y - line->v1->fixY(), line->fixDx(), line->v1->fixX() - x, line->fixDy()); } bool P_ClipLineToPortal(line_t* line, line_t* portal, fixed_t viewx, fixed_t viewy, bool partial, bool samebehind) @@ -652,7 +652,7 @@ void P_TranslatePortalZ(line_t* src, fixed_t& z) fixed_t P_PointLineDistance(line_t* line, fixed_t x, fixed_t y) { - angle_t angle = R_PointToAngle2(0, 0, line->dx, line->dy); + angle_t angle = R_PointToAngle2(0, 0, line->fixDx(), line->fixDy()); angle += ANGLE_180; fixed_t dx = line->v1->fixX() - x; diff --git a/src/r_defs.h b/src/r_defs.h index 84a938747..95b4ce92c 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -449,6 +449,11 @@ public: return FixedMul (ic, -d - DMulScale16 (a, v->fixX(), b, v->fixY())); } + double ZatPointF(const vertex_t *v) const + { + return FIXED2DBL(FixedMul(ic, -d - DMulScale16(a, v->fixX(), b, v->fixY()))); + } + fixed_t ZatPoint (const AActor *ac) const { return FixedMul (ic, -d - DMulScale16 (a, ac->_f_X(), b, ac->_f_Y())); @@ -772,6 +777,11 @@ struct sector_t planes[pos].xform.xoffs = o; } + void SetXOffset(int pos, double o) + { + planes[pos].xform.xoffs = FLOAT2FIXED(o); + } + void AddXOffset(int pos, fixed_t o) { planes[pos].xform.xoffs += o; @@ -797,6 +807,11 @@ struct sector_t planes[pos].xform.yoffs = o; } + void SetYOffset(int pos, double o) + { + planes[pos].xform.yoffs = FLOAT2FIXED(o); + } + void AddYOffset(int pos, fixed_t o) { planes[pos].xform.yoffs += o; @@ -866,6 +881,11 @@ struct sector_t planes[pos].xform.angle = o; } + void SetAngle(int pos, DAngle o) + { + planes[pos].xform.angle = o.BAMs(); + } + angle_t GetAngle(int pos, bool addbase = true) const { if (!addbase) @@ -976,12 +996,22 @@ struct sector_t if (dirtify) SetAllVerticesDirty(); } + void SetPlaneTexZ(int pos, double val) + { + planes[pos].TexZ = FLOAT2FIXED(val); + } + void ChangePlaneTexZ(int pos, fixed_t val) { planes[pos].TexZ += val; SetAllVerticesDirty(); } + void ChangePlaneTexZ(int pos, double val) + { + planes[pos].TexZ += FLOAT2FIXED(val); + } + static inline short ClampLight(int level) { return (short)clamp(level, SHRT_MIN, SHRT_MAX); @@ -1423,7 +1453,9 @@ FArchive &operator<< (FArchive &arc, side_t::part &p); struct line_t { vertex_t *v1, *v2; // vertices, from v1 to v2 +private: fixed_t dx, dy; // precalculated v2 - v1 for side checking +public: DWORD flags; DWORD activation; // activation type int special; @@ -1452,6 +1484,28 @@ struct line_t return{ FIXED2DBL(dx), FIXED2DBL(dy) }; } + fixed_t fixDx() const + { + return dx; + } + + fixed_t fixDy() const + { + return dy; + } + + void setDelta(fixed_t x, fixed_t y) + { + dx = x; + dy = y; + } + + void setDelta(double x, double y) + { + dx = FLOAT2FIXED(x); + dy = FLOAT2FIXED(y); + } + FLinePortal *getPortal() const { return portalindex >= linePortals.Size() ? (FLinePortal*)NULL : &linePortals[portalindex]; diff --git a/src/r_main.cpp b/src/r_main.cpp index 56945f406..599eb738e 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -702,11 +702,11 @@ void R_EnterPortal (PortalDrawseg* pds, int depth) vertex_t *v1 = pds->src->v1; // Reflect the current view behind the mirror. - if (pds->src->dx == 0) + if (pds->src->Delta().X == 0) { // vertical mirror viewx = v1->fixX() - startx + v1->fixX(); } - else if (pds->src->dy == 0) + else if (pds->src->Delta().Y == 0) { // horizontal mirror viewy = v1->fixY() - starty + v1->fixY(); }