From ae1571158c059fbc72dd635b36e20006ef880dba Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 12 Mar 2016 17:43:36 +0100 Subject: [PATCH] - fixed: The portal link table was not created when there were no sector portals. - fixed: P_TryMove could loop endlessly over a list of static portals when there was an error during portal creation. --- src/gl/models/gl_models.cpp | 6 +++--- src/gl/scene/gl_sprite.cpp | 2 +- src/p_map.cpp | 12 +++++++++-- src/portal.cpp | 42 +++++++++++++++++-------------------- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/gl/models/gl_models.cpp b/src/gl/models/gl_models.cpp index ed717693d..508443e31 100644 --- a/src/gl/models/gl_models.cpp +++ b/src/gl/models/gl_models.cpp @@ -865,9 +865,9 @@ void gl_RenderModel(GLSprite * spr) // [BB] Workaround for the missing pitch information. if ( (smf->flags & MDL_PITCHFROMMOMENTUM) ) { - const double x = static_cast(spr->actor->velx); - const double y = static_cast(spr->actor->vely); - const double z = static_cast(spr->actor->velz); + const double x = static_cast(spr->actor->vel.x); + const double y = static_cast(spr->actor->vel.y); + const double z = static_cast(spr->actor->vel.z); // [BB] Calculate the pitch using spherical coordinates. if(z || x || y) pitch = float(atan( z/sqrt(x*x+y*y) ) / M_PI * 180); diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 01bc1717d..d8b3c019f 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -517,7 +517,7 @@ void GLSprite::Process(AActor* thing,sector_t * sector) if (viewz >= thingpos.z - 2 * FRACUNIT && viewz <= thingpos.z + thing->height + 2 * FRACUNIT) { // exclude vertically moving objects from this check. - if (!(thing->velx == 0 && thing->vely == 0 && thing->velz != 0)) + if (!(thing->vel.x == 0 && thing->vel.y == 0 && thing->vel.z != 0)) { if (!gl_FindModelFrame(thing->GetClass(), spritenum, thing->frame, false)) { diff --git a/src/p_map.cpp b/src/p_map.cpp index 9dc666468..ca8b7b751 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -2287,9 +2287,12 @@ bool P_TryMove(AActor *thing, fixed_t x, fixed_t y, { fixed_t bestfrac = FIXED_MAX; spechit_t besthit; + int besthitnum; // find the portal nearest to the crossing actor - for (auto &spec : portalhit) + for (unsigned i = 0; i < portalhit.Size();i++) { + auto &spec = portalhit[i]; + line_t *ld = spec.line; if (ld->frontsector->PortalGroup != thing->Sector->PortalGroup) continue; // must be in the same group to be considered valid. @@ -2305,12 +2308,14 @@ bool P_TryMove(AActor *thing, fixed_t x, fixed_t y, { besthit = spec; bestfrac = frac; + besthitnum = i; } } } if (bestfrac < FIXED_MAX) { + portalhit.Delete(besthitnum); line_t *ld = besthit.line; FLinePortal *port = ld->getPortal(); if (port->mType == PORTT_LINKED) @@ -2370,7 +2375,10 @@ bool P_TryMove(AActor *thing, fixed_t x, fixed_t y, } R_AddInterpolationPoint(hit); } - if (port->mType == PORTT_LINKED) continue; + if (port->mType == PORTT_LINKED) + { + continue; + } } break; } diff --git a/src/portal.cpp b/src/portal.cpp index 63dfeafe6..013403ba5 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -933,7 +933,7 @@ void P_CreateLinkedPortals() TThinkerIterator it; AStackPoint *mo; TArray orgs; - int id = 0; + int id = 1; bool bogus = false; while ((mo = it.Next())) @@ -952,36 +952,32 @@ void P_CreateLinkedPortals() } } } - if (orgs.Size() == 0) + if (orgs.Size() != 0) { - // Create the 0->0 translation which is always needed. - Displacements.Create(1); - return; - } - for (int i = 0; i < numsectors; i++) - { - for (int j = 0; j < 2; j++) + for (int i = 0; i < numsectors; i++) { - AActor *box = sectors[i].SkyBoxes[j]; - if (box != NULL && box->special1 == SKYBOX_LINKEDPORTAL) + for (int j = 0; j < 2; j++) { - secplane_t &plane = j == 0 ? sectors[i].floorplane : sectors[i].ceilingplane; - if (plane.a || plane.b) + AActor *box = sectors[i].SkyBoxes[j]; + if (box != NULL && box->special1 == SKYBOX_LINKEDPORTAL) { - // The engine cannot deal with portals on a sloped plane. - sectors[i].SkyBoxes[j] = NULL; - Printf("Portal on %s of sector %d is sloped and will be disabled\n", j==0? "floor":"ceiling", i); + secplane_t &plane = j == 0 ? sectors[i].floorplane : sectors[i].ceilingplane; + if (plane.a || plane.b) + { + // The engine cannot deal with portals on a sloped plane. + sectors[i].SkyBoxes[j] = NULL; + Printf("Portal on %s of sector %d is sloped and will be disabled\n", j == 0 ? "floor" : "ceiling", i); + } } } } - } - // Group all sectors, starting at each portal origin. - id = 1; - for (unsigned i = 0; i < orgs.Size(); i++) - { - if (CollectSectors(id, orgs[i]->Sector)) id++; - if (CollectSectors(id, orgs[i]->Mate->Sector)) id++; + // Group all sectors, starting at each portal origin. + for (unsigned i = 0; i < orgs.Size(); i++) + { + if (CollectSectors(id, orgs[i]->Sector)) id++; + if (CollectSectors(id, orgs[i]->Mate->Sector)) id++; + } } for (unsigned i = 0; i < linePortals.Size(); i++) {