- moved RenderPortal, too.

This commit is contained in:
Christoph Oelckers 2018-10-28 23:18:19 +01:00
parent 24d6b23042
commit 70f9507f16
7 changed files with 34 additions and 68 deletions

View file

@ -1,54 +0,0 @@
//
//---------------------------------------------------------------------------
//
// Copyright(C) 2002-2016 Christoph Oelckers
// All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/
//
//--------------------------------------------------------------------------
//
#include "gl_load/gl_system.h"
#include "r_sky.h"
#include "r_utility.h"
#include "doomstat.h"
#include "g_levellocals.h"
#include "tarray.h"
#include "hwrenderer/scene/hw_drawstructs.h"
#include "hwrenderer/data/flatvertices.h"
#include "gl/scene/gl_drawinfo.h"
#include "hwrenderer/scene/hw_clipper.h"
#include "gl/renderer/gl_renderstate.h"
#include "gl/renderer/gl_renderer.h"
#include "hwrenderer/data/hw_viewpointbuffer.h"
#include "hwrenderer/dynlights/hw_lightbuffer.h"
#include "hwrenderer/models/hw_models.h"
void FDrawInfo::RenderPortal(HWPortal *p, bool usestencil)
{
auto gp = static_cast<HWPortal *>(p);
gp->SetupStencil(this, gl_RenderState, usestencil);
auto new_di = StartDrawInfo(Viewpoint, &VPUniforms);
new_di->mCurrentPortal = gp;
gl_RenderState.SetLightIndex(-1);
gp->DrawContents(new_di, gl_RenderState);
new_di->EndDrawInfo();
screen->mVertexData->Bind(gl_RenderState);
screen->mViewpoints->Bind(gl_RenderState, vpIndex);
gp->RemoveStencil(this, gl_RenderState, usestencil);
}

View file

@ -13,8 +13,6 @@
struct FDrawInfo : public HWDrawInfo
{
void RenderPortal(HWPortal *p, bool stencil) override;
void CreateScene();
void DrawScene(int drawmode) override;
void ProcessScene(bool toscreen = false);

View file

@ -172,7 +172,7 @@ void FDrawInfo::DrawScene(int drawmode)
}
glDepthMask(true);
if (!gl_no_skyclear) screen->mPortalState->RenderFirstSkyPortal(recursion, this);
if (!gl_no_skyclear) screen->mPortalState->RenderFirstSkyPortal(recursion, this, gl_RenderState);
RenderScene(gl_RenderState);
@ -190,7 +190,7 @@ void FDrawInfo::DrawScene(int drawmode)
// Handle all portals after rendering the opaque objects but before
// doing all translucent stuff
recursion++;
screen->mPortalState->EndFrame(this);
screen->mPortalState->EndFrame(this, gl_RenderState);
recursion--;
RenderTranslucent(gl_RenderState);
}

View file

@ -37,6 +37,7 @@
#include "hwrenderer/utility/hw_clock.h"
#include "hwrenderer/utility/hw_cvars.h"
#include "hwrenderer/data/hw_viewpointbuffer.h"
#include "hwrenderer/data/flatvertices.h"
#include "hwrenderer/dynlights/hw_lightbuffer.h"
#include "hw_clipper.h"
@ -514,3 +515,24 @@ void HWDrawInfo::RenderTranslucent(FRenderState &state)
}
//-----------------------------------------------------------------------------
//
// RenderTranslucent
//
//-----------------------------------------------------------------------------
void HWDrawInfo::RenderPortal(HWPortal *p, FRenderState &state, bool usestencil)
{
auto gp = static_cast<HWPortal *>(p);
gp->SetupStencil(this, state, usestencil);
auto new_di = StartDrawInfo(Viewpoint, &VPUniforms);
new_di->mCurrentPortal = gp;
state.SetLightIndex(-1);
gp->DrawContents(new_di, state);
new_di->EndDrawInfo();
screen->mVertexData->Bind(state);
screen->mViewpoints->Bind(state, vpIndex);
gp->RemoveStencil(this, state, usestencil);
}

View file

@ -307,6 +307,7 @@ public:
void RenderScene(FRenderState &state);
void RenderTranslucent(FRenderState &state);
void RenderPortal(HWPortal *p, FRenderState &state, bool usestencil);
bool DoOneSectorUpper(subsector_t * subsec, float planez, area_t in_area);
bool DoOneSectorLower(subsector_t * subsec, float planez, area_t in_area);
@ -365,7 +366,6 @@ public:
GLDecal *AddDecal(bool onmirror);
virtual void RenderPortal(HWPortal *p, bool usestencil) = 0;
virtual void DrawScene(int drawmode) = 0;
};

View file

@ -78,7 +78,7 @@ static FString indent;
//
//-----------------------------------------------------------------------------
void FPortalSceneState::EndFrame(HWDrawInfo *di)
void FPortalSceneState::EndFrame(HWDrawInfo *di, FRenderState &state)
{
HWPortal * p;
@ -96,7 +96,7 @@ void FPortalSceneState::EndFrame(HWDrawInfo *di)
}
if (p->lines.Size() > 0)
{
RenderPortal(p, true, di);
RenderPortal(p, state, true, di);
}
delete p;
}
@ -118,7 +118,7 @@ void FPortalSceneState::EndFrame(HWDrawInfo *di)
// the GPU and there's rarely more than one sky visible at a time.
//
//-----------------------------------------------------------------------------
bool FPortalSceneState::RenderFirstSkyPortal(int recursion, HWDrawInfo *outer_di)
bool FPortalSceneState::RenderFirstSkyPortal(int recursion, HWDrawInfo *outer_di, FRenderState &state)
{
HWPortal * p;
HWPortal * best = nullptr;
@ -147,7 +147,7 @@ bool FPortalSceneState::RenderFirstSkyPortal(int recursion, HWDrawInfo *outer_di
if (best)
{
portals.Delete(bestindex);
RenderPortal(best, false, outer_di);
RenderPortal(best, state, false, outer_di);
delete best;
return true;
}
@ -155,9 +155,9 @@ bool FPortalSceneState::RenderFirstSkyPortal(int recursion, HWDrawInfo *outer_di
}
void FPortalSceneState::RenderPortal(HWPortal *p, bool usestencil, HWDrawInfo *outer_di)
void FPortalSceneState::RenderPortal(HWPortal *p, FRenderState &state, bool usestencil, HWDrawInfo *outer_di)
{
if (gl_portals) outer_di->RenderPortal(p, usestencil);
if (gl_portals) outer_di->RenderPortal(p, state, usestencil);
}

View file

@ -111,9 +111,9 @@ struct FPortalSceneState
}
void StartFrame();
bool RenderFirstSkyPortal(int recursion, HWDrawInfo *outer_di);
void EndFrame(HWDrawInfo *outer_di);
void RenderPortal(HWPortal *p, bool usestencil, HWDrawInfo *outer_di);
bool RenderFirstSkyPortal(int recursion, HWDrawInfo *outer_di, FRenderState &state);
void EndFrame(HWDrawInfo *outer_di, FRenderState &state);
void RenderPortal(HWPortal *p, FRenderState &state, bool usestencil, HWDrawInfo *outer_di);
};
inline HWPortal::HWPortal(FPortalSceneState *s, bool local) : mState(s)