From b5f309ade9acaea3ef6b18514d3a95ca0f5adf93 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 29 May 2025 03:08:09 +0200 Subject: [PATCH] Fix sprites --- .../hwrenderer/scene/hw_drawinfo.cpp | 44 ++++++ src/rendering/hwrenderer/scene/hw_drawinfo.h | 6 +- .../hwrenderer/scene/hw_visibleset.cpp | 129 ++---------------- .../hwrenderer/scene/hw_visibleset.h | 4 +- 4 files changed, 61 insertions(+), 122 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 0dfb05a06..2d2859dbb 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -37,6 +37,7 @@ #include "hw_drawcontext.h" #include "hw_walldispatcher.h" #include "hw_visibleset.h" +#include "hw_fakeflat.h" #include "po_man.h" #include "models.h" #include "hw_clock.h" @@ -56,6 +57,9 @@ EXTERN_CVAR(Float, r_visibility) EXTERN_CVAR(Int, lm_background_updates); EXTERN_CVAR(Float, r_actorspriteshadowdist) EXTERN_CVAR(Bool, gl_portals) +EXTERN_CVAR(Bool, gl_render_things); +EXTERN_CVAR(Bool, gl_render_walls); +EXTERN_CVAR(Bool, gl_render_flats); CVAR(Bool, lm_always_update, false, 0) @@ -460,7 +464,47 @@ void HWDrawInfo::RenderPVS(bool drawpsprites, FRenderState& state) CheckUpdate(state, &Level->sectors[sectorIndex]); } + for (int sectorIndex : SeenSectors.Get()) + { + Level->sectors[sectorIndex].MoreFlags |= SECMF_DRAWN; + } + + for (int subIndex : SeenHackedSubsectors.Get()) + { + SubsectorHackInfo sh = { &Level->subsectors[subIndex], 0 }; + SubsectorHacks.Push(sh); + } + + if (gl_render_things) + { + for (int subIndex : SeenSubsectors.Get()) + { + subsector_t* sub = &Level->subsectors[subIndex]; + sector_t* sector = sub->sector; + + bool things = sector->touching_renderthings || sector->sectorportal_thinglist; + bool particles = sub->sprites.Size() > 0 || Level->ParticlesInSubsec[sub->Index()] != NO_PARTICLE; + + if (things || particles) + { + auto fakesector = hw_FakeFlat(drawctx, sector, in_area, false); + + if (things) + RenderThings(sub, fakesector, state); + + if (particles) + RenderParticles(sub, fakesector, state); + } + } + } + Bsp.Unclock(); + + // Process all the sprites on the current portal's back side which touch the portal. + if (mCurrentPortal != nullptr) mCurrentPortal->RenderAttached(this, state); + + if (drawpsprites) + PreparePlayerSprites(Viewpoint.sector, in_area, state); } } diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index 11fca86a6..b65b4c7e4 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -226,7 +226,7 @@ struct HWDrawInfo TArray AddedToList; }; - VisList SeenSectors, SeenSides; + VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors; TArray QueryResultsBuffer; @@ -242,9 +242,7 @@ struct HWDrawInfo void AddPolyobjs(subsector_t *sub); void AddLines(subsector_t * sub, sector_t * sector); void AddSpecialPortalLines(subsector_t * sub, sector_t * sector, linebase_t *line); - public: - void RenderThings(subsector_t * sub, sector_t * sector); - void RenderParticles(subsector_t *sub, sector_t *front); +public: void DoSubsector(subsector_t * sub); void DrawPSprite(HUDSprite* huds, FRenderState& state); WeaponLighting GetWeaponLighting(sector_t* viewsector, const DVector3& pos, int cm, area_t in_area, const DVector3& playerpos); diff --git a/src/rendering/hwrenderer/scene/hw_visibleset.cpp b/src/rendering/hwrenderer/scene/hw_visibleset.cpp index a21740746..2f21deda4 100644 --- a/src/rendering/hwrenderer/scene/hw_visibleset.cpp +++ b/src/rendering/hwrenderer/scene/hw_visibleset.cpp @@ -89,6 +89,8 @@ void HWVisibleSet::RenderBSP(void* node) SeenSectors.Clear(); SeenSides.Clear(); + SeenSubsectors.Clear(); + SeenHackedSubsectors.Clear(); RenderBSPNode(node); } @@ -171,7 +173,8 @@ void HWVisibleSet::DoSubsector(subsector_t* sub) // [RH] Add particles if (gl_render_things && (sub->sprites.Size() > 0 || Level->ParticlesInSubsec[sub->Index()] != NO_PARTICLE)) { - RenderParticles(sub, fakesector); + SeenSubsectors.Add(sub->Index()); + //RenderParticles(sub, fakesector); } AddLines(sub, fakesector); @@ -184,11 +187,12 @@ void HWVisibleSet::DoSubsector(subsector_t* sub) { // Well, now it will be done. validcount.sector[sector->Index()] = validcount.current; - sector->MoreFlags |= SECMF_DRAWN; + //sector->MoreFlags |= SECMF_DRAWN; if (gl_render_things && (sector->touching_renderthings || sector->sectorportal_thinglist)) { - RenderThings(sub, fakesector); + SeenSubsectors.Add(sub->Index()); + //RenderThings(sub, fakesector); } } @@ -465,13 +469,10 @@ void HWVisibleSet::PolySubsector(subsector_t* sub) void HWVisibleSet::AddHackedSubsector(subsector_t* sub) { -#if NEEDS_PVS_PORTING if (Level->maptype != MAPTYPE_HEXEN) { - SubsectorHackInfo sh = { sub, 0 }; - SubsectorHacks.Push(sh); + SeenHackedSubsectors.Add(sub->Index()); } -#endif } static bool PointOnLine(const DVector2& pos, const linebase_t* line) @@ -501,114 +502,6 @@ void HWVisibleSet::AddSpecialPortalLines(subsector_t* sub, sector_t* sector, lin } } -void HWVisibleSet::RenderThings(subsector_t* sub, sector_t* sector) -{ -#if NEEDS_PVS_PORTING - sector_t* sec = sub->sector; - // Handle all things in sector. - const auto& vp = Viewpoint; - for (auto p = sec->touching_renderthings; p != nullptr; p = p->m_snext) - { - auto thing = p->m_thing; - if (thing->validcount == validcount) continue; - thing->validcount = validcount; - - if (Viewpoint.IsAllowedOoB() && thing->Sector->isSecret() && thing->Sector->wasSecret() && !r_radarclipper) continue; // This covers things that are touching non-secret sectors - FIntCVar* cvar = thing->GetInfo()->distancecheck; - if (cvar != nullptr && *cvar >= 0) - { - double dist = (thing->Pos() - vp.Pos).LengthSquared(); - double check = (double)**cvar; - if (dist >= check * check) - { - continue; - } - } - // If this thing is in a map section that's not in view it can't possibly be visible - if ((*CurrentMapSections)[thing->subsector->mapsection]) - { - HWSprite sprite; - - // [Nash] draw sprite shadow - if (R_ShouldDrawSpriteShadow(thing)) - { - double dist = (thing->Pos() - vp.Pos).LengthSquared(); - double check = r_actorspriteshadowdist; - if (dist <= check * check) - { - sprite.Process(this, state, thing, sector, in_area, false, true); - } - } - - sprite.Process(this, state, thing, sector, in_area, false); - } - } - - for (msecnode_t* node = sec->sectorportal_thinglist; node; node = node->m_snext) - { - AActor* thing = node->m_thing; - FIntCVar* cvar = thing->GetInfo()->distancecheck; - if (cvar != nullptr && *cvar >= 0) - { - double dist = (thing->Pos() - vp.Pos).LengthSquared(); - double check = (double)**cvar; - if (dist >= check * check) - { - continue; - } - } - - HWSprite sprite; - - // [Nash] draw sprite shadow - if (R_ShouldDrawSpriteShadow(thing)) - { - double dist = (thing->Pos() - vp.Pos).LengthSquared(); - double check = r_actorspriteshadowdist; - if (dist <= check * check) - { - sprite.Process(this, state, thing, sector, in_area, true, true); - } - } - - sprite.Process(this, state, thing, sector, in_area, true); - } -#endif -} - -void HWVisibleSet::RenderParticles(subsector_t* sub, sector_t* front) -{ -#if NEEDS_PVS_PORTING - SetupSprite.Clock(); - for (uint32_t i = 0; i < sub->sprites.Size(); i++) - { - DVisualThinker* sp = sub->sprites[i]; - if (!sp || sp->ObjectFlags & OF_EuthanizeMe) - continue; - if (mClipPortal) - { - int clipres = mClipPortal->ClipPoint(sp->PT.Pos.XY()); - if (clipres == PClip_InFront) continue; - } - - HWSprite sprite; - sprite.ProcessParticle(this, state, &sp->PT, front, sp); - } - for (int i = Level->ParticlesInSubsec[sub->Index()]; i != NO_PARTICLE; i = Level->Particles[i].snext) - { - if (mClipPortal) - { - int clipres = mClipPortal->ClipPoint(Level->Particles[i].Pos.XY()); - if (clipres == PClip_InFront) continue; - } - - HWSprite sprite; - sprite.ProcessParticle(this, state, &Level->Particles[i], front, nullptr); - } - SetupSprite.Unclock(); -#endif -} - ///////////////////////////////////////////////////////////////////////////// HWVisibleSetThreads::HWVisibleSetThreads() @@ -670,12 +563,18 @@ void HWVisibleSetThreads::FindPVS(HWDrawInfo* di) // Merge results di->SeenSectors.Clear(); di->SeenSides.Clear(); + di->SeenSubsectors.Clear(); + di->SeenHackedSubsectors.Clear(); for (int i = 0; i < SliceCount; i++) { for (int sectorIndex : Slices[i].SeenSectors.Get()) di->SeenSectors.Add(sectorIndex); for (int sideIndex : Slices[i].SeenSides.Get()) di->SeenSides.Add(sideIndex); + for (int subIndex : Slices[i].SeenSubsectors.Get()) + di->SeenSubsectors.Add(subIndex); + for (int subIndex : Slices[i].SeenHackedSubsectors.Get()) + di->SeenHackedSubsectors.Add(subIndex); } } diff --git a/src/rendering/hwrenderer/scene/hw_visibleset.h b/src/rendering/hwrenderer/scene/hw_visibleset.h index 502dbacd7..4df7261af 100644 --- a/src/rendering/hwrenderer/scene/hw_visibleset.h +++ b/src/rendering/hwrenderer/scene/hw_visibleset.h @@ -49,7 +49,7 @@ public: TArray AddedToList; }; - VisList SeenSectors, SeenSides; + VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors; private: void RenderBSP(void* node); @@ -63,8 +63,6 @@ private: void PolySubsector(subsector_t* sub); void AddHackedSubsector(subsector_t* sub); void AddSpecialPortalLines(subsector_t* sub, sector_t* sector, linebase_t* line); - void RenderParticles(subsector_t* sub, sector_t* front); - void RenderThings(subsector_t* sub, sector_t* sector); angle_t FrustumAngle(); struct