From 29b0106a961a766d94642ea507184fe1d27403e1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 7 May 2021 00:09:30 +0200 Subject: [PATCH] - fixed yet another problem with the local 'sprite' variables in HWWall causing problems. This variable and its companions in HWFlat and HWSprite have now been renamed to avoid these issues. --- source/core/rendering/scene/hw_drawlist.cpp | 34 +++++++++---------- .../core/rendering/scene/hw_drawlistadd.cpp | 6 ++-- source/core/rendering/scene/hw_drawstructs.h | 6 ++-- source/core/rendering/scene/hw_flats.cpp | 20 +++++------ source/core/rendering/scene/hw_sprites.cpp | 6 ++-- source/core/rendering/scene/hw_walls.cpp | 13 +++---- 6 files changed, 43 insertions(+), 42 deletions(-) diff --git a/source/core/rendering/scene/hw_drawlist.cpp b/source/core/rendering/scene/hw_drawlist.cpp index 64f67a725..5ec6df07f 100644 --- a/source/core/rendering/scene/hw_drawlist.cpp +++ b/source/core/rendering/scene/hw_drawlist.cpp @@ -251,8 +251,8 @@ void HWDrawList::SortPlaneIntoPlane(SortNode * head,SortNode * sort) if (fh->z == fs->z) { // Make sure we have consistent ordering with two floor sprites of the same distance if they overlap - int time1 = fh->sprite ? fh->sprite->time : -1; - int time2 = fs->sprite ? fs->sprite->time : -1; + int time1 = fh->Sprite ? fh->Sprite->time : -1; + int time2 = fs->Sprite ? fs->Sprite->time : -1; if (time1 == time2) head->AddToEqual(sort); else if (time2 < time1)head->AddToLeft(sort); else head->AddToRight(sort); @@ -404,8 +404,8 @@ void HWDrawList::SortWallIntoWall(HWDrawInfo *di, SortNode * head,SortNode * sor if (fabs(v1)sprite ? wh->sprite->time : -1; - int time2 = ws->sprite ? ws->sprite->time : -1; + int time1 = wh->Sprite ? wh->Sprite->time : -1; + int time2 = ws->Sprite ? ws->Sprite->time : -1; if ((ws->type==RENDERWALL_FOGBOUNDARY && wh->type!=RENDERWALL_FOGBOUNDARY) || time2 < time1) { @@ -591,7 +591,7 @@ inline int HWDrawList::CompareSprites(SortNode * a,SortNode * b) if (s1->depth < s2->depth) return 1; if (s1->depth > s2->depth) return -1; - return s1->sprite->time - s2->sprite->time; + return s1->Sprite->time - s2->Sprite->time; } //========================================================================== @@ -737,8 +737,8 @@ void HWDrawList::SortWallsVert(HWDrawInfo* di) HWWall* w1 = walls[a.index]; HWWall* w2 = walls[b.index]; if (w1->glseg.y1 != w2->glseg.y1) return w1->glseg.y1 < w2->glseg.y1; - int time1 = w1->sprite ? w1->sprite->time : -1; - int time2 = w2->sprite ? w2->sprite->time : -1; + int time1 = w1->Sprite ? w1->Sprite->time : -1; + int time2 = w2->Sprite ? w2->Sprite->time : -1; return time1 < time2; }); @@ -747,8 +747,8 @@ void HWDrawList::SortWallsVert(HWDrawInfo* di) HWWall* w1 = walls[a.index]; HWWall* w2 = walls[b.index]; if (w1->glseg.y1 != w2->glseg.y1) return w1->glseg.y1 > w2->glseg.y1; - int time1 = w1->sprite ? w1->sprite->time : -1; - int time2 = w2->sprite ? w2->sprite->time : -1; + int time1 = w1->Sprite ? w1->Sprite->time : -1; + int time2 = w2->Sprite ? w2->Sprite->time : -1; return time1 < time2; }); @@ -784,8 +784,8 @@ void HWDrawList::SortWallsHorz(HWDrawInfo* di) HWWall* w1 = walls[a.index]; HWWall* w2 = walls[b.index]; if (w1->glseg.x1 != w2->glseg.x1) return w1->glseg.x1 < w2->glseg.x1; - int time1 = w1->sprite ? w1->sprite->time : -1; - int time2 = w2->sprite ? w2->sprite->time : -1; + int time1 = w1->Sprite ? w1->Sprite->time : -1; + int time2 = w2->Sprite ? w2->Sprite->time : -1; return time1 < time2; }); @@ -794,8 +794,8 @@ void HWDrawList::SortWallsHorz(HWDrawInfo* di) HWWall* w1 = walls[a.index]; HWWall* w2 = walls[b.index]; if (w1->glseg.x1 != w2->glseg.x1) return w1->glseg.x1 > w2->glseg.x1; - int time1 = w1->sprite ? w1->sprite->time : -1; - int time2 = w2->sprite ? w2->sprite->time : -1; + int time1 = w1->Sprite ? w1->Sprite->time : -1; + int time2 = w2->Sprite ? w2->Sprite->time : -1; return time1 < time2; }); @@ -831,8 +831,8 @@ void HWDrawList::SortFlats(HWDrawInfo* di) HWFlat* w1 = flats[a.index]; HWFlat* w2 = flats[b.index]; if (w1->z != w2->z) return w1->z < w2->z; - int time1 = w1->sprite ? w1->sprite->time : -1; - int time2 = w2->sprite ? w2->sprite->time : -1; + int time1 = w1->Sprite ? w1->Sprite->time : -1; + int time2 = w2->Sprite ? w2->Sprite->time : -1; return time1 < time2; }); @@ -841,8 +841,8 @@ void HWDrawList::SortFlats(HWDrawInfo* di) HWFlat* w1 = flats[a.index]; HWFlat* w2 = flats[b.index]; if (w1->z != w2->z) return w2->z < w1->z; - int time1 = w1->sprite ? w1->sprite->time : -1; - int time2 = w2->sprite ? w2->sprite->time : -1; + int time1 = w1->Sprite ? w1->Sprite->time : -1; + int time2 = w2->Sprite ? w2->Sprite->time : -1; return time1 < time2; }); diff --git a/source/core/rendering/scene/hw_drawlistadd.cpp b/source/core/rendering/scene/hw_drawlistadd.cpp index 69fb35222..59a6a6f47 100644 --- a/source/core/rendering/scene/hw_drawlistadd.cpp +++ b/source/core/rendering/scene/hw_drawlistadd.cpp @@ -50,7 +50,7 @@ void HWDrawInfo::AddWall(HWWall *wall) int list; if (wall->type != RENDERWALL_M2S) list = GLDL_PLAINWALLS; - else if (wall->sprite == nullptr) list = GLDL_MASKEDWALLS; + else if (wall->Sprite == nullptr) list = GLDL_MASKEDWALLS; else if (wall->glseg.x1 == wall->glseg.x2) list = GLDL_MASKEDWALLSV; else if (wall->glseg.y1 == wall->glseg.y2) list = GLDL_MASKEDWALLSH; else list = GLDL_MASKEDWALLSS; @@ -98,11 +98,11 @@ void HWDrawInfo::AddFlat(HWFlat *flat) if (flat->RenderStyle != LegacyRenderStyles[STYLE_Translucent] || flat->alpha < 1.f - FLT_EPSILON || checkTranslucentReplacement(flat->texture->GetID(), flat->palette)) { // translucent portals go into the translucent border list. - list = flat->sprite? GLDL_TRANSLUCENT : GLDL_TRANSLUCENTBORDER; + list = flat->Sprite? GLDL_TRANSLUCENT : GLDL_TRANSLUCENTBORDER; } else { - list = flat->sprite ? GLDL_MASKEDFLATS : GLDL_PLAINFLATS; + list = flat->Sprite ? GLDL_MASKEDFLATS : GLDL_PLAINFLATS; } auto newflat = drawlists[list].NewFlat(); *newflat = *flat; diff --git a/source/core/rendering/scene/hw_drawstructs.h b/source/core/rendering/scene/hw_drawstructs.h index 244bb39e1..f5658b8f3 100644 --- a/source/core/rendering/scene/hw_drawstructs.h +++ b/source/core/rendering/scene/hw_drawstructs.h @@ -185,7 +185,7 @@ public: public: walltype* seg; - spritetype* sprite; + spritetype* Sprite; sectortype* frontsector, * backsector; //private: @@ -251,7 +251,7 @@ class HWFlat public: int section; sectortype * sec; - spritetype* sprite; // for flat sprites. + spritetype* Sprite; // for flat sprites. FGameTexture *texture; float z; // the z position of the flat (only valid for non-sloped planes) @@ -294,7 +294,7 @@ class HWSprite { public: - spritetype* sprite; + spritetype* Sprite; PalEntry fade; int shade, palette; float visibility; diff --git a/source/core/rendering/scene/hw_flats.cpp b/source/core/rendering/scene/hw_flats.cpp index 3b1257d5e..cd8cdeeb7 100644 --- a/source/core/rendering/scene/hw_flats.cpp +++ b/source/core/rendering/scene/hw_flats.cpp @@ -96,7 +96,7 @@ void HWFlat::MakeVertices() { if (vertcount > 0) return; bool canvas = texture->isHardwareCanvas(); - if (sprite == nullptr) + if (Sprite == nullptr) { auto mesh = sectorGeometry.get(section, plane, geoofs); if (!mesh) return; @@ -117,12 +117,12 @@ void HWFlat::MakeVertices() else { vec2_t pos[4]; - GetFlatSpritePosition(sprite, sprite->pos.vec2, pos, true); + GetFlatSpritePosition(Sprite, Sprite->pos.vec2, pos, true); auto ret = screen->mVertexData->AllocVertices(6); auto vp = ret.first; - float x = !(sprite->cstat & CSTAT_SPRITE_XFLIP) ? 0.f : 1.f; - float y = !(sprite->cstat & CSTAT_SPRITE_YFLIP) ? 0.f : 1.f; + float x = !(Sprite->cstat & CSTAT_SPRITE_XFLIP) ? 0.f : 1.f; + float y = !(Sprite->cstat & CSTAT_SPRITE_YFLIP) ? 0.f : 1.f; for (unsigned i = 0; i < 6; i++) { const static unsigned indices[] = { 0, 1, 2, 0, 2, 3 }; @@ -144,7 +144,7 @@ void HWFlat::MakeVertices() //========================================================================== void HWFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent) { - if (screen->BuffersArePersistent() && !sprite) + if (screen->BuffersArePersistent() && !Sprite) { MakeVertices(); } @@ -156,7 +156,7 @@ void HWFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent) } #endif - if (!sprite) + if (!Sprite) { auto mesh = sectorGeometry.get(section, plane, geoofs); state.SetNormal(mesh->normal); @@ -182,7 +182,7 @@ void HWFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent) if (texture && !checkTranslucentReplacement(texture->GetID(), palette)) state.AlphaFunc(Alpha_GEqual, texture->alphaThreshold); else state.AlphaFunc(Alpha_GEqual, 0.f); } - state.SetMaterial(texture, UF_Texture, 0, sprite == nullptr? CLAMP_NONE : CLAMP_XY, TRANSLATION(Translation_Remap + curbasepal, palette), -1); + state.SetMaterial(texture, UF_Texture, 0, Sprite == nullptr? CLAMP_NONE : CLAMP_XY, TRANSLATION(Translation_Remap + curbasepal, palette), -1); state.SetLightIndex(dynlightindex); state.Draw(DT_Triangles, vertindex, vertcount); @@ -208,7 +208,7 @@ void HWFlat::PutFlat(HWDrawInfo *di, int whichplane) { vertcount = 0; plane = whichplane; - if (!screen->BuffersArePersistent() || sprite || di->ingeo) // should be made static buffer content later (when the logic is working) + if (!screen->BuffersArePersistent() || Sprite || di->ingeo) // should be made static buffer content later (when the logic is working) { #if 0 if (di->Level->HasDynamicLights && texture != nullptr && !di->isFullbrightScene() && !(hacktype & (SSRF_PLANEHACK | SSRF_FLOODHACK))) @@ -250,7 +250,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sectortype * frontsector, int section visibility = sectorVisibility(frontsector); sec = frontsector; section = section_; - sprite = nullptr; + Sprite = nullptr; geoofs = di->geoofs; // @@ -352,7 +352,7 @@ void HWFlat::ProcessFlatSprite(HWDrawInfo* di, spritetype* sprite, sectortype* s if (texture && texture->isValid()) { - this->sprite = sprite; + this->Sprite = sprite; sec = sector; shade = sprite->shade; palette = sprite->pal; diff --git a/source/core/rendering/scene/hw_sprites.cpp b/source/core/rendering/scene/hw_sprites.cpp index 31ec01a47..e55eda495 100644 --- a/source/core/rendering/scene/hw_sprites.cpp +++ b/source/core/rendering/scene/hw_sprites.cpp @@ -315,7 +315,7 @@ void HWSprite::Process(HWDrawInfo* di, spritetype* spr, sectortype* sector, int if (!tex || !tex->isValid()) return; texture = tex; - sprite = spr; + Sprite = spr; modelframe = 0; dynlightindex = -1; @@ -442,7 +442,7 @@ void HWSprite::Process(HWDrawInfo* di, spritetype* spr, sectortype* sector, int bool HWSprite::ProcessVoxel(HWDrawInfo* di, voxmodel_t* vox, spritetype* spr, sectortype* sector, bool rotate) { - sprite = spr; + Sprite = spr; auto sprext = &spriteext[spr->owner]; texture = nullptr; @@ -528,7 +528,7 @@ bool HWSprite::ProcessVoxel(HWDrawInfo* di, voxmodel_t* vox, spritetype* spr, se auto vp = di->Viewpoint; depth = (float)((x - vp.Pos.X) * vp.TanCos + (y - vp.Pos.Y) * vp.TanSin); - PutSprite(di, spriteHasTranslucency(sprite)); + PutSprite(di, spriteHasTranslucency(Sprite)); rendered_sprites++; return true; } diff --git a/source/core/rendering/scene/hw_walls.cpp b/source/core/rendering/scene/hw_walls.cpp index 1bdc3a944..76288447d 100644 --- a/source/core/rendering/scene/hw_walls.cpp +++ b/source/core/rendering/scene/hw_walls.cpp @@ -158,7 +158,7 @@ void HWWall::RenderTexturedWall(HWDrawInfo *di, FRenderState &state, int rflags) SetLightAndFog(state, fade, palette, shade, visibility, alpha); state.SetMaterial(texture, UF_Texture, 0, (flags & (HWF_CLAMPX | HWF_CLAMPY)), TRANSLATION(Translation_Remap + curbasepal, palette), -1); - if (sprite == nullptr) + if (Sprite == nullptr) { int h = (int)texture->GetDisplayHeight(); int h2 = 1 << sizeToBits(h); @@ -479,7 +479,8 @@ void HWWall::PutPortal(HWDrawInfo *di, int ptype, int plane) case PORTALTYPE_LINETOSPRITE: // These are also unique. - portal = new HWLineToSpritePortal(&portalState, seg, &sprite[seg->portalnum]); + assert(seg->portalnum >= 0 && seg->portalnum < MAXSPRITES); + portal = new HWLineToSpritePortal(&portalState, seg, &::sprite[seg->portalnum]); di->Portals.Push(portal); portal->AddLine(this); break; @@ -866,7 +867,7 @@ void HWWall::Process(HWDrawInfo* di, walltype* wal, sectortype* frontsector, sec this->seg = wal; this->frontsector = frontsector; this->backsector = backsector; - sprite = nullptr; + Sprite = nullptr; vertindex = 0; vertcount = 0; @@ -1021,7 +1022,7 @@ void HWWall::ProcessWallSprite(HWDrawInfo* di, spritetype* spr, sectortype* sect if (!tex || !tex->isValid()) return; seg = nullptr; - sprite = spr; + Sprite = spr; vec2_t pos[2]; int sprz = spr->pos.z; @@ -1053,7 +1054,7 @@ void HWWall::ProcessWallSprite(HWDrawInfo* di, spritetype* spr, sectortype* sect fade = lookups.getFade(sector->floorpal); // fog is per sector. visibility = sectorVisibility(sector); - SetSpriteTranslucency(sprite, alpha, RenderStyle); + SetSpriteTranslucency(Sprite, alpha, RenderStyle); int height, topofs; if (hw_hightile && TileFiles.tiledata[spr->picnum].hiofs.xsize) @@ -1122,5 +1123,5 @@ void HWWall::ProcessWallSprite(HWDrawInfo* di, spritetype* spr, sectortype* sect std::swap(tcs[UPLFT], tcs[UPRGT]); } - PutWall(di, spriteHasTranslucency(sprite)); + PutWall(di, spriteHasTranslucency(Sprite)); } \ No newline at end of file