- consolidated the 3 virtually identical instances of DrawScene and moved the function to HWDrawInfo.
The only backend dependent call in there, ambient occlusion, has been made a virtual of DFrameBuffer.
This commit is contained in:
parent
90585c4931
commit
c203df5edb
12 changed files with 96 additions and 201 deletions
|
|
@ -67,7 +67,6 @@ EXTERN_CVAR(Bool, r_drawvoxels)
|
|||
EXTERN_CVAR(Int, gl_tonemap)
|
||||
EXTERN_CVAR(Int, screenblocks)
|
||||
EXTERN_CVAR(Bool, cl_capfps)
|
||||
EXTERN_CVAR(Bool, gl_no_skyclear)
|
||||
|
||||
extern bool NoInterpolateView;
|
||||
extern int rendered_commandbuffers;
|
||||
|
|
@ -480,10 +479,7 @@ sector_t *VulkanFrameBuffer::RenderViewpoint(FRenderViewpoint &mainvp, AActor *
|
|||
vp.Pos += eye.GetViewShift(vp.HWAngles.Yaw.Degrees);
|
||||
di->SetupView(*GetRenderState(), vp.Pos.X, vp.Pos.Y, vp.Pos.Z, false, false);
|
||||
|
||||
// std::function until this can be done better in a cross-API fashion.
|
||||
di->ProcessScene(toscreen, [&](HWDrawInfo *di, int mode) {
|
||||
DrawScene(di, mode);
|
||||
});
|
||||
di->ProcessScene(toscreen);
|
||||
|
||||
if (mainview)
|
||||
{
|
||||
|
|
@ -548,60 +544,6 @@ void VulkanFrameBuffer::RenderTextureView(FCanvasTexture *tex, AActor *Viewpoint
|
|||
tex->SetUpdated(true);
|
||||
}
|
||||
|
||||
void VulkanFrameBuffer::DrawScene(HWDrawInfo *di, int drawmode)
|
||||
{
|
||||
// To do: this is virtually identical to FGLRenderer::DrawScene and should be merged.
|
||||
|
||||
static int recursion = 0;
|
||||
static int ssao_portals_available = 0;
|
||||
const auto &vp = di->Viewpoint;
|
||||
|
||||
bool applySSAO = false;
|
||||
if (drawmode == DM_MAINVIEW)
|
||||
{
|
||||
ssao_portals_available = gl_ssao_portals;
|
||||
applySSAO = true;
|
||||
}
|
||||
else if (drawmode == DM_OFFSCREEN)
|
||||
{
|
||||
ssao_portals_available = 0;
|
||||
}
|
||||
else if (drawmode == DM_PORTAL && ssao_portals_available > 0)
|
||||
{
|
||||
applySSAO = true;
|
||||
ssao_portals_available--;
|
||||
}
|
||||
|
||||
if (vp.camera != nullptr)
|
||||
{
|
||||
ActorRenderFlags savedflags = vp.camera->renderflags;
|
||||
di->CreateScene(drawmode == DM_MAINVIEW);
|
||||
vp.camera->renderflags = savedflags;
|
||||
}
|
||||
else
|
||||
{
|
||||
di->CreateScene(false);
|
||||
}
|
||||
|
||||
GetRenderState()->SetDepthMask(true);
|
||||
if (!gl_no_skyclear) mPortalState->RenderFirstSkyPortal(recursion, di, *GetRenderState());
|
||||
|
||||
di->RenderScene(*GetRenderState());
|
||||
|
||||
if (applySSAO && GetRenderState()->GetPassType() == GBUFFER_PASS)
|
||||
{
|
||||
mPostprocess->AmbientOccludeScene(di->VPUniforms.mProjectionMatrix.get()[5]);
|
||||
screen->mViewpoints->Bind(*GetRenderState(), di->vpIndex);
|
||||
}
|
||||
|
||||
// Handle all portals after rendering the opaque objects but before
|
||||
// doing all translucent stuff
|
||||
recursion++;
|
||||
screen->mPortalState->EndFrame(di, *GetRenderState());
|
||||
recursion--;
|
||||
di->RenderTranslucent(*GetRenderState());
|
||||
}
|
||||
|
||||
void VulkanFrameBuffer::PostProcessScene(int fixedcm, const std::function<void()> &afterBloomDrawEndScene2D)
|
||||
{
|
||||
mPostprocess->PostProcessScene(fixedcm, afterBloomDrawEndScene2D);
|
||||
|
|
@ -1000,3 +942,8 @@ FRenderState* VulkanFrameBuffer::RenderState()
|
|||
{
|
||||
return mRenderState.get();
|
||||
}
|
||||
|
||||
void VulkanFrameBuffer::AmbientOccludeScene(float m5)
|
||||
{
|
||||
mPostprocess->AmbientOccludeScene(m5);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue