From cfe4c55973ef3890f9c5d8f15fd2f7943f63e8a6 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 4 Feb 2017 19:13:56 +0100 Subject: [PATCH] Remove software renderer internals from F3DFloor --- src/p_3dfloors.cpp | 2 - src/p_3dfloors.h | 5 -- src/swrenderer/line/r_renderdrawsegment.cpp | 3 +- src/swrenderer/line/r_walldraw.cpp | 3 +- src/swrenderer/plane/r_visibleplane.cpp | 3 +- src/swrenderer/scene/r_3dfloors.cpp | 13 ++++ src/swrenderer/scene/r_3dfloors.h | 20 +++++- src/swrenderer/scene/r_opaque_pass.cpp | 80 ++++++++++----------- src/swrenderer/scene/r_portal.cpp | 6 +- src/swrenderer/scene/r_scene.cpp | 2 +- src/swrenderer/things/r_playersprite.cpp | 3 +- src/swrenderer/things/r_sprite.cpp | 3 +- 12 files changed, 86 insertions(+), 57 deletions(-) diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index f367c4637..76d8df3fe 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -129,8 +129,6 @@ static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flag ffloor->top.copied = ffloor->bottom.copied = false; ffloor->top.model = ffloor->bottom.model = ffloor->model = sec2; ffloor->target = sec; - ffloor->ceilingclip = ffloor->floorclip = NULL; - ffloor->validcount = 0; if (!(flags&FF_THINFLOOR)) { diff --git a/src/p_3dfloors.h b/src/p_3dfloors.h index 75b8656e4..2c0dbff64 100644 --- a/src/p_3dfloors.h +++ b/src/p_3dfloors.h @@ -95,11 +95,6 @@ struct F3DFloor int lastlight; int alpha; - // kg3D - for software - short *floorclip; - short *ceilingclip; - int validcount; - FDynamicColormap *GetColormap(); void UpdateColormap(FDynamicColormap *&map); PalEntry GetBlend(); diff --git a/src/swrenderer/line/r_renderdrawsegment.cpp b/src/swrenderer/line/r_renderdrawsegment.cpp index 85a55dc9e..67953dcfa 100644 --- a/src/swrenderer/line/r_renderdrawsegment.cpp +++ b/src/swrenderer/line/r_renderdrawsegment.cpp @@ -89,7 +89,8 @@ namespace swrenderer return; } - NetUpdate(); + if (Thread->MainThread) + NetUpdate(); frontsector = curline->frontsector; backsector = curline->backsector; diff --git a/src/swrenderer/line/r_walldraw.cpp b/src/swrenderer/line/r_walldraw.cpp index ea165ab04..a0e4641e4 100644 --- a/src/swrenderer/line/r_walldraw.cpp +++ b/src/swrenderer/line/r_walldraw.cpp @@ -362,7 +362,8 @@ namespace swrenderer Draw1Column(x, y1, y2, sampler); } - NetUpdate(); + if (Thread->MainThread) + NetUpdate(); } void RenderWallPart::ProcessNormalWall(const short *uwal, const short *dwal, double texturemid, float *swal, fixed_t *lwal) diff --git a/src/swrenderer/plane/r_visibleplane.cpp b/src/swrenderer/plane/r_visibleplane.cpp index a0a58c7e7..70cd4164f 100644 --- a/src/swrenderer/plane/r_visibleplane.cpp +++ b/src/swrenderer/plane/r_visibleplane.cpp @@ -129,6 +129,7 @@ namespace swrenderer renderer.Render(this, xscale, yscale, alpha, additive, masked, colormap, tex); } } - NetUpdate(); + if (thread->MainThread) + NetUpdate(); } } diff --git a/src/swrenderer/scene/r_3dfloors.cpp b/src/swrenderer/scene/r_3dfloors.cpp index 69618f9f4..f49def6b3 100644 --- a/src/swrenderer/scene/r_3dfloors.cpp +++ b/src/swrenderer/scene/r_3dfloors.cpp @@ -14,6 +14,7 @@ #include "r_3dfloors.h" #include "r_utility.h" #include "swrenderer/r_renderthread.h" +#include "swrenderer/r_memory.h" CVAR(Int, r_3dfloors, true, 0); @@ -24,8 +25,20 @@ namespace swrenderer Thread = thread; } + void Clip3DFloors::SetFakeFloor(F3DFloor *newFakeFloor) + { + auto &clip = FakeFloors[newFakeFloor]; + if (clip == nullptr) + { + clip = Thread->FrameMemory->NewObject(newFakeFloor); + } + fakeFloor = clip; + } + void Clip3DFloors::Cleanup() { + FakeFloors.clear(); + fakeActive = false; fake3D = 0; while (CurrentSkybox) diff --git a/src/swrenderer/scene/r_3dfloors.h b/src/swrenderer/scene/r_3dfloors.h index f49d6c80a..13168a80b 100644 --- a/src/swrenderer/scene/r_3dfloors.h +++ b/src/swrenderer/scene/r_3dfloors.h @@ -2,12 +2,14 @@ #pragma once #include "p_3dfloors.h" +#include EXTERN_CVAR(Int, r_3dfloors); namespace swrenderer { class RenderThread; + class FakeFloorClip; struct HeightLevel { @@ -27,7 +29,7 @@ namespace swrenderer { short floorclip[MAXWIDTH]; short ceilingclip[MAXWIDTH]; - F3DFloor *ffloor; + FakeFloorClip *ffloor; ClipStack *next; }; @@ -51,6 +53,17 @@ namespace swrenderer FAKE3D_DOWN2UP = 8, // rendering from down to up (floors) }; + class FakeFloorClip + { + public: + FakeFloorClip(F3DFloor *fakeFloor) : fakeFloor(fakeFloor) { } + + F3DFloor *fakeFloor = nullptr; + short *floorclip = nullptr; + short *ceilingclip = nullptr; + int validcount = -1; + }; + class Clip3DFloors { public: @@ -64,12 +77,13 @@ namespace swrenderer void ResetClip(); void EnterSkybox(); void LeaveSkybox(); + void SetFakeFloor(F3DFloor *fakeFloor); RenderThread *Thread = nullptr; int fake3D = 0; - F3DFloor *fakeFloor = nullptr; + FakeFloorClip *fakeFloor = nullptr; fixed_t fakeAlpha = 0; bool fakeActive = false; double sclipBottom = 0; @@ -83,5 +97,7 @@ namespace swrenderer TArray toplist; ClipStack *clip_top = nullptr; ClipStack *clip_cur = nullptr; + + std::unordered_map FakeFloors; }; } diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index 73d282488..1ee21449a 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -573,32 +573,32 @@ namespace swrenderer // first check all floors for (int i = 0; i < (int)frontsector->e->XFloor.ffloors.Size(); i++) { - clip3d->fakeFloor = frontsector->e->XFloor.ffloors[i]; - if (!(clip3d->fakeFloor->flags & FF_EXISTS)) continue; - if (!clip3d->fakeFloor->model) continue; - if (clip3d->fakeFloor->bottom.plane->isSlope()) continue; - if (!(clip3d->fakeFloor->flags & FF_NOSHADE) || (clip3d->fakeFloor->flags & (FF_RENDERPLANES | FF_RENDERSIDES))) + clip3d->SetFakeFloor(frontsector->e->XFloor.ffloors[i]); + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_EXISTS)) continue; + if (!clip3d->fakeFloor->fakeFloor->model) continue; + if (clip3d->fakeFloor->fakeFloor->bottom.plane->isSlope()) continue; + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_NOSHADE) || (clip3d->fakeFloor->fakeFloor->flags & (FF_RENDERPLANES | FF_RENDERSIDES))) { - clip3d->AddHeight(clip3d->fakeFloor->top.plane, frontsector); + clip3d->AddHeight(clip3d->fakeFloor->fakeFloor->top.plane, frontsector); } - if (!(clip3d->fakeFloor->flags & FF_RENDERPLANES)) continue; - if (clip3d->fakeFloor->alpha == 0) continue; - if (clip3d->fakeFloor->flags & FF_THISINSIDE && clip3d->fakeFloor->flags & FF_INVERTSECTOR) continue; - clip3d->fakeAlpha = MIN(Scale(clip3d->fakeFloor->alpha, OPAQUE, 255), OPAQUE); + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_RENDERPLANES)) continue; + if (clip3d->fakeFloor->fakeFloor->alpha == 0) continue; + if (clip3d->fakeFloor->fakeFloor->flags & FF_THISINSIDE && clip3d->fakeFloor->fakeFloor->flags & FF_INVERTSECTOR) continue; + clip3d->fakeAlpha = MIN(Scale(clip3d->fakeFloor->fakeFloor->alpha, OPAQUE, 255), OPAQUE); if (clip3d->fakeFloor->validcount != validcount) { clip3d->fakeFloor->validcount = validcount; clip3d->NewClip(); } - double fakeHeight = clip3d->fakeFloor->top.plane->ZatPoint(frontsector->centerspot); + double fakeHeight = clip3d->fakeFloor->fakeFloor->top.plane->ZatPoint(frontsector->centerspot); if (fakeHeight < ViewPos.Z && fakeHeight > frontsector->floorplane.ZatPoint(frontsector->centerspot)) { clip3d->fake3D = FAKE3D_FAKEFLOOR; - tempsec = *clip3d->fakeFloor->model; - tempsec.floorplane = *clip3d->fakeFloor->top.plane; - tempsec.ceilingplane = *clip3d->fakeFloor->bottom.plane; - if (!(clip3d->fakeFloor->flags & FF_THISINSIDE) && !(clip3d->fakeFloor->flags & FF_INVERTSECTOR)) + tempsec = *clip3d->fakeFloor->fakeFloor->model; + tempsec.floorplane = *clip3d->fakeFloor->fakeFloor->top.plane; + tempsec.ceilingplane = *clip3d->fakeFloor->fakeFloor->bottom.plane; + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_THISINSIDE) && !(clip3d->fakeFloor->fakeFloor->flags & FF_INVERTSECTOR)) { tempsec.SetTexture(sector_t::floor, tempsec.GetTexture(sector_t::ceiling)); position = sector_t::ceiling; @@ -618,7 +618,7 @@ namespace swrenderer frontsector->GetTexture(sector_t::floor), floorlightlevel + R_ActualExtraLight(foggy), // killough 3/16/98 frontsector->GetAlpha(sector_t::floor), - !!(clip3d->fakeFloor->flags & FF_ADDITIVETRANS), + !!(clip3d->fakeFloor->fakeFloor->flags & FF_ADDITIVETRANS), frontsector->planes[position].xform, frontsector->sky, nullptr, @@ -635,34 +635,34 @@ namespace swrenderer // and now ceilings for (unsigned int i = 0; i < frontsector->e->XFloor.ffloors.Size(); i++) { - clip3d->fakeFloor = frontsector->e->XFloor.ffloors[i]; - if (!(clip3d->fakeFloor->flags & FF_EXISTS)) continue; - if (!clip3d->fakeFloor->model) continue; - if (clip3d->fakeFloor->top.plane->isSlope()) continue; - if (!(clip3d->fakeFloor->flags & FF_NOSHADE) || (clip3d->fakeFloor->flags & (FF_RENDERPLANES | FF_RENDERSIDES))) + clip3d->SetFakeFloor(frontsector->e->XFloor.ffloors[i]); + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_EXISTS)) continue; + if (!clip3d->fakeFloor->fakeFloor->model) continue; + if (clip3d->fakeFloor->fakeFloor->top.plane->isSlope()) continue; + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_NOSHADE) || (clip3d->fakeFloor->fakeFloor->flags & (FF_RENDERPLANES | FF_RENDERSIDES))) { - clip3d->AddHeight(clip3d->fakeFloor->bottom.plane, frontsector); + clip3d->AddHeight(clip3d->fakeFloor->fakeFloor->bottom.plane, frontsector); } - if (!(clip3d->fakeFloor->flags & FF_RENDERPLANES)) continue; - if (clip3d->fakeFloor->alpha == 0) continue; - if (!(clip3d->fakeFloor->flags & FF_THISINSIDE) && (clip3d->fakeFloor->flags & (FF_SWIMMABLE | FF_INVERTSECTOR)) == (FF_SWIMMABLE | FF_INVERTSECTOR)) continue; - clip3d->fakeAlpha = MIN(Scale(clip3d->fakeFloor->alpha, OPAQUE, 255), OPAQUE); + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_RENDERPLANES)) continue; + if (clip3d->fakeFloor->fakeFloor->alpha == 0) continue; + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_THISINSIDE) && (clip3d->fakeFloor->fakeFloor->flags & (FF_SWIMMABLE | FF_INVERTSECTOR)) == (FF_SWIMMABLE | FF_INVERTSECTOR)) continue; + clip3d->fakeAlpha = MIN(Scale(clip3d->fakeFloor->fakeFloor->alpha, OPAQUE, 255), OPAQUE); if (clip3d->fakeFloor->validcount != validcount) { clip3d->fakeFloor->validcount = validcount; clip3d->NewClip(); } - double fakeHeight = clip3d->fakeFloor->bottom.plane->ZatPoint(frontsector->centerspot); + double fakeHeight = clip3d->fakeFloor->fakeFloor->bottom.plane->ZatPoint(frontsector->centerspot); if (fakeHeight > ViewPos.Z && fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->centerspot)) { clip3d->fake3D = FAKE3D_FAKECEILING; - tempsec = *clip3d->fakeFloor->model; - tempsec.floorplane = *clip3d->fakeFloor->top.plane; - tempsec.ceilingplane = *clip3d->fakeFloor->bottom.plane; - if ((!(clip3d->fakeFloor->flags & FF_THISINSIDE) && !(clip3d->fakeFloor->flags & FF_INVERTSECTOR)) || - (clip3d->fakeFloor->flags & FF_THISINSIDE && clip3d->fakeFloor->flags & FF_INVERTSECTOR)) + tempsec = *clip3d->fakeFloor->fakeFloor->model; + tempsec.floorplane = *clip3d->fakeFloor->fakeFloor->top.plane; + tempsec.ceilingplane = *clip3d->fakeFloor->fakeFloor->bottom.plane; + if ((!(clip3d->fakeFloor->fakeFloor->flags & FF_THISINSIDE) && !(clip3d->fakeFloor->fakeFloor->flags & FF_INVERTSECTOR)) || + (clip3d->fakeFloor->fakeFloor->flags & FF_THISINSIDE && clip3d->fakeFloor->fakeFloor->flags & FF_INVERTSECTOR)) { tempsec.SetTexture(sector_t::ceiling, tempsec.GetTexture(sector_t::floor)); position = sector_t::floor; @@ -684,7 +684,7 @@ namespace swrenderer frontsector->GetTexture(sector_t::ceiling), ceilinglightlevel + R_ActualExtraLight(foggy), // killough 4/11/98 frontsector->GetAlpha(sector_t::ceiling), - !!(clip3d->fakeFloor->flags & FF_ADDITIVETRANS), + !!(clip3d->fakeFloor->fakeFloor->flags & FF_ADDITIVETRANS), frontsector->planes[position].xform, frontsector->sky, nullptr, @@ -741,14 +741,14 @@ namespace swrenderer Clip3DFloors *clip3d = Thread->Clip3DFloors.get(); for (unsigned int i = 0; i < line->backsector->e->XFloor.ffloors.Size(); i++) { - clip3d->fakeFloor = line->backsector->e->XFloor.ffloors[i]; - if (!(clip3d->fakeFloor->flags & FF_EXISTS)) continue; - if (!(clip3d->fakeFloor->flags & FF_RENDERPLANES)) continue; - if (!clip3d->fakeFloor->model) continue; + clip3d->SetFakeFloor(line->backsector->e->XFloor.ffloors[i]); + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_EXISTS)) continue; + if (!(clip3d->fakeFloor->fakeFloor->flags & FF_RENDERPLANES)) continue; + if (!clip3d->fakeFloor->fakeFloor->model) continue; clip3d->fake3D = FAKE3D_FAKEBACK; - tempsec = *clip3d->fakeFloor->model; - tempsec.floorplane = *clip3d->fakeFloor->top.plane; - tempsec.ceilingplane = *clip3d->fakeFloor->bottom.plane; + tempsec = *clip3d->fakeFloor->fakeFloor->model; + tempsec.floorplane = *clip3d->fakeFloor->fakeFloor->top.plane; + tempsec.ceilingplane = *clip3d->fakeFloor->fakeFloor->bottom.plane; if (clip3d->fakeFloor->validcount != validcount) { clip3d->fakeFloor->validcount = validcount; diff --git a/src/swrenderer/scene/r_portal.cpp b/src/swrenderer/scene/r_portal.cpp index bf804a4d1..88ccb96c0 100644 --- a/src/swrenderer/scene/r_portal.cpp +++ b/src/swrenderer/scene/r_portal.cpp @@ -441,13 +441,15 @@ namespace swrenderer int prevuniq2 = CurrentPortalUniq; CurrentPortalUniq = prevuniq; - NetUpdate(); + if (Thread->MainThread) + NetUpdate(); MaskedCycles.Clock(); // [ZZ] count sprites in portals/mirrors along with normal ones. Thread->TranslucentPass->Render(); // this is required since with portals there often will be cases when more than 80% of the view is inside a portal. MaskedCycles.Unclock(); - NetUpdate(); + if (Thread->MainThread) + NetUpdate(); Thread->Clip3DFloors->LeaveSkybox(); // pop 3D floor height map CurrentPortalUniq = prevuniq2; diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index bc4b6c5ae..eeab47a7d 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -267,7 +267,7 @@ namespace swrenderer { while (Threads.size() < (size_t)numThreads) { - auto thread = std::make_unique(this); + auto thread = std::make_unique(this, false); auto renderthread = thread.get(); int start_run_id = run_id; thread->thread = std::thread([=]() diff --git a/src/swrenderer/things/r_playersprite.cpp b/src/swrenderer/things/r_playersprite.cpp index 0fb0b27c0..a2e8acec3 100644 --- a/src/swrenderer/things/r_playersprite.cpp +++ b/src/swrenderer/things/r_playersprite.cpp @@ -630,6 +630,7 @@ namespace swrenderer frac += xiscale; } - NetUpdate(); + if (thread->MainThread) + NetUpdate(); } } diff --git a/src/swrenderer/things/r_sprite.cpp b/src/swrenderer/things/r_sprite.cpp index 4fce83fc8..1da377c7d 100644 --- a/src/swrenderer/things/r_sprite.cpp +++ b/src/swrenderer/things/r_sprite.cpp @@ -298,6 +298,7 @@ namespace swrenderer } } - NetUpdate(); + if (thread->MainThread) + NetUpdate(); } }