From 87c3be94d5d1a648854a1331c32b4e0c4a95261d Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 26 Apr 2023 04:22:07 +0200 Subject: [PATCH] Adjust meshbuilder to vkdoom changes and make sure the drawinfo functions always allocate vertices from the output renderstate object --- .../rendering/hwrenderer/data/hw_mesh.cpp | 21 +-- .../rendering/hwrenderer/data/hw_mesh.h | 2 +- .../hwrenderer/data/hw_meshbuilder.cpp | 17 ++- .../hwrenderer/data/hw_meshbuilder.h | 7 +- src/rendering/hwrenderer/hw_entrypoint.cpp | 2 +- src/rendering/hwrenderer/scene/hw_bsp.cpp | 86 +++++------ src/rendering/hwrenderer/scene/hw_decal.cpp | 8 +- .../hwrenderer/scene/hw_drawinfo.cpp | 41 +++--- src/rendering/hwrenderer/scene/hw_drawinfo.h | 58 ++++---- .../hwrenderer/scene/hw_drawlist.cpp | 36 ++--- src/rendering/hwrenderer/scene/hw_drawlist.h | 10 +- .../hwrenderer/scene/hw_drawlistadd.cpp | 6 +- .../hwrenderer/scene/hw_drawstructs.h | 56 +++---- src/rendering/hwrenderer/scene/hw_flats.cpp | 18 +-- .../hwrenderer/scene/hw_meshcache.cpp | 8 +- src/rendering/hwrenderer/scene/hw_portal.cpp | 16 +- src/rendering/hwrenderer/scene/hw_portal.h | 8 +- .../hwrenderer/scene/hw_renderhacks.cpp | 58 ++++---- src/rendering/hwrenderer/scene/hw_sky.cpp | 26 ++-- src/rendering/hwrenderer/scene/hw_sprites.cpp | 34 ++--- src/rendering/hwrenderer/scene/hw_walls.cpp | 138 +++++++++--------- src/rendering/hwrenderer/scene/hw_weapon.cpp | 18 +-- src/rendering/hwrenderer/scene/hw_weapon.h | 2 +- 23 files changed, 329 insertions(+), 347 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.cpp b/src/common/rendering/hwrenderer/data/hw_mesh.cpp index 1c6f1e641..c4c6e09d4 100644 --- a/src/common/rendering/hwrenderer/data/hw_mesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_mesh.cpp @@ -10,16 +10,14 @@ void Mesh::Draw(FRenderState& renderstate) if (!mVertexBuffer && mVertices.Size() != 0) { - mVertexBuffer.reset(screen->CreateVertexBuffer()); - mVertexBuffer->SetData(mVertices.Size() * sizeof(FFlatVertex), mVertices.Data(), BufferUsageType::Static); - static const FVertexBufferAttribute format[] = { { 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(FFlatVertex, x) }, { 0, VATTR_TEXCOORD, VFmt_Float2, (int)myoffsetof(FFlatVertex, u) }, { 0, VATTR_LIGHTMAP, VFmt_Float3, (int)myoffsetof(FFlatVertex, lu) }, }; - mVertexBuffer->SetFormat(1, 3, sizeof(FFlatVertex), format); + mVertexBuffer.reset(screen->CreateVertexBuffer(1, 3, sizeof(FFlatVertex), format)); + mVertexBuffer->SetData(mVertices.Size() * sizeof(FFlatVertex), mVertices.Data(), BufferUsageType::Static); } if (mVertexBuffer) @@ -36,18 +34,12 @@ void Mesh::Draw(FRenderState& renderstate) origState.applyData.RenderStyle = renderstate.mRenderStyle; origState.applyData.SpecialEffect = renderstate.mSpecialEffect; origState.applyData.TextureEnabled = renderstate.mTextureEnabled; - origState.applyData.AlphaThreshold = renderstate.mAlphaThreshold; + origState.applyData.AlphaThreshold = renderstate.mStreamData.uAlphaThreshold; origState.applyData.FogEnabled = renderstate.mFogEnabled; origState.applyData.BrightmapEnabled = renderstate.mBrightmapEnabled; origState.applyData.TextureClamp = renderstate.mTextureClamp; origState.applyData.TextureMode = renderstate.mTextureMode; origState.applyData.TextureModeFlags = renderstate.mTextureModeFlags; - origState.applyData.uLightDist = renderstate.mLightParms[0]; - origState.applyData.uLightFactor = renderstate.mLightParms[1]; - origState.applyData.uFogDensity = renderstate.mLightParms[2]; - origState.applyData.uClipSplit[0] = renderstate.mClipSplit[0]; - origState.applyData.uClipSplit[1] = renderstate.mClipSplit[1]; - origState.uLightLevel = renderstate.mLightParms[3]; origState.streamData = renderstate.mStreamData; origState.material = renderstate.mMaterial; @@ -107,18 +99,11 @@ void Mesh::Apply(FRenderState& renderstate, const MeshApplyState& state) renderstate.mRenderStyle = state.applyData.RenderStyle; renderstate.mSpecialEffect = state.applyData.SpecialEffect; renderstate.mTextureEnabled = state.applyData.TextureEnabled; - renderstate.mAlphaThreshold = state.applyData.AlphaThreshold; renderstate.mFogEnabled = state.applyData.FogEnabled; renderstate.mBrightmapEnabled = state.applyData.BrightmapEnabled; renderstate.mTextureClamp = state.applyData.TextureClamp; renderstate.mTextureMode = state.applyData.TextureMode; renderstate.mTextureModeFlags = state.applyData.TextureModeFlags; - renderstate.mLightParms[0] = state.applyData.uLightDist; - renderstate.mLightParms[1] = state.applyData.uLightFactor; - renderstate.mLightParms[2] = state.applyData.uFogDensity; - renderstate.mClipSplit[0] = state.applyData.uClipSplit[0]; - renderstate.mClipSplit[1] = state.applyData.uClipSplit[1]; - renderstate.mLightParms[3] = state.uLightLevel; renderstate.mStreamData = state.streamData; renderstate.mMaterial = state.material; } diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.h b/src/common/rendering/hwrenderer/data/hw_mesh.h index 810ecc729..3c6313574 100644 --- a/src/common/rendering/hwrenderer/data/hw_mesh.h +++ b/src/common/rendering/hwrenderer/data/hw_mesh.h @@ -14,7 +14,7 @@ private: TArray mDraws; TArray mIndexedDraws; TArray mVertices; - std::unique_ptr mVertexBuffer; + std::unique_ptr mVertexBuffer; friend class MeshBuilder; }; diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index 0b9cde55e..59c16b0d6 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -1,6 +1,7 @@ #include "hw_meshbuilder.h" #include "hw_mesh.h" +#include "v_video.h" MeshBuilder::MeshBuilder() { @@ -16,6 +17,9 @@ MeshBuilder::MeshBuilder() ClearDepthBias(); EnableTexture(1); EnableBrightmap(true); + + // Add the vbo_shadowdata as some geometry might use it + mVertices = screen->mVertexData->vbo_shadowdata; } void MeshBuilder::Draw(int dt, int index, int count, bool apply) @@ -56,18 +60,13 @@ void MeshBuilder::Apply() state.applyData.RenderStyle = mRenderStyle; state.applyData.SpecialEffect = mSpecialEffect; state.applyData.TextureEnabled = mTextureEnabled; - state.applyData.AlphaThreshold = mAlphaThreshold; + state.applyData.AlphaThreshold = mStreamData.uAlphaThreshold; state.applyData.DepthFunc = mDepthFunc; state.applyData.FogEnabled = mFogEnabled; state.applyData.BrightmapEnabled = mBrightmapEnabled; state.applyData.TextureClamp = mTextureClamp; state.applyData.TextureMode = mTextureMode; state.applyData.TextureModeFlags = mTextureModeFlags; - state.applyData.uLightDist = mLightParms[0]; - state.applyData.uLightFactor = mLightParms[1]; - state.applyData.uFogDensity = mLightParms[2]; - state.applyData.uClipSplit = { mClipSplit[0], mClipSplit[1] }; - state.uLightLevel = mLightParms[3]; state.streamData = mStreamData; state.material = mMaterial; @@ -100,8 +99,10 @@ std::unique_ptr MeshBuilder::Create() applyIndex++; } - mesh->mVertices = std::move(mVertices); - mVertices.Clear(); + // To do: the various mesh layers have to share the vertex buffer since some vertex allocations happen at the Process stage + //mesh->mVertices = std::move(mVertices); + //mVertices.Clear(); + mesh->mVertices = mVertices; return mesh; } diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.h b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h index 46992aac2..068c92255 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.h +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h @@ -22,14 +22,8 @@ public: int TextureClamp; int TextureMode; int TextureModeFlags; - float uFogDensity; - float uLightFactor; - float uLightDist; - FVector2 uClipSplit; }; - float uLightLevel; - ApplyData applyData; StreamData streamData; FMaterialState material; @@ -95,6 +89,7 @@ public: void SetCulling(int mode) override { } void EnableStencil(bool on) override { } void EnableDepthTest(bool on) override { } + void SetViewpointOffset(uint32_t offset) override { } std::unique_ptr Create(); diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index 4bfb59407..a1611ae5e 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -171,7 +171,7 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou vp.Pos += eye.GetViewShift(vp.HWAngles.Yaw.Degrees()); di->SetupView(RenderState, vp.Pos.X, vp.Pos.Y, vp.Pos.Z, false, false); - di->ProcessScene(toscreen); + di->ProcessScene(toscreen, *screen->RenderState()); if (mainview) { diff --git a/src/rendering/hwrenderer/scene/hw_bsp.cpp b/src/rendering/hwrenderer/scene/hw_bsp.cpp index 822f7c2ca..84c7e11ff 100644 --- a/src/rendering/hwrenderer/scene/hw_bsp.cpp +++ b/src/rendering/hwrenderer/scene/hw_bsp.cpp @@ -106,6 +106,8 @@ void HWDrawInfo::WorkerThread() { sector_t *front, *back; + FRenderState& state = *screen->RenderState(); + WTTotal.Clock(); isWorkerThread = true; // for adding asserts in GL API code. The worker thread may never call any GL API. while (true) @@ -169,7 +171,7 @@ void HWDrawInfo::WorkerThread() } else back = nullptr; - wall.Process(this, job->seg, front, back); + wall.Process(this, state, job->seg, front, back); rendered_lines++; SetupWall.Unclock(); break; @@ -181,7 +183,7 @@ void HWDrawInfo::WorkerThread() SetupFlat.Clock(); flat.section = job->sub->section; front = hw_FakeFlat(job->sub->render_sector, in_area, false); - flat.ProcessSector(this, front); + flat.ProcessSector(this, state, front); SetupFlat.Unclock(); break; } @@ -189,14 +191,14 @@ void HWDrawInfo::WorkerThread() case RenderJob::SpriteJob: SetupSprite.Clock(); front = hw_FakeFlat(job->sub->sector, in_area, false); - RenderThings(job->sub, front); + RenderThings(job->sub, front, state); SetupSprite.Unclock(); break; case RenderJob::ParticleJob: SetupSprite.Clock(); front = hw_FakeFlat(job->sub->sector, in_area, false); - RenderParticles(job->sub, front); + RenderParticles(job->sub, front, state); SetupSprite.Unclock(); break; @@ -247,7 +249,7 @@ void HWDrawInfo::UnclipSubsector(subsector_t *sub) // //========================================================================== -void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) +void HWDrawInfo::AddLine (seg_t *seg, bool portalclip, FRenderState& state) { #ifdef _DEBUG if (seg->linedef && seg->linedef->Index() == 38) @@ -350,7 +352,7 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) HWWall wall; SetupWall.Clock(); wall.sub = seg->Subsector; - wall.Process(this, seg, currentsector, backsector); + wall.Process(this, state, seg, currentsector, backsector); rendered_lines++; SetupWall.Unclock(); } @@ -367,7 +369,7 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) // //========================================================================== -void HWDrawInfo::PolySubsector(subsector_t * sub) +void HWDrawInfo::PolySubsector(subsector_t * sub, FRenderState& state) { int count = sub->numlines; seg_t * line = sub->firstline; @@ -376,7 +378,7 @@ void HWDrawInfo::PolySubsector(subsector_t * sub) { if (line->linedef) { - AddLine (line, mClipPortal != nullptr); + AddLine (line, mClipPortal != nullptr, state); } line++; } @@ -391,7 +393,7 @@ void HWDrawInfo::PolySubsector(subsector_t * sub) // //========================================================================== -void HWDrawInfo::RenderPolyBSPNode (void *node) +void HWDrawInfo::RenderPolyBSPNode (void *node, FRenderState& state) { while (!((size_t)node & 1)) // Keep going until found a subsector { @@ -401,7 +403,7 @@ void HWDrawInfo::RenderPolyBSPNode (void *node) int side = R_PointOnSide(viewx, viewy, bsp); // Recursively divide front space (toward the viewer). - RenderPolyBSPNode (bsp->children[side]); + RenderPolyBSPNode (bsp->children[side], state); // Possibly divide back space (away from the viewer). side ^= 1; @@ -414,7 +416,7 @@ void HWDrawInfo::RenderPolyBSPNode (void *node) node = bsp->children[side]; } - PolySubsector ((subsector_t *)((uint8_t *)node - 1)); + PolySubsector ((subsector_t *)((uint8_t *)node - 1), state); } //========================================================================== @@ -424,7 +426,7 @@ void HWDrawInfo::RenderPolyBSPNode (void *node) // //========================================================================== -void HWDrawInfo::AddPolyobjs(subsector_t *sub) +void HWDrawInfo::AddPolyobjs(subsector_t *sub, FRenderState& state) { if (sub->BSP == nullptr || sub->BSP->bDirty) { @@ -432,11 +434,11 @@ void HWDrawInfo::AddPolyobjs(subsector_t *sub) } if (sub->BSP->Nodes.Size() == 0) { - PolySubsector(&sub->BSP->Subsectors[0]); + PolySubsector(&sub->BSP->Subsectors[0], state); } else { - RenderPolyBSPNode(&sub->BSP->Nodes.Last()); + RenderPolyBSPNode(&sub->BSP->Nodes.Last(), state); } } @@ -447,7 +449,7 @@ void HWDrawInfo::AddPolyobjs(subsector_t *sub) // //========================================================================== -void HWDrawInfo::AddLines(subsector_t * sub, sector_t * sector) +void HWDrawInfo::AddLines(subsector_t * sub, sector_t * sector, FRenderState& state) { currentsector = sector; currentsubsector = sub; @@ -455,7 +457,7 @@ void HWDrawInfo::AddLines(subsector_t * sub, sector_t * sector) ClipWall.Clock(); if (sub->polys != nullptr) { - AddPolyobjs(sub); + AddPolyobjs(sub, state); } else { @@ -466,11 +468,11 @@ void HWDrawInfo::AddLines(subsector_t * sub, sector_t * sector) { if (seg->linedef == nullptr) { - if (!(sub->flags & SSECMF_DRAWN)) AddLine (seg, mClipPortal != nullptr); + if (!(sub->flags & SSECMF_DRAWN)) AddLine (seg, mClipPortal != nullptr, state); } else if (!(seg->sidedef->Flags & WALLF_POLYOBJ)) { - AddLine (seg, mClipPortal != nullptr); + AddLine (seg, mClipPortal != nullptr, state); } seg++; } @@ -491,7 +493,7 @@ inline bool PointOnLine(const DVector2 &pos, const linebase_t *line) return fabs(v) <= EQUAL_EPSILON; } -void HWDrawInfo::AddSpecialPortalLines(subsector_t * sub, sector_t * sector, linebase_t *line) +void HWDrawInfo::AddSpecialPortalLines(subsector_t * sub, sector_t * sector, linebase_t *line, FRenderState& state) { currentsector = sector; currentsubsector = sub; @@ -505,7 +507,7 @@ void HWDrawInfo::AddSpecialPortalLines(subsector_t * sub, sector_t * sector, lin if (seg->linedef != nullptr && seg->PartnerSeg != nullptr) { if (PointOnLine(seg->v1->fPos(), line) && PointOnLine(seg->v2->fPos(), line)) - AddLine(seg, false); + AddLine(seg, false, state); } seg++; } @@ -519,7 +521,7 @@ void HWDrawInfo::AddSpecialPortalLines(subsector_t * sub, sector_t * sector, lin // //========================================================================== -void HWDrawInfo::RenderThings(subsector_t * sub, sector_t * sector) +void HWDrawInfo::RenderThings(subsector_t * sub, sector_t * sector, FRenderState& state) { sector_t * sec=sub->sector; // Handle all things in sector. @@ -552,11 +554,11 @@ void HWDrawInfo::RenderThings(subsector_t * sub, sector_t * sector) double check = r_actorspriteshadowdist; if (dist <= check * check) { - sprite.Process(this, thing, sector, in_area, false, true); + sprite.Process(this, state, thing, sector, in_area, false, true); } } - sprite.Process(this, thing, sector, in_area, false); + sprite.Process(this, state, thing, sector, in_area, false); } } @@ -583,15 +585,15 @@ void HWDrawInfo::RenderThings(subsector_t * sub, sector_t * sector) double check = r_actorspriteshadowdist; if (dist <= check * check) { - sprite.Process(this, thing, sector, in_area, true, true); + sprite.Process(this, state, thing, sector, in_area, true, true); } } - sprite.Process(this, thing, sector, in_area, true); + sprite.Process(this, state, thing, sector, in_area, true); } } -void HWDrawInfo::RenderParticles(subsector_t *sub, sector_t *front) +void HWDrawInfo::RenderParticles(subsector_t *sub, sector_t *front, FRenderState& state) { SetupSprite.Clock(); for (int i = Level->ParticlesInSubsec[sub->Index()]; i != NO_PARTICLE; i = Level->Particles[i].snext) @@ -603,7 +605,7 @@ void HWDrawInfo::RenderParticles(subsector_t *sub, sector_t *front) } HWSprite sprite; - sprite.ProcessParticle(this, &Level->Particles[i], front); + sprite.ProcessParticle(this, state, &Level->Particles[i], front); } SetupSprite.Unclock(); } @@ -618,7 +620,7 @@ void HWDrawInfo::RenderParticles(subsector_t *sub, sector_t *front) // //========================================================================== -void HWDrawInfo::DoSubsector(subsector_t * sub) +void HWDrawInfo::DoSubsector(subsector_t * sub, FRenderState& state) { sector_t * sector; sector_t * fakesector; @@ -655,7 +657,7 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) { auto line = mClipPortal->ClipLine(); // The subsector is out of range, but we still have to check lines that lie directly on the boundary and may expose their upper or lower parts. - if (line) AddSpecialPortalLines(sub, fakesector, line); + if (line) AddSpecialPortalLines(sub, fakesector, line, state); return; } } @@ -675,12 +677,12 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) else { SetupSprite.Clock(); - RenderParticles(sub, fakesector); + RenderParticles(sub, fakesector, state); SetupSprite.Unclock(); } } - AddLines(sub, fakesector); + AddLines(sub, fakesector, state); // BSP is traversed by subsector. // A sector might have been split into several @@ -701,7 +703,7 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) else { SetupSprite.Clock(); - RenderThings(sub, fakesector); + RenderThings(sub, fakesector, state); SetupSprite.Unclock(); } } @@ -740,7 +742,7 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) HWFlat flat; flat.section = sub->section; SetupFlat.Clock(); - flat.ProcessSector(this, fakesector); + flat.ProcessSector(this, state, fakesector); SetupFlat.Unclock(); } } @@ -799,11 +801,11 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) // //========================================================================== -void HWDrawInfo::RenderBSPNode (void *node) +void HWDrawInfo::RenderBSPNode (void *node, FRenderState& state) { if (Level->nodes.Size() == 0) { - DoSubsector (&Level->subsectors[0]); + DoSubsector (&Level->subsectors[0], state); return; } while (!((size_t)node & 1)) // Keep going until found a subsector @@ -814,7 +816,7 @@ void HWDrawInfo::RenderBSPNode (void *node) int side = R_PointOnSide(viewx, viewy, bsp); // Recursively divide front space (toward the viewer). - RenderBSPNode (bsp->children[side]); + RenderBSPNode (bsp->children[side], state); // Possibly divide back space (away from the viewer). side ^= 1; @@ -828,10 +830,10 @@ void HWDrawInfo::RenderBSPNode (void *node) node = bsp->children[side]; } - DoSubsector ((subsector_t *)((uint8_t *)node - 1)); + DoSubsector ((subsector_t *)((uint8_t *)node - 1), state); } -void HWDrawInfo::RenderBSP(void *node, bool drawpsprites) +void HWDrawInfo::RenderBSP(void *node, bool drawpsprites, FRenderState& state) { Bsp.Clock(); @@ -848,7 +850,7 @@ void HWDrawInfo::RenderBSP(void *node, bool drawpsprites) auto future = renderPool.push([&](int id) { WorkerThread(); }); - RenderBSPNode(node); + RenderBSPNode(node, state); jobQueue.AddJob(RenderJob::TerminateJob, nullptr, nullptr); Bsp.Unclock(); @@ -858,12 +860,12 @@ void HWDrawInfo::RenderBSP(void *node, bool drawpsprites) } else { - RenderBSPNode(node); + RenderBSPNode(node, state); Bsp.Unclock(); } // Process all the sprites on the current portal's back side which touch the portal. - if (mCurrentPortal != nullptr) mCurrentPortal->RenderAttached(this); + if (mCurrentPortal != nullptr) mCurrentPortal->RenderAttached(this, state); if (drawpsprites) - PreparePlayerSprites(Viewpoint.sector, in_area); + PreparePlayerSprites(Viewpoint.sector, in_area, state); } diff --git a/src/rendering/hwrenderer/scene/hw_decal.cpp b/src/rendering/hwrenderer/scene/hw_decal.cpp index 0803e4e00..25d3749ed 100644 --- a/src/rendering/hwrenderer/scene/hw_decal.cpp +++ b/src/rendering/hwrenderer/scene/hw_decal.cpp @@ -188,7 +188,7 @@ static float mix(float a, float b, float t) return a * (1.0f - t) + b * t; } -void HWWall::ProcessDecal(HWDrawInfo *di, DBaseDecal *decal, const FVector3 &normal) +void HWWall::ProcessDecal(HWDrawInfo *di, FRenderState& state, DBaseDecal *decal, const FVector3 &normal) { line_t * line = seg->linedef; side_t * side = seg->sidedef; @@ -445,7 +445,7 @@ void HWWall::ProcessDecal(HWDrawInfo *di, DBaseDecal *decal, const FVector3 &nor gldecal->lightlist = lightlist; memcpy(gldecal->dv, dv, sizeof(dv)); - auto verts = screen->mVertexData->AllocVertices(4); + auto verts = state.AllocVertices(4); gldecal->vertindex = verts.second; for (i = 0; i < 4; i++) @@ -460,7 +460,7 @@ void HWWall::ProcessDecal(HWDrawInfo *di, DBaseDecal *decal, const FVector3 &nor // //========================================================================== -void HWWall::ProcessDecals(HWDrawInfo *di) +void HWWall::ProcessDecals(HWDrawInfo *di, FRenderState& state) { if (seg->sidedef != nullptr) { @@ -470,7 +470,7 @@ void HWWall::ProcessDecals(HWDrawInfo *di) auto normal = glseg.Normal(); // calculate the normal only once per wall because it requires a square root. while (decal) { - ProcessDecal(di, decal, normal); + ProcessDecal(di, state, decal, normal); decal = decal->WallNext; } } diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 113901493..f883b6165 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -63,7 +63,7 @@ CVAR(Float, gl_mask_sprite_threshold, 0.5f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, gl_coronas, true, CVAR_ARCHIVE); -CVAR(Bool, gl_meshcache, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Bool, gl_meshcache, false, 0/*CVAR_ARCHIVE | CVAR_GLOBALCONFIG*/) sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool back); @@ -437,7 +437,7 @@ HWDecal *HWDrawInfo::AddDecal(bool onmirror) // //----------------------------------------------------------------------------- -void HWDrawInfo::CreateScene(bool drawpsprites) +void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) { const auto &vp = Viewpoint; angle_t a1 = FrustumAngle(); @@ -454,16 +454,16 @@ void HWDrawInfo::CreateScene(bool drawpsprites) screen->mBones->Map(); if (!gl_meshcache) - RenderBSP(Level->HeadNode(), drawpsprites); + RenderBSP(Level->HeadNode(), drawpsprites, state); // And now the crappy hacks that have to be done to avoid rendering anomalies. // These cannot be multithreaded when the time comes because all these depend // on the global 'validcount' variable. - HandleMissingTextures(in_area); // Missing upper/lower textures - HandleHackedSubsectors(); // open sector hacks for deep water - PrepareUnhandledMissingTextures(); - DispatchRenderHacks(); + HandleMissingTextures(in_area, state); // Missing upper/lower textures + HandleHackedSubsectors(state); // open sector hacks for deep water + PrepareUnhandledMissingTextures(state); + DispatchRenderHacks(state); screen->mLights->Unmap(); screen->mBones->Unmap(); screen->mVertexData->Unmap(); @@ -655,7 +655,7 @@ void HWDrawInfo::DrawCorona(FRenderState& state, ACorona* corona, double dist) float u0 = 0.0f, v0 = 0.0f; float u1 = 1.0f, v1 = 1.0f; - auto vert = screen->mVertexData->AllocVertices(4); + auto vert = state.AllocVertices(4); auto vp = vert.first; unsigned int vertexindex = vert.second; @@ -816,7 +816,7 @@ void HWDrawInfo::Set3DViewport(FRenderState &state) // //----------------------------------------------------------------------------- -void HWDrawInfo::DrawScene(int drawmode) +void HWDrawInfo::DrawScene(int drawmode, FRenderState& state) { static int recursion = 0; static int ssao_portals_available = 0; @@ -841,32 +841,31 @@ void HWDrawInfo::DrawScene(int drawmode) if (vp.camera != nullptr) { ActorRenderFlags savedflags = vp.camera->renderflags; - CreateScene(drawmode == DM_MAINVIEW); + CreateScene(drawmode == DM_MAINVIEW, state); vp.camera->renderflags = savedflags; } else { - CreateScene(false); + CreateScene(false, state); } - auto& RenderState = *screen->RenderState(); - RenderState.SetDepthMask(true); - if (!gl_no_skyclear) portalState.RenderFirstSkyPortal(recursion, this, RenderState); + state.SetDepthMask(true); + if (!gl_no_skyclear) portalState.RenderFirstSkyPortal(recursion, this, state); - RenderScene(RenderState); + RenderScene(state); - if (applySSAO && RenderState.GetPassType() == GBUFFER_PASS) + if (applySSAO && state.GetPassType() == GBUFFER_PASS) { screen->AmbientOccludeScene(VPUniforms.mProjectionMatrix.get()[5]); - screen->mViewpoints->Bind(RenderState, vpIndex); + screen->mViewpoints->Bind(state, vpIndex); } // Handle all portals after rendering the opaque objects but before // doing all translucent stuff recursion++; - portalState.EndFrame(this, RenderState); + portalState.EndFrame(this, state); recursion--; - RenderTranslucent(RenderState); + RenderTranslucent(state); } @@ -876,13 +875,13 @@ void HWDrawInfo::DrawScene(int drawmode) // //----------------------------------------------------------------------------- -void HWDrawInfo::ProcessScene(bool toscreen) +void HWDrawInfo::ProcessScene(bool toscreen, FRenderState& state) { portalState.BeginScene(); int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; CurrentMapSections.Set(mapsection); - DrawScene(toscreen ? DM_MAINVIEW : DM_OFFSCREEN); + DrawScene(toscreen ? DM_MAINVIEW : DM_OFFSCREEN, state); } diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index abbd181a1..327962269 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -197,18 +197,18 @@ private: void UnclipSubsector(subsector_t *sub); - void AddLine(seg_t *seg, bool portalclip); - void PolySubsector(subsector_t * sub); - void RenderPolyBSPNode(void *node); - void AddPolyobjs(subsector_t *sub); - void AddLines(subsector_t * sub, sector_t * sector); - void AddSpecialPortalLines(subsector_t * sub, sector_t * sector, linebase_t *line); + void AddLine(seg_t *seg, bool portalclip, FRenderState& state); + void PolySubsector(subsector_t * sub, FRenderState& state); + void RenderPolyBSPNode(void *node, FRenderState& state); + void AddPolyobjs(subsector_t *sub, FRenderState& state); + void AddLines(subsector_t * sub, sector_t * sector, FRenderState& state); + void AddSpecialPortalLines(subsector_t * sub, sector_t * sector, linebase_t *line, FRenderState& state); public: - void RenderThings(subsector_t * sub, sector_t * sector); - void RenderParticles(subsector_t *sub, sector_t *front); - void DoSubsector(subsector_t * sub); + void RenderThings(subsector_t * sub, sector_t * sector, FRenderState& state); + void RenderParticles(subsector_t *sub, sector_t *front, FRenderState& state); + void DoSubsector(subsector_t * sub, FRenderState& state); int SetupLightsForOtherPlane(subsector_t * sub, FDynLightData &lightdata, const secplane_t *plane); - int CreateOtherPlaneVertices(subsector_t *sub, const secplane_t *plane); + int CreateOtherPlaneVertices(subsector_t *sub, const secplane_t *plane, FRenderState& state); void DrawPSprite(HUDSprite *huds, FRenderState &state); void SetColor(FRenderState &state, int sectorlightlevel, int rellight, bool fullbright, const FColormap &cm, float alpha, bool weapon = false); void SetFog(FRenderState &state, int lightlevel, int rellight, bool fullbright, const FColormap *cmap, bool isadditive); @@ -219,7 +219,7 @@ private: bool CheckFog(sector_t *frontsector, sector_t *backsector); WeaponLighting GetWeaponLighting(sector_t *viewsector, const DVector3 &pos, int cm, area_t in_area, const DVector3 &playerpos); - void PreparePlayerSprites2D(sector_t * viewsector, area_t in_area); + void PreparePlayerSprites2D(sector_t * viewsector, area_t in_area, FRenderState& state); void PreparePlayerSprites3D(sector_t * viewsector, area_t in_area); public: @@ -242,8 +242,8 @@ public: } HWPortal * FindPortal(const void * src); - void RenderBSPNode(void *node); - void RenderBSP(void *node, bool drawpsprites); + void RenderBSPNode(void *node, FRenderState& state); + void RenderBSP(void *node, bool drawpsprites, FRenderState& state); static HWDrawInfo *StartDrawInfo(FLevelLocals *lev, HWDrawInfo *parent, FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms); void StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms); @@ -252,15 +252,15 @@ public: void SetViewArea(); int SetFullbrightFlags(player_t *player); - void DrawScene(int drawmode); - void CreateScene(bool drawpsprites); + void DrawScene(int drawmode, FRenderState& state); + void CreateScene(bool drawpsprites, FRenderState& state); void RenderScene(FRenderState &state); void RenderTranslucent(FRenderState &state); void RenderPortal(HWPortal *p, FRenderState &state, bool usestencil); void EndDrawScene(sector_t * viewsector, FRenderState &state); void DrawEndScene2D(sector_t * viewsector, FRenderState &state); void Set3DViewport(FRenderState &state); - void ProcessScene(bool toscreen); + void ProcessScene(bool toscreen, FRenderState& state); bool DoOneSectorUpper(subsector_t * subsec, float planez, area_t in_area); bool DoOneSectorLower(subsector_t * subsec, float planez, area_t in_area); @@ -274,32 +274,32 @@ public: void CollectSectorStacksCeiling(subsector_t * sub, sector_t * anchor, area_t in_area); void CollectSectorStacksFloor(subsector_t * sub, sector_t * anchor, area_t in_area); - void DispatchRenderHacks(); + void DispatchRenderHacks(FRenderState& state); void AddUpperMissingTexture(side_t * side, subsector_t *sub, float backheight); void AddLowerMissingTexture(side_t * side, subsector_t *sub, float backheight); - void HandleMissingTextures(area_t in_area); - void PrepareUnhandledMissingTextures(); - void PrepareUpperGap(seg_t * seg); - void PrepareLowerGap(seg_t * seg); + void HandleMissingTextures(area_t in_area, FRenderState& state); + void PrepareUnhandledMissingTextures(FRenderState& state); + void PrepareUpperGap(seg_t * seg, FRenderState& state); + void PrepareLowerGap(seg_t * seg, FRenderState& state); void CreateFloodPoly(wallseg * ws, FFlatVertex *vertices, float planez, sector_t * sec, bool ceiling); void CreateFloodStencilPoly(wallseg * ws, FFlatVertex *vertices); void AddHackedSubsector(subsector_t * sub); - void HandleHackedSubsectors(); + void HandleHackedSubsectors(FRenderState& state); void AddFloorStack(sector_t * sec); void AddCeilingStack(sector_t * sec); void ProcessSectorStacks(area_t in_area); - void ProcessActorsInPortal(FLinePortalSpan *glport, area_t in_area); + void ProcessActorsInPortal(FLinePortalSpan *glport, area_t in_area, FRenderState& state); - void AddOtherFloorPlane(int sector, gl_subsectorrendernode * node); - void AddOtherCeilingPlane(int sector, gl_subsectorrendernode * node); + void AddOtherFloorPlane(int sector, gl_subsectorrendernode * node, FRenderState& state); + void AddOtherCeilingPlane(int sector, gl_subsectorrendernode * node, FRenderState& state); void GetDynSpriteLight(AActor *self, float x, float y, float z, FLightNode *node, int portalgroup, float *out); void GetDynSpriteLight(AActor *thing, particle_t *particle, float *out); - void PreparePlayerSprites(sector_t * viewsector, area_t in_area); - void PrepareTargeterSprites(double ticfrac); + void PreparePlayerSprites(sector_t * viewsector, area_t in_area, FRenderState& state); + void PrepareTargeterSprites(double ticfrac, FRenderState& state); void UpdateCurrentMapSection(); void SetViewMatrix(const FRotator &angles, float vx, float vy, float vz, bool mirror, bool planemirror); @@ -311,11 +311,11 @@ public: void DrawCoronas(FRenderState& state); void DrawCorona(FRenderState& state, ACorona* corona, double dist); - void ProcessLowerMinisegs(TArray &lowersegs); + void ProcessLowerMinisegs(TArray &lowersegs, FRenderState& state); void AddSubsectorToPortal(FSectorPortalGroup *portal, subsector_t *sub); void AddWall(HWWall *w); - void AddMirrorSurface(HWWall *w); + void AddMirrorSurface(HWWall *w, FRenderState& state); void AddFlat(HWFlat *flat, bool fog); void AddSprite(HWSprite *sprite, bool translucent); diff --git a/src/rendering/hwrenderer/scene/hw_drawlist.cpp b/src/rendering/hwrenderer/scene/hw_drawlist.cpp index 41778065e..6f13b7f13 100644 --- a/src/rendering/hwrenderer/scene/hw_drawlist.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawlist.cpp @@ -268,7 +268,7 @@ void HWDrawList::SortPlaneIntoPlane(SortNode * head,SortNode * sort) // // //========================================================================== -void HWDrawList::SortWallIntoPlane(HWDrawInfo* di, SortNode * head, SortNode * sort) +void HWDrawList::SortWallIntoPlane(HWDrawInfo* di, FRenderState& state, SortNode * head, SortNode * sort) { HWFlat * fh = flats[drawitems[head->itemindex].index]; HWWall * ws = walls[drawitems[sort->itemindex].index]; @@ -304,8 +304,8 @@ void HWDrawList::SortWallIntoPlane(HWDrawInfo* di, SortNode * head, SortNode * s w->tcs[HWWall::UPLFT].v = ws->tcs[HWWall::LOLFT].v = w->tcs[HWWall::UPRGT].v = ws->tcs[HWWall::LORGT].v = newtexv; w->lightuv[HWWall::UPLFT].v = ws->lightuv[HWWall::LOLFT].v = w->lightuv[HWWall::UPRGT].v = ws->lightuv[HWWall::LORGT].v = newlmv; } - w->MakeVertices(di, *screen->RenderState(), false); - ws->MakeVertices(di, *screen->RenderState(), false); + w->MakeVertices(di, state, false); + ws->MakeVertices(di, state, false); } SortNode * sort2 = SortNodes.GetNew(); @@ -399,7 +399,7 @@ inline double CalcIntersectionVertex(HWWall *w1, HWWall * w2) return ((ay - cy)*(dx - cx) - (ax - cx)*(dy - cy)) / ((bx - ax)*(dy - cy) - (by - ay)*(dx - cx)); } -void HWDrawList::SortWallIntoWall(HWDrawInfo *di, SortNode * head,SortNode * sort) +void HWDrawList::SortWallIntoWall(HWDrawInfo *di, FRenderState& state, SortNode * head,SortNode * sort) { HWWall * wh= walls[drawitems[head->itemindex].index]; HWWall * ws= walls[drawitems[sort->itemindex].index]; @@ -451,8 +451,8 @@ void HWDrawList::SortWallIntoWall(HWDrawInfo *di, SortNode * head,SortNode * sor w->zbottom[0]=ws->zbottom[1]=izb; w->tcs[HWWall::LOLFT].u = w->tcs[HWWall::UPLFT].u = ws->tcs[HWWall::LORGT].u = ws->tcs[HWWall::UPRGT].u = iu; w->lightuv[HWWall::LOLFT].u = w->lightuv[HWWall::UPLFT].u = ws->lightuv[HWWall::LORGT].u = ws->lightuv[HWWall::UPRGT].u = iu; - ws->MakeVertices(di, *screen->RenderState(), false); - w->MakeVertices(di, *screen->RenderState(), false); + ws->MakeVertices(di, state, false); + w->MakeVertices(di, state, false); SortNode * sort2=SortNodes.GetNew(); memset(sort2,0,sizeof(SortNode)); @@ -490,7 +490,7 @@ inline double CalcIntersectionVertex(HWSprite *s, HWWall * w2) return ((ay - cy)*(dx - cx) - (ax - cx)*(dy - cy)) / ((bx - ax)*(dy - cy) - (by - ay)*(dx - cx)); } -void HWDrawList::SortSpriteIntoWall(HWDrawInfo *di, SortNode * head,SortNode * sort) +void HWDrawList::SortSpriteIntoWall(HWDrawInfo *di, FRenderState& state, SortNode * head,SortNode * sort) { HWWall *wh= walls[drawitems[head->itemindex].index]; HWSprite * ss= sprites[drawitems[sort->itemindex].index]; @@ -573,8 +573,8 @@ void HWDrawList::SortSpriteIntoWall(HWDrawInfo *di, SortNode * head,SortNode * s } else { - s->CreateVertices(di); - ss->CreateVertices(di); + s->CreateVertices(di, state); + ss->CreateVertices(di, state); } } @@ -633,7 +633,7 @@ SortNode * HWDrawList::SortSpriteList(SortNode * head) // // //========================================================================== -SortNode * HWDrawList::DoSort(HWDrawInfo *di, SortNode * head) +SortNode * HWDrawList::DoSort(HWDrawInfo *di, FRenderState& state, SortNode * head) { SortNode * node, * sn, * next; @@ -654,7 +654,7 @@ SortNode * HWDrawList::DoSort(HWDrawInfo *di, SortNode * head) break; case DrawType_WALL: - SortWallIntoPlane(di,head,node); + SortWallIntoPlane(di,state,head,node); break; case DrawType_SPRITE: @@ -679,11 +679,11 @@ SortNode * HWDrawList::DoSort(HWDrawInfo *di, SortNode * head) switch(drawitems[node->itemindex].rendertype) { case DrawType_WALL: - SortWallIntoWall(di, head,node); + SortWallIntoWall(di, state, head, node); break; case DrawType_SPRITE: - SortSpriteIntoWall(di, head, node); + SortSpriteIntoWall(di, state, head, node); break; case DrawType_FLAT: break; @@ -696,8 +696,8 @@ SortNode * HWDrawList::DoSort(HWDrawInfo *di, SortNode * head) return SortSpriteList(head); } } - if (head->left) head->left=DoSort(di, head->left); - if (head->right) head->right=DoSort(di, head->right); + if (head->left) head->left=DoSort(di, state, head->left); + if (head->right) head->right=DoSort(di, state, head->right); return sn; } @@ -706,12 +706,12 @@ SortNode * HWDrawList::DoSort(HWDrawInfo *di, SortNode * head) // // //========================================================================== -void HWDrawList::Sort(HWDrawInfo *di) +void HWDrawList::Sort(HWDrawInfo *di, FRenderState& state) { reverseSort = !!(di->Level->i_compatflags & COMPATF_SPRITESORT); SortZ = di->Viewpoint.Pos.Z; MakeSortList(); - sorted = DoSort(di, SortNodes[SortNodeStart]); + sorted = DoSort(di, state, SortNodes[SortNodeStart]); } //========================================================================== @@ -940,7 +940,7 @@ void HWDrawList::DrawSorted(HWDrawInfo *di, FRenderState &state) if (!sorted) { screen->mVertexData->Map(); - Sort(di); + Sort(di, state); screen->mVertexData->Unmap(); } state.ClearClipSplit(); diff --git a/src/rendering/hwrenderer/scene/hw_drawlist.h b/src/rendering/hwrenderer/scene/hw_drawlist.h index ee00ad91b..39a46910f 100644 --- a/src/rendering/hwrenderer/scene/hw_drawlist.h +++ b/src/rendering/hwrenderer/scene/hw_drawlist.h @@ -100,14 +100,14 @@ public: SortNode * FindSortPlane(SortNode * head); SortNode * FindSortWall(SortNode * head); void SortPlaneIntoPlane(SortNode * head,SortNode * sort); - void SortWallIntoPlane(HWDrawInfo* di, SortNode * head,SortNode * sort); + void SortWallIntoPlane(HWDrawInfo* di, FRenderState& state, SortNode * head,SortNode * sort); void SortSpriteIntoPlane(SortNode * head,SortNode * sort); - void SortWallIntoWall(HWDrawInfo *di, SortNode * head,SortNode * sort); - void SortSpriteIntoWall(HWDrawInfo *di, SortNode * head,SortNode * sort); + void SortWallIntoWall(HWDrawInfo *di, FRenderState& state, SortNode * head,SortNode * sort); + void SortSpriteIntoWall(HWDrawInfo *di, FRenderState& state, SortNode * head,SortNode * sort); int CompareSprites(SortNode * a,SortNode * b); SortNode * SortSpriteList(SortNode * head); - SortNode * DoSort(HWDrawInfo *di, SortNode * head); - void Sort(HWDrawInfo *di); + SortNode * DoSort(HWDrawInfo *di, FRenderState& state, SortNode * head); + void Sort(HWDrawInfo *di, FRenderState& state); void DoDraw(HWDrawInfo *di, FRenderState &state, bool translucent, int i); void Draw(HWDrawInfo *di, FRenderState &state, bool translucent); diff --git a/src/rendering/hwrenderer/scene/hw_drawlistadd.cpp b/src/rendering/hwrenderer/scene/hw_drawlistadd.cpp index 597cf014d..dac188763 100644 --- a/src/rendering/hwrenderer/scene/hw_drawlistadd.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawlistadd.cpp @@ -68,7 +68,7 @@ void HWDrawInfo::AddWall(HWWall *wall) // //========================================================================== -void HWDrawInfo::AddMirrorSurface(HWWall *w) +void HWDrawInfo::AddMirrorSurface(HWWall *w, FRenderState& state) { w->type = RENDERWALL_MIRRORSURFACE; auto newwall = drawlists[GLDL_TRANSLUCENTBORDER].NewWall(); @@ -81,14 +81,14 @@ void HWDrawInfo::AddMirrorSurface(HWWall *w) auto tcs = newwall->tcs; tcs[HWWall::LOLFT].u = tcs[HWWall::LORGT].u = tcs[HWWall::UPLFT].u = tcs[HWWall::UPRGT].u = v.X; tcs[HWWall::LOLFT].v = tcs[HWWall::LORGT].v = tcs[HWWall::UPLFT].v = tcs[HWWall::UPRGT].v = v.Z; - newwall->MakeVertices(this, *screen->RenderState(), false); + newwall->MakeVertices(this, state, false); bool hasDecals = newwall->seg->sidedef && newwall->seg->sidedef->AttachedDecals; if (hasDecals && Level->HasDynamicLights && !isFullbrightScene()) { newwall->SetupLights(this, lightdata); } - newwall->ProcessDecals(this); + newwall->ProcessDecals(this, state); newwall->dynlightindex = -1; // the environment map should not be affected by lights - only the decals. } diff --git a/src/rendering/hwrenderer/scene/hw_drawstructs.h b/src/rendering/hwrenderer/scene/hw_drawstructs.h index 38f8ec750..46013e89f 100644 --- a/src/rendering/hwrenderer/scene/hw_drawstructs.h +++ b/src/rendering/hwrenderer/scene/hw_drawstructs.h @@ -204,36 +204,36 @@ public: sector_t *frontsector, *backsector; //private: - void PutWall(HWDrawInfo *di, bool translucent); - void PutPortal(HWDrawInfo *di, int ptype, int plane); + void PutWall(HWDrawInfo *di, FRenderState& state, bool translucent); + void PutPortal(HWDrawInfo *di, FRenderState& state, int ptype, int plane); void CheckTexturePosition(FTexCoordInfo *tci); - void Put3DWall(HWDrawInfo *di, lightlist_t * lightlist, bool translucent); - bool SplitWallComplex(HWDrawInfo *di, sector_t * frontsector, bool translucent, float& maplightbottomleft, float& maplightbottomright); - void SplitWall(HWDrawInfo *di, sector_t * frontsector, bool translucent); + void Put3DWall(HWDrawInfo *di, FRenderState& state, lightlist_t * lightlist, bool translucent); + bool SplitWallComplex(HWDrawInfo *di, FRenderState& state, sector_t * frontsector, bool translucent, float& maplightbottomleft, float& maplightbottomright); + void SplitWall(HWDrawInfo *di, FRenderState& state, sector_t * frontsector, bool translucent); void SetupLights(HWDrawInfo *di, FDynLightData &lightdata); void MakeVertices(HWDrawInfo *di, FRenderState& state, bool nosplit); - void SkyPlane(HWDrawInfo *di, sector_t *sector, int plane, bool allowmirror); - void SkyLine(HWDrawInfo *di, sector_t *sec, line_t *line); - void SkyNormal(HWDrawInfo *di, sector_t * fs,vertex_t * v1,vertex_t * v2); - void SkyTop(HWDrawInfo *di, seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2); - void SkyBottom(HWDrawInfo *di, seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2); + void SkyPlane(HWDrawInfo *di, FRenderState& state, sector_t *sector, int plane, bool allowmirror); + void SkyLine(HWDrawInfo *di, FRenderState& state, sector_t *sec, line_t *line); + void SkyNormal(HWDrawInfo *di, FRenderState& state, sector_t * fs,vertex_t * v1,vertex_t * v2); + void SkyTop(HWDrawInfo *di, FRenderState& state, seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2); + void SkyBottom(HWDrawInfo *di, FRenderState& state, seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2); - bool DoHorizon(HWDrawInfo *di, seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2); + bool DoHorizon(HWDrawInfo *di, FRenderState& state, seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2); bool SetWallCoordinates(seg_t * seg, FTexCoordInfo *tci, float ceilingrefheight, float topleft, float topright, float bottomleft, float bottomright, float t_ofs); - void DoTexture(HWDrawInfo *di, int type,seg_t * seg,int peg, + void DoTexture(HWDrawInfo *di, FRenderState& state, int type,seg_t * seg,int peg, float ceilingrefheight, float floorrefheight, float CeilingHeightstart,float CeilingHeightend, float FloorHeightstart,float FloorHeightend, float v_offset); - void DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, + void DoMidTexture(HWDrawInfo *di, FRenderState& state, seg_t * seg, bool drawfogboundary, sector_t * front, sector_t * back, sector_t * realfront, sector_t * realback, float fch1, float fch2, float ffh1, float ffh2, @@ -241,21 +241,21 @@ public: void GetPlanePos(F3DFloor::planeref * planeref, float & left, float & right); - void BuildFFBlock(HWDrawInfo *di, seg_t * seg, F3DFloor * rover, int roverIndex, + void BuildFFBlock(HWDrawInfo *di, FRenderState& state, seg_t * seg, F3DFloor * rover, int roverIndex, float ff_topleft, float ff_topright, float ff_bottomleft, float ff_bottomright); - void InverseFloors(HWDrawInfo *di, seg_t * seg, sector_t * frontsector, + void InverseFloors(HWDrawInfo *di, FRenderState& state, seg_t * seg, sector_t * frontsector, float topleft, float topright, float bottomleft, float bottomright); - void ClipFFloors(HWDrawInfo *di, seg_t * seg, F3DFloor * ffloor, int ffloorIndex, sector_t * frontsector, + void ClipFFloors(HWDrawInfo *di, FRenderState& state, seg_t * seg, F3DFloor * ffloor, int ffloorIndex, sector_t * frontsector, float topleft, float topright, float bottomleft, float bottomright); - void DoFFloorBlocks(HWDrawInfo *di, seg_t * seg, sector_t * frontsector, sector_t * backsector, + void DoFFloorBlocks(HWDrawInfo *di, FRenderState& state, seg_t * seg, sector_t * frontsector, sector_t * backsector, float fch1, float fch2, float ffh1, float ffh2, float bch1, float bch2, float bfh1, float bfh2); - void ProcessDecal(HWDrawInfo *di, DBaseDecal *decal, const FVector3 &normal); - void ProcessDecals(HWDrawInfo *di); + void ProcessDecal(HWDrawInfo *di, FRenderState& state, DBaseDecal *decal, const FVector3 &normal); + void ProcessDecals(HWDrawInfo *di, FRenderState& state); int CreateVertices(FFlatVertex *&ptr, bool nosplit); void SplitLeftEdge (FFlatVertex *&ptr); @@ -276,8 +276,8 @@ public: void DrawDecalsForMirror(HWDrawInfo *di, FRenderState &state, TArray &decals); public: - void Process(HWDrawInfo *di, seg_t *seg, sector_t *frontsector, sector_t *backsector); - void ProcessLowerMiniseg(HWDrawInfo *di, seg_t *seg, sector_t *frontsector, sector_t *backsector); + void Process(HWDrawInfo *di, FRenderState& state, seg_t *seg, sector_t *frontsector, sector_t *backsector); + void ProcessLowerMiniseg(HWDrawInfo *di, FRenderState& state, seg_t *seg, sector_t *frontsector, sector_t *backsector); float PointOnSide(float x,float y) { @@ -324,9 +324,9 @@ public: void SetupLights(HWDrawInfo *di, FLightNode *head, FDynLightData &lightdata, int portalgroup); void PutFlat(HWDrawInfo *di, bool fog = false); - void Process(HWDrawInfo *di, sector_t * model, int whichplane, bool notexture); + void Process(HWDrawInfo *di, FRenderState& state, sector_t * model, int whichplane, bool notexture); void SetFrom3DFloor(F3DFloor *rover, bool top, bool underside); - void ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which = 7 /*SSRF_RENDERALL*/); // cannot use constant due to circular dependencies. + void ProcessSector(HWDrawInfo *di, FRenderState& state, sector_t * frontsector, int which = 7 /*SSRF_RENDERALL*/); // cannot use constant due to circular dependencies. void DrawSubsectors(HWDrawInfo *di, FRenderState &state); void DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent); @@ -380,16 +380,16 @@ public: DRotator Angles; - void SplitSprite(HWDrawInfo *di, sector_t * frontsector, bool translucent); + void SplitSprite(HWDrawInfo *di, FRenderState& state, sector_t * frontsector, bool translucent); void PerformSpriteClipAdjustment(AActor *thing, const DVector2 &thingpos, float spriteheight); bool CalculateVertices(HWDrawInfo *di, FVector3 *v, DVector3 *vp); public: - void CreateVertices(HWDrawInfo *di); - void PutSprite(HWDrawInfo *di, bool translucent); - void Process(HWDrawInfo *di, AActor* thing,sector_t * sector, area_t in_area, int thruportal = false, bool isSpriteShadow = false); - void ProcessParticle (HWDrawInfo *di, particle_t *particle, sector_t *sector);//, int shade, int fakeside) + void CreateVertices(HWDrawInfo *di, FRenderState& state); + void PutSprite(HWDrawInfo *di, FRenderState& state, bool translucent); + void Process(HWDrawInfo *di, FRenderState& state, AActor* thing,sector_t * sector, area_t in_area, int thruportal = false, bool isSpriteShadow = false); + void ProcessParticle (HWDrawInfo *di, FRenderState& state, particle_t *particle, sector_t *sector);//, int shade, int fakeside) void DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent); }; diff --git a/src/rendering/hwrenderer/scene/hw_flats.cpp b/src/rendering/hwrenderer/scene/hw_flats.cpp index 518f6b18c..4ba698b69 100644 --- a/src/rendering/hwrenderer/scene/hw_flats.cpp +++ b/src/rendering/hwrenderer/scene/hw_flats.cpp @@ -405,7 +405,7 @@ inline void HWFlat::PutFlat(HWDrawInfo *di, bool fog) // //========================================================================== -void HWFlat::Process(HWDrawInfo *di, sector_t * model, int whichplane, bool fog) +void HWFlat::Process(HWDrawInfo *di, FRenderState& state, sector_t * model, int whichplane, bool fog) { plane.GetFromSector(model, whichplane); if (whichplane != int(ceiling)) @@ -433,7 +433,7 @@ void HWFlat::Process(HWDrawInfo *di, sector_t * model, int whichplane, bool fog) z = plane.plane.ZatPoint(0.f, 0.f); if (sector->special == GLSector_Skybox) { - auto vert = screen->mVertexData->AllocVertices(4); + auto vert = state.AllocVertices(4); CreateSkyboxVertices(vert.first); iboindex = vert.second; } @@ -486,7 +486,7 @@ void HWFlat::SetFrom3DFloor(F3DFloor *rover, bool top, bool underside) // //========================================================================== -void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) +void HWFlat::ProcessSector(HWDrawInfo *di, FRenderState& state, sector_t * frontsector, int which) { lightlist_t * light; FSectorPortal *port; @@ -562,7 +562,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) CopyFrom3DLight(Colormap, light); } renderstyle = STYLE_Translucent; - Process(di, frontsector, sector_t::floor, false); + Process(di, state, frontsector, sector_t::floor, false); } } @@ -618,7 +618,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) CopyFrom3DLight(Colormap, light); } renderstyle = STYLE_Translucent; - Process(di, frontsector, sector_t::ceiling, false); + Process(di, state, frontsector, sector_t::ceiling, false); } } @@ -662,7 +662,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) { SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG)); Colormap.FadeColor = frontsector->Colormap.FadeColor; - Process(di, rover->top.model, rover->top.isceiling, !!(rover->flags&FF_FOG)); + Process(di, state, rover->top.model, rover->top.isceiling, !!(rover->flags&FF_FOG)); } lastceilingheight = ff_top; } @@ -676,7 +676,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) { SetFrom3DFloor(rover, false, !(rover->flags&FF_FOG)); Colormap.FadeColor = frontsector->Colormap.FadeColor; - Process(di, rover->bottom.model, rover->bottom.isceiling, !!(rover->flags&FF_FOG)); + Process(di, state, rover->bottom.model, rover->bottom.isceiling, !!(rover->flags&FF_FOG)); } lastceilingheight = ff_bottom; if (rover->alpha < 255) lastceilingheight += EQUAL_EPSILON; @@ -709,7 +709,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) Colormap = rover->GetColormap(); } - Process(di, rover->bottom.model, rover->bottom.isceiling, !!(rover->flags&FF_FOG)); + Process(di, state, rover->bottom.model, rover->bottom.isceiling, !!(rover->flags&FF_FOG)); } lastfloorheight = ff_bottom; } @@ -723,7 +723,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) { SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG)); Colormap.FadeColor = frontsector->Colormap.FadeColor; - Process(di, rover->top.model, rover->top.isceiling, !!(rover->flags&FF_FOG)); + Process(di, state, rover->top.model, rover->top.isceiling, !!(rover->flags&FF_FOG)); } lastfloorheight = ff_top; if (rover->alpha < 255) lastfloorheight -= EQUAL_EPSILON; diff --git a/src/rendering/hwrenderer/scene/hw_meshcache.cpp b/src/rendering/hwrenderer/scene/hw_meshcache.cpp index daa7a5d4a..0395a64de 100644 --- a/src/rendering/hwrenderer/scene/hw_meshcache.cpp +++ b/src/rendering/hwrenderer/scene/hw_meshcache.cpp @@ -77,6 +77,8 @@ void HWMeshCache::Update(FRenderViewpoint& vp) HWDrawInfo* di = HWDrawInfo::StartDrawInfo(vp.ViewLevel, nullptr, vp, nullptr); di->MeshBuilding = true; + MeshBuilder state; + // Add to the draw lists unsigned int count = level->sectors.Size(); @@ -96,7 +98,7 @@ void HWMeshCache::Update(FRenderViewpoint& vp) HWFlat flat; flat.section = subsector->section; sector_t* front = hw_FakeFlat(subsector->render_sector, area_default, false); - flat.ProcessSector(di, front); + flat.ProcessSector(di, state, front); } } @@ -106,14 +108,12 @@ void HWMeshCache::Update(FRenderViewpoint& vp) HWWall wall; wall.sub = sector->subsectors[0]; - wall.Process(di, side->segs[0], sector, (line->sidedef[0]->sector == sector) ? line->backsector : line->frontsector); + wall.Process(di, state, side->segs[0], sector, (line->sidedef[0]->sector == sector) ? line->backsector : line->frontsector); } } // Convert draw lists to meshes - MeshBuilder state; - state.SetDepthMask(true); state.EnableFog(true); state.SetRenderStyle(STYLE_Source); diff --git a/src/rendering/hwrenderer/scene/hw_portal.cpp b/src/rendering/hwrenderer/scene/hw_portal.cpp index aaf7ae06c..09e11e839 100644 --- a/src/rendering/hwrenderer/scene/hw_portal.cpp +++ b/src/rendering/hwrenderer/scene/hw_portal.cpp @@ -194,7 +194,7 @@ void HWPortal::DrawPortalStencil(FRenderState &state, int pass) screen->mVertexData->Map(); if (planesused & (1 << sector_t::floor)) { - auto verts = screen->mVertexData->AllocVertices(4); + auto verts = state.AllocVertices(4); auto ptr = verts.first; ptr[0].Set((float)boundingBox.left, -32767.f, (float)boundingBox.top, 0, 0); ptr[1].Set((float)boundingBox.right, -32767.f, (float)boundingBox.top, 0, 0); @@ -204,7 +204,7 @@ void HWPortal::DrawPortalStencil(FRenderState &state, int pass) } if (planesused & (1 << sector_t::ceiling)) { - auto verts = screen->mVertexData->AllocVertices(4); + auto verts = state.AllocVertices(4); auto ptr = verts.first; ptr[0].Set((float)boundingBox.left, 32767.f, (float)boundingBox.top, 0, 0); ptr[1].Set((float)boundingBox.right, 32767.f, (float)boundingBox.top, 0, 0); @@ -641,9 +641,9 @@ bool HWLineToLinePortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *cl return true; } -void HWLineToLinePortal::RenderAttached(HWDrawInfo *di) +void HWLineToLinePortal::RenderAttached(HWDrawInfo *di, FRenderState& state) { - di->ProcessActorsInPortal(glport, di->in_area); + di->ProcessActorsInPortal(glport, di->in_area, state); } const char *HWLineToLinePortal::GetName() { return "LineToLine"; } @@ -884,7 +884,7 @@ const char *HWPlaneMirrorPortal::GetName() { return origin->fC() < 0? "Planemirr //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -HWHorizonPortal::HWHorizonPortal(FPortalSceneState *s, HWHorizonInfo * pt, FRenderViewpoint &vp, bool local) +HWHorizonPortal::HWHorizonPortal(FPortalSceneState *s, FRenderState& renderstate, HWHorizonInfo * pt, FRenderViewpoint &vp, bool local) : HWPortal(s, local) { origin = pt; @@ -899,7 +899,7 @@ HWHorizonPortal::HWHorizonPortal(FPortalSceneState *s, HWHorizonInfo * pt, FRend // Draw to some far away boundary // This is not drawn as larger strips because it causes visual glitches. - auto verts = screen->mVertexData->AllocVertices(1024 + 10); + auto verts = renderstate.AllocVertices(1024 + 10); auto ptr = verts.first; for (int xx = -32768; xx < 32768; xx += 4096) { @@ -1044,7 +1044,7 @@ void HWEEHorizonPortal::DrawContents(HWDrawInfo *di, FRenderState &state) { horz.plane.Texheight = vp.Pos.Z + fabs(horz.plane.Texheight); } - HWHorizonPortal ceil(mState, &horz, di->Viewpoint, true); + HWHorizonPortal ceil(mState, state, &horz, di->Viewpoint, true); ceil.DrawContents(di, state); } if (sector->GetTexture(sector_t::floor) != skyflatnum) @@ -1058,7 +1058,7 @@ void HWEEHorizonPortal::DrawContents(HWDrawInfo *di, FRenderState &state) { horz.plane.Texheight = vp.Pos.Z - fabs(horz.plane.Texheight); } - HWHorizonPortal floor(mState, &horz, di->Viewpoint, true); + HWHorizonPortal floor(mState, state, &horz, di->Viewpoint, true); floor.DrawContents(di, state); } } diff --git a/src/rendering/hwrenderer/scene/hw_portal.h b/src/rendering/hwrenderer/scene/hw_portal.h index 3eebaee2d..218c09a15 100644 --- a/src/rendering/hwrenderer/scene/hw_portal.h +++ b/src/rendering/hwrenderer/scene/hw_portal.h @@ -82,7 +82,7 @@ public: virtual bool NeedCap() { return true; } virtual bool NeedDepthBuffer() { return true; } virtual void DrawContents(HWDrawInfo *di, FRenderState &state) = 0; - virtual void RenderAttached(HWDrawInfo *di) {} + virtual void RenderAttached(HWDrawInfo *di, FRenderState& state) {} void SetupStencil(HWDrawInfo *di, FRenderState &state, bool usestencil); void RemoveStencil(HWDrawInfo *di, FRenderState &state, bool usestencil); @@ -147,7 +147,7 @@ public: { if (Setup(di, state, di->mClipper)) { - di->DrawScene(DM_PORTAL); + di->DrawScene(DM_PORTAL, state); Shutdown(di, state); } else state.ClearScreen(); @@ -225,7 +225,7 @@ protected: virtual void * GetSource() const override { return glport; } virtual const char *GetName() override; virtual linebase_t *ClipLine() override { return this; } - virtual void RenderAttached(HWDrawInfo *di) override; + virtual void RenderAttached(HWDrawInfo *di, FRenderState& state) override; public: @@ -323,7 +323,7 @@ protected: public: - HWHorizonPortal(FPortalSceneState *state, HWHorizonInfo * pt, FRenderViewpoint &vp, bool local = false); + HWHorizonPortal(FPortalSceneState *state, FRenderState& renderstate, HWHorizonInfo * pt, FRenderViewpoint &vp, bool local = false); }; struct HWEEHorizonPortal : public HWPortal diff --git a/src/rendering/hwrenderer/scene/hw_renderhacks.cpp b/src/rendering/hwrenderer/scene/hw_renderhacks.cpp index d0775d109..12befc51c 100644 --- a/src/rendering/hwrenderer/scene/hw_renderhacks.cpp +++ b/src/rendering/hwrenderer/scene/hw_renderhacks.cpp @@ -48,7 +48,7 @@ // //========================================================================== -void HWDrawInfo::DispatchRenderHacks() +void HWDrawInfo::DispatchRenderHacks(FRenderState& state) { TMap::Pair *pair; TMap::Pair *fpair; @@ -58,28 +58,28 @@ void HWDrawInfo::DispatchRenderHacks() while (ofi.NextPair(pair)) { auto sec = hw_FakeFlat(&Level->sectors[pair->Key], in_area, false); - glflat.ProcessSector(this, sec, SSRF_RENDERFLOOR | SSRF_PLANEHACK); + glflat.ProcessSector(this, state, sec, SSRF_RENDERFLOOR | SSRF_PLANEHACK); } TMap::Iterator oci(otherCeilingPlanes); while (oci.NextPair(pair)) { auto sec = hw_FakeFlat(&Level->sectors[pair->Key], in_area, false); - glflat.ProcessSector(this, sec, SSRF_RENDERCEILING | SSRF_PLANEHACK); + glflat.ProcessSector(this, state, sec, SSRF_RENDERCEILING | SSRF_PLANEHACK); } TMap::Iterator ffi(floodFloorSegs); while (ffi.NextPair(fpair)) { auto sec = hw_FakeFlat(&Level->sectors[fpair->Key], in_area, false); - glflat.ProcessSector(this, sec, SSRF_RENDERFLOOR | SSRF_FLOODHACK); + glflat.ProcessSector(this, state, sec, SSRF_RENDERFLOOR | SSRF_FLOODHACK); } TMap::Iterator fci(floodCeilingSegs); while (fci.NextPair(fpair)) { auto sec = hw_FakeFlat(&Level->sectors[fpair->Key], in_area, false); - glflat.ProcessSector(this, sec, SSRF_RENDERCEILING | SSRF_FLOODHACK); + glflat.ProcessSector(this, state, sec, SSRF_RENDERCEILING | SSRF_FLOODHACK); } } @@ -144,9 +144,9 @@ int HWDrawInfo::SetupLightsForOtherPlane(subsector_t * sub, FDynLightData &light // //========================================================================== -int HWDrawInfo::CreateOtherPlaneVertices(subsector_t *sub, const secplane_t *plane) +int HWDrawInfo::CreateOtherPlaneVertices(subsector_t *sub, const secplane_t *plane, FRenderState& state) { - auto alloc = screen->mVertexData->AllocVertices(sub->numlines); + auto alloc = state.AllocVertices(sub->numlines); auto ptr = alloc.first; for (unsigned int k = 0; k < sub->numlines; k++) { @@ -167,23 +167,23 @@ int HWDrawInfo::CreateOtherPlaneVertices(subsector_t *sub, const secplane_t *pla // //========================================================================== -void HWDrawInfo::AddOtherFloorPlane(int sector, gl_subsectorrendernode * node) +void HWDrawInfo::AddOtherFloorPlane(int sector, gl_subsectorrendernode* node, FRenderState& state) { auto pNode = otherFloorPlanes.CheckKey(sector); node->next = pNode? *pNode : nullptr; node->lightindex = SetupLightsForOtherPlane(node->sub, lightdata, &Level->sectors[sector].floorplane); - node->vertexindex = CreateOtherPlaneVertices(node->sub, &Level->sectors[sector].floorplane); + node->vertexindex = CreateOtherPlaneVertices(node->sub, &Level->sectors[sector].floorplane, state); otherFloorPlanes[sector] = node; } -void HWDrawInfo::AddOtherCeilingPlane(int sector, gl_subsectorrendernode * node) +void HWDrawInfo::AddOtherCeilingPlane(int sector, gl_subsectorrendernode* node, FRenderState& state) { auto pNode = otherCeilingPlanes.CheckKey(sector); node->next = pNode? *pNode : nullptr; node->lightindex = SetupLightsForOtherPlane(node->sub, lightdata, &Level->sectors[sector].ceilingplane); - node->vertexindex = CreateOtherPlaneVertices(node->sub, &Level->sectors[sector].ceilingplane); + node->vertexindex = CreateOtherPlaneVertices(node->sub, &Level->sectors[sector].ceilingplane, state); otherCeilingPlanes[sector] = node; } @@ -536,7 +536,7 @@ bool HWDrawInfo::DoFakeCeilingBridge(subsector_t * subsec, float Planez, area_t // Draws the fake planes // //========================================================================== -void HWDrawInfo::HandleMissingTextures(area_t in_area) +void HWDrawInfo::HandleMissingTextures(area_t in_area, FRenderState& state) { for (unsigned int i = 0; i < MissingUpperTextures.Size(); i++) { @@ -557,7 +557,7 @@ void HWDrawInfo::HandleMissingTextures(area_t in_area) gl_subsectorrendernode * node = NewSubsectorRenderNode(); node->sub = HandledSubsectors[j]; - AddOtherCeilingPlane(sec->sectornum, node); + AddOtherCeilingPlane(sec->sectornum, node, state); } if (HandledSubsectors.Size() != 1) @@ -597,7 +597,7 @@ void HWDrawInfo::HandleMissingTextures(area_t in_area) { gl_subsectorrendernode * node = NewSubsectorRenderNode(); node->sub = HandledSubsectors[j]; - AddOtherCeilingPlane(fakesector->sectornum, node); + AddOtherCeilingPlane(fakesector->sectornum, node, state); } } continue; @@ -623,7 +623,7 @@ void HWDrawInfo::HandleMissingTextures(area_t in_area) { gl_subsectorrendernode * node = NewSubsectorRenderNode(); node->sub = HandledSubsectors[j]; - AddOtherFloorPlane(sec->sectornum, node); + AddOtherFloorPlane(sec->sectornum, node, state); } if (HandledSubsectors.Size() != 1) @@ -663,7 +663,7 @@ void HWDrawInfo::HandleMissingTextures(area_t in_area) { gl_subsectorrendernode * node = NewSubsectorRenderNode(); node->sub = HandledSubsectors[j]; - AddOtherFloorPlane(fakesector->sectornum, node); + AddOtherFloorPlane(fakesector->sectornum, node, state); } } continue; @@ -724,7 +724,7 @@ void HWDrawInfo::CreateFloodPoly(wallseg * ws, FFlatVertex *vertices, float plan // //========================================================================== -void HWDrawInfo::PrepareUpperGap(seg_t * seg) +void HWDrawInfo::PrepareUpperGap(seg_t * seg, FRenderState& state) { wallseg ws; sector_t * fakefsector = hw_FakeFlat(seg->frontsector, in_area, false); @@ -759,7 +759,7 @@ void HWDrawInfo::PrepareUpperGap(seg_t * seg) ws.z1 = frontz; ws.z2 = backz; - auto vertices = screen->mVertexData->AllocVertices(8); + auto vertices = state.AllocVertices(8); CreateFloodStencilPoly(&ws, vertices.first); CreateFloodPoly(&ws, vertices.first+4, ws.z2, fakebsector, true); @@ -780,7 +780,7 @@ void HWDrawInfo::PrepareUpperGap(seg_t * seg) // //========================================================================== -void HWDrawInfo::PrepareLowerGap(seg_t * seg) +void HWDrawInfo::PrepareLowerGap(seg_t * seg, FRenderState& state) { wallseg ws; sector_t * fakefsector = hw_FakeFlat(seg->frontsector, in_area, false); @@ -816,7 +816,7 @@ void HWDrawInfo::PrepareLowerGap(seg_t * seg) ws.z2 = frontz; ws.z1 = backz; - auto vertices = screen->mVertexData->AllocVertices(8); + auto vertices = state.AllocVertices(8); CreateFloodStencilPoly(&ws, vertices.first); CreateFloodPoly(&ws, vertices.first+4, ws.z1, fakebsector, false); @@ -837,7 +837,7 @@ void HWDrawInfo::PrepareLowerGap(seg_t * seg) // //========================================================================== -void HWDrawInfo::PrepareUnhandledMissingTextures() +void HWDrawInfo::PrepareUnhandledMissingTextures(FRenderState& state) { if (!Level->notexturefill) { @@ -860,7 +860,7 @@ void HWDrawInfo::PrepareUnhandledMissingTextures() if (seg->backsector->GetTexture(sector_t::ceiling) == skyflatnum) continue; if (seg->backsector->ValidatePortal(sector_t::ceiling) != NULL) continue; - PrepareUpperGap(seg); + PrepareUpperGap(seg, state); } validcount++; @@ -878,7 +878,7 @@ void HWDrawInfo::PrepareUnhandledMissingTextures() if (seg->backsector->GetTexture(sector_t::floor) == skyflatnum) continue; if (seg->backsector->ValidatePortal(sector_t::floor) != NULL) continue; - PrepareLowerGap(seg); + PrepareLowerGap(seg, state); } } MissingUpperTextures.Clear(); @@ -1111,19 +1111,19 @@ bool HWDrawInfo::CollectSubsectorsCeiling(subsector_t * sub, sector_t * anchor) // //========================================================================== -void HWDrawInfo::ProcessLowerMinisegs(TArray &lowersegs) +void HWDrawInfo::ProcessLowerMinisegs(TArray &lowersegs, FRenderState& state) { for(unsigned int j=0;jSubsector->render_sector, seg->PartnerSeg->Subsector->render_sector); + wall.ProcessLowerMiniseg(this, state, seg, seg->Subsector->render_sector, seg->PartnerSeg->Subsector->render_sector); rendered_lines++; } } -void HWDrawInfo::HandleHackedSubsectors() +void HWDrawInfo::HandleHackedSubsectors(FRenderState& state) { viewsubsector = Level->PointInRenderSubsector(Viewpoint.Pos); @@ -1144,9 +1144,9 @@ void HWDrawInfo::HandleHackedSubsectors() { gl_subsectorrendernode * node = NewSubsectorRenderNode(); node->sub = HandledSubsectors[j]; - AddOtherFloorPlane(sub->render_sector->sectornum, node); + AddOtherFloorPlane(sub->render_sector->sectornum, node, state); } - if (inview) ProcessLowerMinisegs(lowersegs); + if (inview) ProcessLowerMinisegs(lowersegs, state); } } } @@ -1166,7 +1166,7 @@ void HWDrawInfo::HandleHackedSubsectors() { gl_subsectorrendernode * node = NewSubsectorRenderNode(); node->sub = HandledSubsectors[j]; - AddOtherCeilingPlane(sub->render_sector->sectornum, node); + AddOtherCeilingPlane(sub->render_sector->sectornum, node, state); } } } diff --git a/src/rendering/hwrenderer/scene/hw_sky.cpp b/src/rendering/hwrenderer/scene/hw_sky.cpp index 5e4fc02ef..5382931a1 100644 --- a/src/rendering/hwrenderer/scene/hw_sky.cpp +++ b/src/rendering/hwrenderer/scene/hw_sky.cpp @@ -111,7 +111,7 @@ void HWSkyInfo::init(HWDrawInfo *di, int sky1, PalEntry FadeColor) // //========================================================================== -void HWWall::SkyPlane(HWDrawInfo *di, sector_t *sector, int plane, bool allowreflect) +void HWWall::SkyPlane(HWDrawInfo *di, FRenderState& state, sector_t *sector, int plane, bool allowreflect) { int ptype = -1; @@ -125,7 +125,7 @@ void HWWall::SkyPlane(HWDrawInfo *di, sector_t *sector, int plane, bool allowref skyinfo.init(di, sector->sky, Colormap.FadeColor); ptype = PORTALTYPE_SKY; sky = &skyinfo; - PutPortal(di, ptype, plane); + PutPortal(di, state, ptype, plane); } else if (sportal != nullptr) { @@ -165,7 +165,7 @@ void HWWall::SkyPlane(HWDrawInfo *di, sector_t *sector, int plane, bool allowref } if (ptype != -1) { - PutPortal(di, ptype, plane); + PutPortal(di, state, ptype, plane); } } @@ -176,7 +176,7 @@ void HWWall::SkyPlane(HWDrawInfo *di, sector_t *sector, int plane, bool allowref // //========================================================================== -void HWWall::SkyLine(HWDrawInfo *di, sector_t *fs, line_t *line) +void HWWall::SkyLine(HWDrawInfo *di, FRenderState& state, sector_t *fs, line_t *line) { FSectorPortal *secport = line->GetTransferredPortal(); HWSkyInfo skyinfo; @@ -200,7 +200,7 @@ void HWWall::SkyLine(HWDrawInfo *di, sector_t *fs, line_t *line) ztop[1] = zceil[1]; zbottom[0] = zfloor[0]; zbottom[1] = zfloor[1]; - PutPortal(di, ptype, -1); + PutPortal(di, state, ptype, -1); } @@ -210,17 +210,17 @@ void HWWall::SkyLine(HWDrawInfo *di, sector_t *fs, line_t *line) // //========================================================================== -void HWWall::SkyNormal(HWDrawInfo *di, sector_t * fs,vertex_t * v1,vertex_t * v2) +void HWWall::SkyNormal(HWDrawInfo *di, FRenderState& state, sector_t * fs,vertex_t * v1,vertex_t * v2) { ztop[0]=ztop[1]=32768.0f; zbottom[0]=zceil[0]; zbottom[1]=zceil[1]; - SkyPlane(di, fs, sector_t::ceiling, true); + SkyPlane(di, state, fs, sector_t::ceiling, true); ztop[0]=zfloor[0]; ztop[1]=zfloor[1]; zbottom[0]=zbottom[1]=-32768.0f; - SkyPlane(di, fs, sector_t::floor, true); + SkyPlane(di, state, fs, sector_t::floor, true); } //========================================================================== @@ -229,7 +229,7 @@ void HWWall::SkyNormal(HWDrawInfo *di, sector_t * fs,vertex_t * v1,vertex_t * v2 // //========================================================================== -void HWWall::SkyTop(HWDrawInfo *di, seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2) +void HWWall::SkyTop(HWDrawInfo *di, FRenderState& state, seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2) { if (fs->GetTexture(sector_t::ceiling)==skyflatnum) { @@ -259,7 +259,7 @@ void HWWall::SkyTop(HWDrawInfo *di, seg_t * seg,sector_t * fs,sector_t * bs,vert ztop[0]=ztop[1]=32768.0f; zbottom[0]=zbottom[1]= bs->ceilingplane.ZatPoint(v2) + seg->sidedef->GetTextureYOffset(side_t::mid); - SkyPlane(di, fs, sector_t::ceiling, false); + SkyPlane(di, state, fs, sector_t::ceiling, false); return; } } @@ -313,7 +313,7 @@ void HWWall::SkyTop(HWDrawInfo *di, seg_t * seg,sector_t * fs,sector_t * bs,vert } - SkyPlane(di, fs, sector_t::ceiling, true); + SkyPlane(di, state, fs, sector_t::ceiling, true); } @@ -323,7 +323,7 @@ void HWWall::SkyTop(HWDrawInfo *di, seg_t * seg,sector_t * fs,sector_t * bs,vert // //========================================================================== -void HWWall::SkyBottom(HWDrawInfo *di, seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2) +void HWWall::SkyBottom(HWDrawInfo *di, FRenderState& state, seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2) { if (fs->GetTexture(sector_t::floor)==skyflatnum) { @@ -391,6 +391,6 @@ void HWWall::SkyBottom(HWDrawInfo *di, seg_t * seg,sector_t * fs,sector_t * bs,v ztop[1] = fs->floorplane.ZatPoint(v2); } - SkyPlane(di, fs, sector_t::floor, true); + SkyPlane(di, state, fs, sector_t::floor, true); } diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index f38009a9c..f72ae62b4 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -278,7 +278,7 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) if (screen->BuffersArePersistent()) { - CreateVertices(di); + CreateVertices(di, state); } if (polyoffset) { @@ -372,12 +372,12 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) for (int i = 0; i < 12; i++) { - auto vert = screen->mVertexData->AllocVertices(2); + auto vert = state.AllocVertices(2); auto vp = vert.first; unsigned int vertexindex = vert.second; vp[0].Set(actor->X() + actor->radius * scales[i][0], actor->Z() + actor->Height * scales[i][1], actor->Y() + actor->radius * scales[i][2], 0.0f, 0.0f); vp[1].Set(actor->X() + actor->radius * scales[i][3], actor->Z() + actor->Height * scales[i][4], actor->Y() + actor->radius * scales[i][5], 0.0f, 0.0f); - screen->RenderState()->Draw(DT_Lines, vertexindex, 2); + state.Draw(DT_Lines, vertexindex, 2); } state.EnableTexture(true); @@ -546,7 +546,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo *di, FVector3 *v, DVector3 *vp) // //========================================================================== -inline void HWSprite::PutSprite(HWDrawInfo *di, bool translucent) +inline void HWSprite::PutSprite(HWDrawInfo *di, FRenderState& state, bool translucent) { // That's a lot of checks... if (modelframe && !modelframe->isVoxel && !(modelframe->flags & MDL_NOPERPIXELLIGHTING) && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright) @@ -560,7 +560,7 @@ inline void HWSprite::PutSprite(HWDrawInfo *di, bool translucent) vertexindex = -1; if (!screen->BuffersArePersistent()) { - CreateVertices(di); + CreateVertices(di, state); } di->AddSprite(this, translucent); } @@ -571,13 +571,13 @@ inline void HWSprite::PutSprite(HWDrawInfo *di, bool translucent) // //========================================================================== -void HWSprite::CreateVertices(HWDrawInfo *di) +void HWSprite::CreateVertices(HWDrawInfo *di, FRenderState& state) { if (modelframe == nullptr) { FVector3 v[4]; polyoffset = CalculateVertices(di, v, &di->Viewpoint.Pos); - auto vert = screen->mVertexData->AllocVertices(4); + auto vert = state.AllocVertices(4); auto vp = vert.first; vertexindex = vert.second; @@ -596,7 +596,7 @@ void HWSprite::CreateVertices(HWDrawInfo *di) // //========================================================================== -void HWSprite::SplitSprite(HWDrawInfo *di, sector_t * frontsector, bool translucent) +void HWSprite::SplitSprite(HWDrawInfo *di, FRenderState& state, sector_t * frontsector, bool translucent) { HWSprite copySprite; double lightbottom; @@ -633,7 +633,7 @@ void HWSprite::SplitSprite(HWDrawInfo *di, sector_t * frontsector, bool transluc z1=copySprite.z2=lightbottom; vt=copySprite.vb=copySprite.vt+ (lightbottom-copySprite.z1)*(copySprite.vb-copySprite.vt)/(z2-copySprite.z1); - copySprite.PutSprite(di, translucent); + copySprite.PutSprite(di, state, translucent); put=true; } } @@ -745,7 +745,7 @@ void HWSprite::PerformSpriteClipAdjustment(AActor *thing, const DVector2 &thingp // //========================================================================== -void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t in_area, int thruportal, bool isSpriteShadow) +void HWSprite::Process(HWDrawInfo *di, FRenderState& state, AActor* thing, sector_t * sector, area_t in_area, int thruportal, bool isSpriteShadow) { sector_t rs; sector_t * rendersector; @@ -1272,7 +1272,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t lightlist = nullptr; if (!drawWithXYBillboard && !modelframe) { - SplitSprite(di, thing->Sector, hw_styleflags != STYLEHW_Solid); + SplitSprite(di, state, thing->Sector, hw_styleflags != STYLEHW_Solid); } } else @@ -1285,7 +1285,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t lightlist = nullptr; } - PutSprite(di, hw_styleflags != STYLEHW_Solid); + PutSprite(di, state, hw_styleflags != STYLEHW_Solid); rendered_sprites++; } @@ -1296,7 +1296,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t // //========================================================================== -void HWSprite::ProcessParticle (HWDrawInfo *di, particle_t *particle, sector_t *sector)//, int shade, int fakeside) +void HWSprite::ProcessParticle (HWDrawInfo *di, FRenderState& state, particle_t *particle, sector_t *sector)//, int shade, int fakeside) { if (particle->alpha==0) return; @@ -1439,7 +1439,7 @@ void HWSprite::ProcessParticle (HWDrawInfo *di, particle_t *particle, sector_t * else lightlist = nullptr; - PutSprite(di, hw_styleflags != STYLEHW_Solid); + PutSprite(di, state, hw_styleflags != STYLEHW_Solid); rendered_sprites++; } @@ -1449,7 +1449,7 @@ void HWSprite::ProcessParticle (HWDrawInfo *di, particle_t *particle, sector_t * // //========================================================================== -void HWDrawInfo::ProcessActorsInPortal(FLinePortalSpan *glport, area_t in_area) +void HWDrawInfo::ProcessActorsInPortal(FLinePortalSpan *glport, area_t in_area, FRenderState& state) { TMap processcheck; if (glport->validcount == validcount) return; // only process once per frame @@ -1519,11 +1519,11 @@ void HWDrawInfo::ProcessActorsInPortal(FLinePortalSpan *glport, area_t in_area) // [Nash] draw sprite shadow if (R_ShouldDrawSpriteShadow(th)) { - spr.Process(this, th, hw_FakeFlat(th->Sector, in_area, false, &fakesector), in_area, 2, true); + spr.Process(this, state, th, hw_FakeFlat(th->Sector, in_area, false, &fakesector), in_area, 2, true); } // This is called from the worker thread and must not alter the fake sector cache. - spr.Process(this, th, hw_FakeFlat(th->Sector, in_area, false, &fakesector), in_area, 2); + spr.Process(this, state, th, hw_FakeFlat(th->Sector, in_area, false, &fakesector), in_area, 2); th->Angles.Yaw = savedangle; th->SetXYZ(savedpos); th->Prev -= newpos - savedpos; diff --git a/src/rendering/hwrenderer/scene/hw_walls.cpp b/src/rendering/hwrenderer/scene/hw_walls.cpp index 4df4342c3..429cb9dc6 100644 --- a/src/rendering/hwrenderer/scene/hw_walls.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls.cpp @@ -493,7 +493,7 @@ const char HWWall::passflag[] = { // // //========================================================================== -void HWWall::PutWall(HWDrawInfo *di, bool translucent) +void HWWall::PutWall(HWDrawInfo *di, FRenderState& state, bool translucent) { if (texture && texture->GetTranslucency() && passflag[type] == 2) { @@ -523,7 +523,7 @@ void HWWall::PutWall(HWDrawInfo *di, bool translucent) { SetupLights(di, lightdata); } - MakeVertices(di, *screen->RenderState(), translucent); + MakeVertices(di, state, translucent); } @@ -544,7 +544,7 @@ void HWWall::PutWall(HWDrawInfo *di, bool translucent) SetupLights(di, lightdata); } } - ProcessDecals(di); + ProcessDecals(di, state); } @@ -563,14 +563,14 @@ void HWWall::PutWall(HWDrawInfo *di, bool translucent) // //========================================================================== -void HWWall::PutPortal(HWDrawInfo *di, int ptype, int plane) +void HWWall::PutPortal(HWDrawInfo *di, FRenderState& state, int ptype, int plane) { if (di->MeshBuilding) return; HWPortal * portal = nullptr; - MakeVertices(di, *screen->RenderState(), false); + MakeVertices(di, state, false); switch (ptype) { // portals don't go into the draw list. @@ -580,7 +580,7 @@ void HWWall::PutPortal(HWDrawInfo *di, int ptype, int plane) portal = di->FindPortal(horizon); if (!portal) { - portal = new HWHorizonPortal(&portalState, horizon, di->Viewpoint); + portal = new HWHorizonPortal(&portalState, state, horizon, di->Viewpoint); di->Portals.Push(portal); } portal->AddLine(this); @@ -636,7 +636,7 @@ void HWWall::PutPortal(HWDrawInfo *di, int ptype, int plane) if (gl_mirror_envmap) { // draw a reflective layer over the mirror - di->AddMirrorSurface(this); + di->AddMirrorSurface(this, state); } break; @@ -649,7 +649,7 @@ void HWWall::PutPortal(HWDrawInfo *di, int ptype, int plane) line_t *otherside = lineportal->lines[0]->mDestination; if (otherside != nullptr && otherside->portalindex < di->Level->linePortals.Size()) { - di->ProcessActorsInPortal(otherside->getPortal()->mGroup, di->in_area); + di->ProcessActorsInPortal(otherside->getPortal()->mGroup, di->in_area, state); } portal = new HWLineToLinePortal(&portalState, lineportal); di->Portals.Push(portal); @@ -682,7 +682,7 @@ void HWWall::PutPortal(HWDrawInfo *di, int ptype, int plane) // //========================================================================== -void HWWall::Put3DWall(HWDrawInfo *di, lightlist_t * lightlist, bool translucent) +void HWWall::Put3DWall(HWDrawInfo *di, FRenderState& state, lightlist_t * lightlist, bool translucent) { // only modify the light di->Level-> if it doesn't originate from the seg's frontsector. This is to account for light transferring effects if (lightlist->p_lightlevel != &seg->sidedef->sector->lightlevel) @@ -692,7 +692,7 @@ void HWWall::Put3DWall(HWDrawInfo *di, lightlist_t * lightlist, bool translucent // relative light won't get changed here. It is constant across the entire wall. CopyFrom3DLight(Colormap, lightlist); - PutWall(di, translucent); + PutWall(di, state, translucent); } //========================================================================== @@ -702,7 +702,7 @@ void HWWall::Put3DWall(HWDrawInfo *di, lightlist_t * lightlist, bool translucent // //========================================================================== -bool HWWall::SplitWallComplex(HWDrawInfo *di, sector_t * frontsector, bool translucent, float& maplightbottomleft, float& maplightbottomright) +bool HWWall::SplitWallComplex(HWDrawInfo *di, FRenderState& state, sector_t * frontsector, bool translucent, float& maplightbottomleft, float& maplightbottomright) { // check for an intersection with the upper plane if ((maplightbottomleftztop[1]) || @@ -742,8 +742,8 @@ bool HWWall::SplitWallComplex(HWDrawInfo *di, sector_t * frontsector, bool trans copyWall1.lightuv[LORGT].u = copyWall2.lightuv[LOLFT].u = lightuv[LOLFT].u + coeff * (lightuv[LORGT].u - lightuv[LOLFT].u); copyWall1.lightuv[LORGT].v = copyWall2.lightuv[LOLFT].v = lightuv[LOLFT].v + coeff * (lightuv[LORGT].v - lightuv[LOLFT].v); - copyWall1.SplitWall(di, frontsector, translucent); - copyWall2.SplitWall(di, frontsector, translucent); + copyWall1.SplitWall(di, state, frontsector, translucent); + copyWall2.SplitWall(di, state, frontsector, translucent); return true; } } @@ -787,8 +787,8 @@ bool HWWall::SplitWallComplex(HWDrawInfo *di, sector_t * frontsector, bool trans copyWall1.lightuv[LORGT].u = copyWall2.lightuv[LOLFT].u = lightuv[LOLFT].u + coeff * (lightuv[LORGT].u - lightuv[LOLFT].u); copyWall1.lightuv[LORGT].v = copyWall2.lightuv[LOLFT].v = lightuv[LOLFT].v + coeff * (lightuv[LORGT].v - lightuv[LOLFT].v); - copyWall1.SplitWall(di, frontsector, translucent); - copyWall2.SplitWall(di, frontsector, translucent); + copyWall1.SplitWall(di, state, frontsector, translucent); + copyWall2.SplitWall(di, state, frontsector, translucent); return true; } } @@ -796,7 +796,7 @@ bool HWWall::SplitWallComplex(HWDrawInfo *di, sector_t * frontsector, bool trans return false; } -void HWWall::SplitWall(HWDrawInfo *di, sector_t * frontsector, bool translucent) +void HWWall::SplitWall(HWDrawInfo *di, FRenderState& state, sector_t * frontsector, bool translucent) { float maplightbottomleft; float maplightbottomright; @@ -850,12 +850,12 @@ void HWWall::SplitWall(HWDrawInfo *di, sector_t * frontsector, bool translucent) { // Use hardware clipping if this cannot be done cleanly. this->lightlist = &lightlist; - PutWall(di, translucent); + PutWall(di, state, translucent); goto out; } // crappy fallback if no clip planes available - else if (SplitWallComplex(di, frontsector, translucent, maplightbottomleft, maplightbottomright)) + else if (SplitWallComplex(di, state, frontsector, translucent, maplightbottomleft, maplightbottomright)) { goto out; } @@ -864,7 +864,7 @@ void HWWall::SplitWall(HWDrawInfo *di, sector_t * frontsector, bool translucent) // 3D floor is completely within this light if (maplightbottomleft<=zbottom[0] && maplightbottomright<=zbottom[1]) { - Put3DWall(di, &lightlist[i], translucent); + Put3DWall(di, state, &lightlist[i], translucent); goto out; } @@ -885,7 +885,7 @@ void HWWall::SplitWall(HWDrawInfo *di, sector_t * frontsector, bool translucent) (maplightbottomleft-copyWall1.ztop[0])*(copyWall1.lightuv[LOLFT].v-copyWall1.lightuv[UPLFT].v)/(zbottom[0]-copyWall1.ztop[0]); lightuv[UPRGT].v=copyWall1.lightuv[LORGT].v=copyWall1.lightuv[UPRGT].v+ (maplightbottomright-copyWall1.ztop[1])*(copyWall1.lightuv[LORGT].v-copyWall1.lightuv[UPRGT].v)/(zbottom[1]-copyWall1.ztop[1]); - copyWall1.Put3DWall(di, &lightlist[i], translucent); + copyWall1.Put3DWall(di, state, &lightlist[i], translucent); } if (ztop[0]==zbottom[0] && ztop[1]==zbottom[1]) { @@ -895,7 +895,7 @@ void HWWall::SplitWall(HWDrawInfo *di, sector_t * frontsector, bool translucent) } } - Put3DWall(di, &lightlist[lightlist.Size()-1], translucent); + Put3DWall(di, state, &lightlist[lightlist.Size()-1], translucent); out: lightlevel=origlight; @@ -911,7 +911,7 @@ out: // // //========================================================================== -bool HWWall::DoHorizon(HWDrawInfo *di, seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2) +bool HWWall::DoHorizon(HWDrawInfo *di, FRenderState& state, seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2) { HWHorizonInfo hi; lightlist_t * light; @@ -928,7 +928,7 @@ bool HWWall::DoHorizon(HWDrawInfo *di, seg_t * seg,sector_t * fs, vertex_t * v1, if (fs->GetTexture(sector_t::ceiling) == skyflatnum) { - SkyPlane(di, fs, sector_t::ceiling, false); + SkyPlane(di, state, fs, sector_t::ceiling, false); } else { @@ -947,7 +947,7 @@ bool HWWall::DoHorizon(HWDrawInfo *di, seg_t * seg,sector_t * fs, vertex_t * v1, if (di->isFullbrightScene()) hi.colormap.Clear(); horizon = &hi; - PutPortal(di, PORTALTYPE_HORIZON, -1); + PutPortal(di, state, PORTALTYPE_HORIZON, -1); } ztop[1] = ztop[0] = zbottom[0]; } @@ -957,7 +957,7 @@ bool HWWall::DoHorizon(HWDrawInfo *di, seg_t * seg,sector_t * fs, vertex_t * v1, zbottom[1] = zbottom[0] = fs->GetPlaneTexZ(sector_t::floor); if (fs->GetTexture(sector_t::floor) == skyflatnum) { - SkyPlane(di, fs, sector_t::floor, false); + SkyPlane(di, state, fs, sector_t::floor, false); } else { @@ -976,7 +976,7 @@ bool HWWall::DoHorizon(HWDrawInfo *di, seg_t * seg,sector_t * fs, vertex_t * v1, if (di->isFullbrightScene()) hi.colormap.Clear(); horizon = &hi; - PutPortal(di, PORTALTYPE_HORIZON, -1); + PutPortal(di, state, PORTALTYPE_HORIZON, -1); } } return true; @@ -1228,7 +1228,7 @@ static void GetTexCoordInfo(FGameTexture *tex, FTexCoordInfo *tci, side_t *side, // Handle one sided walls, upper and lower texture // //========================================================================== -void HWWall::DoTexture(HWDrawInfo *di, int _type,seg_t * seg, int peg, +void HWWall::DoTexture(HWDrawInfo *di, FRenderState& state, int _type,seg_t * seg, int peg, float ceilingrefheight,float floorrefheight, float topleft,float topright, float bottomleft,float bottomright, @@ -1278,7 +1278,7 @@ void HWWall::DoTexture(HWDrawInfo *di, int _type,seg_t * seg, int peg, if (seg->linedef->special == Line_Mirror && _type == RENDERWALL_M1S && gl_mirrors) { - PutPortal(di, PORTALTYPE_MIRROR, -1); + PutPortal(di, state, PORTALTYPE_MIRROR, -1); } else { @@ -1287,8 +1287,8 @@ void HWWall::DoTexture(HWDrawInfo *di, int _type,seg_t * seg, int peg, // Add this wall to the render list sector_t * sec = sub ? sub->sector : seg->frontsector; - if (sec->e->XFloor.lightlist.Size()==0 || di->isFullbrightScene()) PutWall(di, false); - else SplitWall(di, sec, false); + if (sec->e->XFloor.lightlist.Size()==0 || di->isFullbrightScene()) PutWall(di, state, false); + else SplitWall(di, state, sec, false); } glseg = glsave; @@ -1302,7 +1302,7 @@ void HWWall::DoTexture(HWDrawInfo *di, int _type,seg_t * seg, int peg, // //========================================================================== -void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, +void HWWall::DoMidTexture(HWDrawInfo *di, FRenderState& state, seg_t * seg, bool drawfogboundary, sector_t * front, sector_t * back, sector_t * realfront, sector_t * realback, float fch1, float fch2, float ffh1, float ffh2, @@ -1516,7 +1516,7 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, type=RENDERWALL_FOGBOUNDARY; auto savetex = texture; texture = NULL; - PutWall(di, true); + PutWall(di, state, true); if (!savetex) { flags &= ~(HWF_NOSPLITUPPER|HWF_NOSPLITLOWER); @@ -1606,8 +1606,8 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, // Draw the stuff // // - if (front->e->XFloor.lightlist.Size()==0 || di->isFullbrightScene()) split.PutWall(di, translucent); - else split.SplitWall(di, front, translucent); + if (front->e->XFloor.lightlist.Size()==0 || di->isFullbrightScene()) split.PutWall(di, state, translucent); + else split.SplitWall(di, state, front, translucent); t=1; } @@ -1620,8 +1620,8 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, // Draw the stuff without splitting // // - if (front->e->XFloor.lightlist.Size()==0 || di->isFullbrightScene()) PutWall(di, translucent); - else SplitWall(di, front, translucent); + if (front->e->XFloor.lightlist.Size()==0 || di->isFullbrightScene()) PutWall(di, state, translucent); + else SplitWall(di, state, front, translucent); } alpha=1.0f; } @@ -1637,7 +1637,7 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, // // //========================================================================== -void HWWall::BuildFFBlock(HWDrawInfo *di, seg_t * seg, F3DFloor * rover, int roverIndex, +void HWWall::BuildFFBlock(HWDrawInfo *di, FRenderState& state, seg_t * seg, F3DFloor * rover, int roverIndex, float ff_topleft, float ff_topright, float ff_bottomleft, float ff_bottomright) { @@ -1763,8 +1763,8 @@ void HWWall::BuildFFBlock(HWDrawInfo *di, seg_t * seg, F3DFloor * rover, int rov sector_t * sec = sub ? sub->sector : seg->frontsector; - if (sec->e->XFloor.lightlist.Size() == 0 || di->isFullbrightScene()) PutWall(di, translucent); - else SplitWall(di, sec, translucent); + if (sec->e->XFloor.lightlist.Size() == 0 || di->isFullbrightScene()) PutWall(di, state, translucent); + else SplitWall(di, state, sec, translucent); alpha = 1.0f; lightlevel = savelight; @@ -1791,7 +1791,7 @@ __forceinline void HWWall::GetPlanePos(F3DFloor::planeref *planeref, float &left // // //========================================================================== -void HWWall::InverseFloors(HWDrawInfo *di, seg_t * seg, sector_t * frontsector, +void HWWall::InverseFloors(HWDrawInfo *di, FRenderState& state, seg_t * seg, sector_t * frontsector, float topleft, float topright, float bottomleft, float bottomright) { @@ -1829,7 +1829,7 @@ void HWWall::InverseFloors(HWDrawInfo *di, seg_t * seg, sector_t * frontsector, } if (ff_topleft < ff_bottomleft || ff_topright < ff_bottomright) continue; - BuildFFBlock(di, seg, rover, i, ff_topleft, ff_topright, ff_bottomleft, ff_bottomright); + BuildFFBlock(di, state, seg, rover, i, ff_topleft, ff_topright, ff_bottomleft, ff_bottomright); topleft = ff_bottomleft; topright = ff_bottomright; @@ -1842,7 +1842,7 @@ void HWWall::InverseFloors(HWDrawInfo *di, seg_t * seg, sector_t * frontsector, // // //========================================================================== -void HWWall::ClipFFloors(HWDrawInfo *di, seg_t * seg, F3DFloor * ffloor, int ffloorIndex, sector_t * frontsector, +void HWWall::ClipFFloors(HWDrawInfo *di, FRenderState& state, seg_t * seg, F3DFloor * ffloor, int ffloorIndex, sector_t * frontsector, float topleft, float topright, float bottomleft, float bottomright) { @@ -1893,7 +1893,7 @@ void HWWall::ClipFFloors(HWDrawInfo *di, seg_t * seg, F3DFloor * ffloor, int ffl } else if (ff_topleft <= topleft && ff_topright <= topright) { - BuildFFBlock(di, seg, ffloor, ffloorIndex, topleft, topright, ff_topleft, ff_topright); + BuildFFBlock(di, state, seg, ffloor, ffloorIndex, topleft, topright, ff_topleft, ff_topright); if (ff_bottomleft <= bottomleft && ff_bottomright <= bottomright) return; topleft = ff_bottomleft; topright = ff_bottomright; @@ -1908,7 +1908,7 @@ void HWWall::ClipFFloors(HWDrawInfo *di, seg_t * seg, F3DFloor * ffloor, int ffl done: // if the program reaches here there is one block left to draw - BuildFFBlock(di, seg, ffloor, ffloorIndex, topleft, topright, bottomleft, bottomright); + BuildFFBlock(di, state, seg, ffloor, ffloorIndex, topleft, topright, bottomleft, bottomright); } //========================================================================== @@ -1916,7 +1916,7 @@ done: // // //========================================================================== -void HWWall::DoFFloorBlocks(HWDrawInfo *di, seg_t * seg, sector_t * frontsector, sector_t * backsector, +void HWWall::DoFFloorBlocks(HWDrawInfo *di, FRenderState& state, seg_t * seg, sector_t * frontsector, sector_t * backsector, float fch1, float fch2, float ffh1, float ffh2, float bch1, float bch2, float bfh1, float bfh2) @@ -1978,13 +1978,13 @@ void HWWall::DoFFloorBlocks(HWDrawInfo *di, seg_t * seg, sector_t * frontsector, // do all inverse floors above the current one it there is a gap between the // last 3D floor and this one. if (topleft > ff_topleft && topright > ff_topright) - InverseFloors(di, seg, frontsector, topleft, topright, ff_topleft, ff_topright); + InverseFloors(di, state, seg, frontsector, topleft, topright, ff_topleft, ff_topright); // if translucent or liquid clip away adjoining parts of the same type of FFloors on the other side if (rover->flags&(FF_SWIMMABLE | FF_TRANSLUCENT)) - ClipFFloors(di, seg, rover, i, frontsector, ff_topleft, ff_topright, ff_bottomleft, ff_bottomright); + ClipFFloors(di, state, seg, rover, i, frontsector, ff_topleft, ff_topright, ff_bottomleft, ff_bottomright); else - BuildFFBlock(di, seg, rover, i, ff_topleft, ff_topright, ff_bottomleft, ff_bottomright); + BuildFFBlock(di, state, seg, rover, i, ff_topleft, ff_topright, ff_bottomleft, ff_bottomright); topleft = ff_bottomleft; topright = ff_bottomright; @@ -1996,7 +1996,7 @@ void HWWall::DoFFloorBlocks(HWDrawInfo *di, seg_t * seg, sector_t * frontsector, if (frontsector->e->XFloor.ffloors.Size() > 0) { if (topleft > bottomleft || topright > bottomright) - InverseFloors(di, seg, frontsector, topleft, topright, bottomleft, bottomright); + InverseFloors(di, state, seg, frontsector, topleft, topright, bottomleft, bottomright); } } @@ -2021,7 +2021,7 @@ inline int CalcRelLight(int lightlevel, int orglightlevel, int rel) // // //========================================================================== -void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_t * backsector) +void HWWall::Process(HWDrawInfo *di, FRenderState& state, seg_t *seg, sector_t * frontsector, sector_t * backsector) { vertex_t * v1, *v2; float fch1; @@ -2137,8 +2137,8 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ if (seg->linedef->special == Line_Horizon) { - SkyNormal(di, frontsector, v1, v2); - DoHorizon(di, seg, frontsector, v1, v2); + SkyNormal(di, state, frontsector, v1, v2); + DoHorizon(di, state, seg, frontsector, v1, v2); return; } @@ -2149,7 +2149,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ if (!backsector || (!(seg->linedef->flags&(ML_TWOSIDED | ML_3DMIDTEX)) && !isportal)) // one sided { // sector's sky - SkyNormal(di, frontsector, v1, v2); + SkyNormal(di, state, frontsector, v1, v2); if (isportal) { @@ -2158,11 +2158,11 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ ztop[1] = zceil[1]; zbottom[0] = zfloor[0]; zbottom[1] = zfloor[1]; - PutPortal(di, PORTALTYPE_LINETOLINE, -1); + PutPortal(di, state, PORTALTYPE_LINETOLINE, -1); } else if (seg->linedef->GetTransferredPortal()) { - SkyLine(di, frontsector, seg->linedef); + SkyLine(di, state, frontsector, seg->linedef); } else { @@ -2172,7 +2172,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ texture = TexMan.GetGameTexture(seg->sidedef->GetTexture(side_t::mid), true); if (texture && texture->isValid()) { - DoTexture(di, RENDERWALL_M1S, seg, (seg->linedef->flags & ML_DONTPEGBOTTOM) > 0, + DoTexture(di, state, RENDERWALL_M1S, seg, (seg->linedef->flags & ML_DONTPEGBOTTOM) > 0, crefz, frefz, // must come from the original! fch1, fch2, ffh1, ffh2, 0); } @@ -2189,7 +2189,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ if (isportal && seg->backsector == nullptr) { - SkyNormal(di, frontsector, v1, v2); // For sky rendering purposes this needs to be treated as a one-sided wall. + SkyNormal(di, state, frontsector, v1, v2); // For sky rendering purposes this needs to be treated as a one-sided wall. // If this is a one-sided portal and we got floor or ceiling alignment, the upper/lower texture position needs to be adjusted for that. // (We assume that this portal won't involve slopes!) @@ -2217,8 +2217,8 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ } else { - SkyTop(di, seg, frontsector, backsector, v1, v2); - SkyBottom(di, seg, frontsector, backsector, v1, v2); + SkyTop(di, state, seg, frontsector, backsector, v1, v2); + SkyBottom(di, state, seg, frontsector, backsector, v1, v2); } // upper texture @@ -2242,7 +2242,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ texture = TexMan.GetGameTexture(seg->sidedef->GetTexture(side_t::top), true); if (texture && texture->isValid()) { - DoTexture(di, RENDERWALL_TOP, seg, (seg->linedef->flags & (ML_DONTPEGTOP)) == 0, + DoTexture(di, state, RENDERWALL_TOP, seg, (seg->linedef->flags & (ML_DONTPEGTOP)) == 0, crefz, realback->GetPlaneTexZ(sector_t::ceiling), fch1, fch2, bch1a, bch2a, 0); } @@ -2255,7 +2255,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ texture = TexMan.GetGameTexture(frontsector->GetTexture(sector_t::ceiling), true); if (texture && texture->isValid()) { - DoTexture(di, RENDERWALL_TOP, seg, (seg->linedef->flags & (ML_DONTPEGTOP)) == 0, + DoTexture(di, state, RENDERWALL_TOP, seg, (seg->linedef->flags & (ML_DONTPEGTOP)) == 0, crefz, realback->GetPlaneTexZ(sector_t::ceiling), fch1, fch2, bch1a, bch2a, 0); } @@ -2299,11 +2299,11 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ ztop[1] = bch2; zbottom[0] = bfh1; zbottom[1] = bfh2; - PutPortal(di, PORTALTYPE_LINETOLINE, -1); + PutPortal(di, state, PORTALTYPE_LINETOLINE, -1); if (texture && seg->backsector != nullptr) { - DoMidTexture(di, seg, drawfogboundary, frontsector, backsector, realfront, realback, + DoMidTexture(di, state, seg, drawfogboundary, frontsector, backsector, realfront, realback, fch1, fch2, ffh1, ffh2, bch1, bch2, bfh1, bfh2, zalign); } } @@ -2312,7 +2312,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ if (texture || drawfogboundary) { - DoMidTexture(di, seg, drawfogboundary, frontsector, backsector, realfront, realback, + DoMidTexture(di, state, seg, drawfogboundary, frontsector, backsector, realfront, realback, fch1, fch2, ffh1, ffh2, bch1, bch2, bfh1, bfh2, zalign); } @@ -2320,7 +2320,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ { lightlevel = hw_ClampLight(seg->sidedef->GetLightLevel(foggy, orglightlevel, side_t::top, false, &rel)); rellight = CalcRelLight(lightlevel, orglightlevel, rel); - DoFFloorBlocks(di, seg, frontsector, backsector, fch1, fch2, ffh1, ffh2, bch1, bch2, bfh1, bfh2); + DoFFloorBlocks(di, state, seg, frontsector, backsector, fch1, fch2, ffh1, ffh2, bch1, bch2, bfh1, bfh2); } } @@ -2339,7 +2339,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ texture = TexMan.GetGameTexture(seg->sidedef->GetTexture(side_t::bottom), true); if (texture && texture->isValid()) { - DoTexture(di, RENDERWALL_BOTTOM, seg, (seg->linedef->flags & ML_DONTPEGBOTTOM) > 0, + DoTexture(di, state, RENDERWALL_BOTTOM, seg, (seg->linedef->flags & ML_DONTPEGBOTTOM) > 0, realback->GetPlaneTexZ(sector_t::floor), frefz, bfh1, bfh2, ffh1, ffh2, frontsector->GetTexture(sector_t::ceiling) == skyflatnum && backsector->GetTexture(sector_t::ceiling) == skyflatnum ? @@ -2358,7 +2358,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ texture = TexMan.GetGameTexture(frontsector->GetTexture(sector_t::floor), true); if (texture && texture->isValid()) { - DoTexture(di, RENDERWALL_BOTTOM, seg, (seg->linedef->flags & ML_DONTPEGBOTTOM) > 0, + DoTexture(di, state, RENDERWALL_BOTTOM, seg, (seg->linedef->flags & ML_DONTPEGBOTTOM) > 0, realback->GetPlaneTexZ(sector_t::floor), frefz, bfh1, bfh2, ffh1, ffh2, frefz - crefz); } @@ -2381,7 +2381,7 @@ void HWWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ // // //========================================================================== -void HWWall::ProcessLowerMiniseg(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_t * backsector) +void HWWall::ProcessLowerMiniseg(HWDrawInfo *di, FRenderState& state, seg_t *seg, sector_t * frontsector, sector_t * backsector) { if (frontsector->GetTexture(sector_t::floor) == skyflatnum) return; lightlist = NULL; @@ -2433,7 +2433,7 @@ void HWWall::ProcessLowerMiniseg(HWDrawInfo *di, seg_t *seg, sector_t * frontsec type = RENDERWALL_BOTTOM; tci.GetFromTexture(texture, 1, 1, false); SetWallCoordinates(seg, &tci, bfh, bfh, bfh, ffh, ffh, 0); - PutWall(di, false); + PutWall(di, state, false); } } } diff --git a/src/rendering/hwrenderer/scene/hw_weapon.cpp b/src/rendering/hwrenderer/scene/hw_weapon.cpp index b4771fca4..7abda521d 100644 --- a/src/rendering/hwrenderer/scene/hw_weapon.cpp +++ b/src/rendering/hwrenderer/scene/hw_weapon.cpp @@ -488,7 +488,7 @@ bool HUDSprite::GetWeaponRenderStyle(DPSprite *psp, AActor *playermo, sector_t * // //========================================================================== -bool HUDSprite::GetWeaponRect(HWDrawInfo *di, DPSprite *psp, float sx, float sy, player_t *player, double ticfrac) +bool HUDSprite::GetWeaponRect(HWDrawInfo *di, FRenderState& state, DPSprite *psp, float sx, float sy, player_t *player, double ticfrac) { float tx; float scale; @@ -652,7 +652,7 @@ bool HUDSprite::GetWeaponRect(HWDrawInfo *di, DPSprite *psp, float sx, float sy, Vert.v[3].X < vw)) return false; */ - auto verts = screen->mVertexData->AllocVertices(4); + auto verts = state.AllocVertices(4); mx = verts.second; verts.first[0].Set(Vert.v[0].X, Vert.v[0].Y, 0, u1, v1); @@ -669,7 +669,7 @@ bool HUDSprite::GetWeaponRect(HWDrawInfo *di, DPSprite *psp, float sx, float sy, // R_DrawPlayerSprites // //========================================================================== -void HWDrawInfo::PreparePlayerSprites2D(sector_t * viewsector, area_t in_area) +void HWDrawInfo::PreparePlayerSprites2D(sector_t * viewsector, area_t in_area, FRenderState& state) { AActor * playermo = players[consoleplayer].camera; player_t * player = playermo->player; @@ -712,7 +712,7 @@ void HWDrawInfo::PreparePlayerSprites2D(sector_t * viewsector, area_t in_area) GetDynSpriteLight(playermo, nullptr, hudsprite.dynrgb); } - if (!hudsprite.GetWeaponRect(this, psp, spos.X, spos.Y, player, vp.TicFrac)) continue; + if (!hudsprite.GetWeaponRect(this, state, psp, spos.X, spos.Y, player, vp.TicFrac)) continue; hudsprites.Push(hudsprite); } lightmode = oldlightmode; @@ -772,7 +772,7 @@ void HWDrawInfo::PreparePlayerSprites3D(sector_t * viewsector, area_t in_area) lightmode = oldlightmode; } -void HWDrawInfo::PreparePlayerSprites(sector_t * viewsector, area_t in_area) +void HWDrawInfo::PreparePlayerSprites(sector_t * viewsector, area_t in_area, FRenderState& state) { AActor * playermo = players[consoleplayer].camera; @@ -798,10 +798,10 @@ void HWDrawInfo::PreparePlayerSprites(sector_t * viewsector, area_t in_area) } else { - PreparePlayerSprites2D(viewsector,in_area); + PreparePlayerSprites2D(viewsector,in_area,state); } - PrepareTargeterSprites(vp.TicFrac); + PrepareTargeterSprites(vp.TicFrac,state); } @@ -811,7 +811,7 @@ void HWDrawInfo::PreparePlayerSprites(sector_t * viewsector, area_t in_area) // //========================================================================== -void HWDrawInfo::PrepareTargeterSprites(double ticfrac) +void HWDrawInfo::PrepareTargeterSprites(double ticfrac, FRenderState& state) { AActor * playermo = players[consoleplayer].camera; player_t * player = playermo->player; @@ -844,7 +844,7 @@ void HWDrawInfo::PrepareTargeterSprites(double ticfrac) { hudsprite.weapon = psp; - if (hudsprite.GetWeaponRect(this, psp, psp->x, psp->y, player, ticfrac)) + if (hudsprite.GetWeaponRect(this, state, psp, psp->x, psp->y, player, ticfrac)) { hudsprites.Push(hudsprite); } diff --git a/src/rendering/hwrenderer/scene/hw_weapon.h b/src/rendering/hwrenderer/scene/hw_weapon.h index 97f39ad8e..a61f4618a 100644 --- a/src/rendering/hwrenderer/scene/hw_weapon.h +++ b/src/rendering/hwrenderer/scene/hw_weapon.h @@ -61,6 +61,6 @@ struct HUDSprite void SetBright(bool isbelow); bool GetWeaponRenderStyle(DPSprite *psp, AActor *playermo, sector_t *viewsector, WeaponLighting &light); - bool GetWeaponRect(HWDrawInfo *di, DPSprite *psp, float sx, float sy, player_t *player, double ticfrac); + bool GetWeaponRect(HWDrawInfo *di, FRenderState& state, DPSprite *psp, float sx, float sy, player_t *player, double ticfrac); };