Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/origin/qzdoom-merge'
Browse files Browse the repository at this point in the history
  • Loading branch information
coelckers committed Jul 20, 2017
2 parents 03ed065 + e8e940d commit 714ada0
Show file tree
Hide file tree
Showing 40 changed files with 1,018 additions and 63 deletions.
2 changes: 2 additions & 0 deletions src/CMakeLists.txt
Expand Up @@ -718,6 +718,7 @@ set ( SWRENDER_SOURCES
swrenderer/viewport/r_viewport.cpp
swrenderer/viewport/r_walldrawer.cpp
swrenderer/line/r_line.cpp
swrenderer/line/r_farclip_line.cpp
swrenderer/line/r_walldraw.cpp
swrenderer/line/r_wallsetup.cpp
swrenderer/line/r_fogboundary.cpp
Expand Down Expand Up @@ -1006,6 +1007,7 @@ set (PCH_SOURCES
gl/shaders/gl_shader.cpp
gl/shaders/gl_texshader.cpp
gl/shaders/gl_shaderprogram.cpp
gl/shaders/gl_postprocessshader.cpp
gl/shaders/gl_shadowmapshader.cpp
gl/shaders/gl_presentshader.cpp
gl/shaders/gl_present3dRowshader.cpp
Expand Down
4 changes: 3 additions & 1 deletion src/g_game.cpp
Expand Up @@ -1765,6 +1765,8 @@ void G_DoReborn (int playernum, bool freshbot)
}
else
{
bool isUnfriendly = players[playernum].mo && !(players[playernum].mo->flags & MF_FRIENDLY);

// respawn at the start
// first disassociate the corpse
if (players[playernum].mo)
Expand All @@ -1774,7 +1776,7 @@ void G_DoReborn (int playernum, bool freshbot)
}

// spawn at random spot if in deathmatch
if (deathmatch)
if (deathmatch || isUnfriendly)
{
G_DeathMatchSpawnPlayer (playernum);
return;
Expand Down
1 change: 1 addition & 0 deletions src/gi.cpp
Expand Up @@ -380,6 +380,7 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_BOOL(nightmarefast, "nightmarefast")
GAMEINFOKEY_COLOR(dimcolor, "dimcolor")
GAMEINFOKEY_FLOAT(dimamount, "dimamount")
GAMEINFOKEY_FLOAT(bluramount, "bluramount")
GAMEINFOKEY_INT(definventorymaxamount, "definventorymaxamount")
GAMEINFOKEY_INT(defaultrespawntime, "defaultrespawntime")
GAMEINFOKEY_INT(defaultrespawntime, "defaultrespawntime")
Expand Down
1 change: 1 addition & 0 deletions src/gi.h
Expand Up @@ -159,6 +159,7 @@ struct gameinfo_t
FString CursorPic;
uint32_t dimcolor;
float dimamount;
float bluramount;
int definventorymaxamount;
int defaultrespawntime;
int defaultdropstyle;
Expand Down
92 changes: 91 additions & 1 deletion src/gl/renderer/gl_postprocess.cpp
Expand Up @@ -62,6 +62,7 @@
#include "gl/shaders/gl_lensshader.h"
#include "gl/shaders/gl_fxaashader.h"
#include "gl/shaders/gl_presentshader.h"
#include "gl/shaders/gl_postprocessshader.h"
#include "gl/renderer/gl_2ddrawer.h"
#include "gl/stereo3d/gl_stereo3d.h"

Expand Down Expand Up @@ -145,10 +146,12 @@ CUSTOM_CVAR(Bool, gl_paltonemap_reverselookup, true, CVAR_ARCHIVE | CVAR_NOINITC
GLRenderer->ClearTonemapPalette();
}

CVAR(Float, gl_menu_blur, -1.0f, CVAR_ARCHIVE)

EXTERN_CVAR(Float, vid_brightness)
EXTERN_CVAR(Float, vid_contrast)

EXTERN_CVAR(Float, vid_saturation)
EXTERN_CVAR(Int, gl_satformula)

void FGLRenderer::RenderScreenQuad()
{
Expand All @@ -161,11 +164,13 @@ void FGLRenderer::PostProcessScene(int fixedcm)
{
mBuffers->BlitSceneToTexture();
UpdateCameraExposure();
mCustomPostProcessShaders->Run("beforebloom");
BloomScene(fixedcm);
TonemapScene();
ColormapScene(fixedcm);
LensDistortScene();
ApplyFXAA();
mCustomPostProcessShaders->Run("scene");
}

//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -467,6 +472,86 @@ void FGLRenderer::BloomScene(int fixedcm)
FGLDebug::PopGroup();
}

//-----------------------------------------------------------------------------
//
// Blur the scene
//
//-----------------------------------------------------------------------------

void FGLRenderer::BlurScene(float gameinfobluramount)
{
// first, respect the CVar
float blurAmount = gl_menu_blur;

// if CVar is negative, use the gameinfo entry
if (gl_menu_blur < 0)
blurAmount = gameinfobluramount;

// if blurAmount == 0 or somehow still returns negative, exit to prevent a crash, clearly we don't want this
if ((blurAmount <= 0.0) || !FGLRenderBuffers::IsEnabled())
return;

FGLDebug::PushGroup("BlurScene");

FGLPostProcessState savedState;
savedState.SaveTextureBindings(2);

int sampleCount = 9;
int numLevels = 3; // Must be 4 or less (since FGLRenderBuffers::NumBloomLevels is 4 and we are using its buffers).
assert(numLevels <= FGLRenderBuffers::NumBloomLevels);

const auto &viewport = mScreenViewport; // The area we want to blur. Could also be mSceneViewport if only the scene area is to be blured

const auto &level0 = mBuffers->BloomLevels[0];

// Grab the area we want to bloom:
glBindFramebuffer(GL_READ_FRAMEBUFFER, mBuffers->GetCurrentFB());
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, level0.VFramebuffer);
glBlitFramebuffer(viewport.left, viewport.top, viewport.width, viewport.height, 0, 0, level0.Width, level0.Height, GL_COLOR_BUFFER_BIT, GL_LINEAR);

// Blur and downscale:
for (int i = 0; i < numLevels - 1; i++)
{
const auto &level = mBuffers->BloomLevels[i];
const auto &next = mBuffers->BloomLevels[i + 1];
mBlurShader->BlurHorizontal(this, blurAmount, sampleCount, level.VTexture, level.HFramebuffer, level.Width, level.Height);
mBlurShader->BlurVertical(this, blurAmount, sampleCount, level.HTexture, next.VFramebuffer, next.Width, next.Height);
}

// Blur and upscale:
for (int i = numLevels - 1; i > 0; i--)
{
const auto &level = mBuffers->BloomLevels[i];
const auto &next = mBuffers->BloomLevels[i - 1];

mBlurShader->BlurHorizontal(this, blurAmount, sampleCount, level.VTexture, level.HFramebuffer, level.Width, level.Height);
mBlurShader->BlurVertical(this, blurAmount, sampleCount, level.HTexture, level.VFramebuffer, level.Width, level.Height);

// Linear upscale:
glBindFramebuffer(GL_FRAMEBUFFER, next.VFramebuffer);
glViewport(0, 0, next.Width, next.Height);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, level.VTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
mBloomCombineShader->Bind();
mBloomCombineShader->BloomTexture.Set(0);
RenderScreenQuad();
}

mBlurShader->BlurHorizontal(this, blurAmount, sampleCount, level0.VTexture, level0.HFramebuffer, level0.Width, level0.Height);
mBlurShader->BlurVertical(this, blurAmount, sampleCount, level0.HTexture, level0.VFramebuffer, level0.Width, level0.Height);

// Copy blur back to scene texture:
glBindFramebuffer(GL_READ_FRAMEBUFFER, level0.VFramebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mBuffers->GetCurrentFB());
glBlitFramebuffer(0, 0, level0.Width, level0.Height, viewport.left, viewport.top, viewport.width, viewport.height, GL_COLOR_BUFFER_BIT, GL_LINEAR);

glViewport(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height);

FGLDebug::PopGroup();
}

//-----------------------------------------------------------------------------
//
// Tonemap scene texture and place the result in the HUD/2D texture
Expand Down Expand Up @@ -734,6 +819,8 @@ void FGLRenderer::CopyToBackbuffer(const GL_IRECT *bounds, bool applyGamma)
m2DDrawer->Draw(); // draw all pending 2D stuff before copying the buffer
m2DDrawer->Clear();

mCustomPostProcessShaders->Run("screen");

FGLDebug::PushGroup("CopyToBackbuffer");
if (FGLRenderBuffers::IsEnabled())
{
Expand Down Expand Up @@ -777,12 +864,15 @@ void FGLRenderer::DrawPresentTexture(const GL_IRECT &box, bool applyGamma)
mPresentShader->InvGamma.Set(1.0f);
mPresentShader->Contrast.Set(1.0f);
mPresentShader->Brightness.Set(0.0f);
mPresentShader->Saturation.Set(1.0f);
}
else
{
mPresentShader->InvGamma.Set(1.0f / clamp<float>(Gamma, 0.1f, 4.f));
mPresentShader->Contrast.Set(clamp<float>(vid_contrast, 0.1f, 3.f));
mPresentShader->Brightness.Set(clamp<float>(vid_brightness, -0.8f, 0.8f));
mPresentShader->Saturation.Set(clamp<float>(vid_saturation, -15.0f, 15.f));
mPresentShader->GrayFormula.Set(static_cast<int>(gl_satformula));
}
mPresentShader->Scale.Set(mScreenViewport.width / (float)mBuffers->GetWidth(), mScreenViewport.height / (float)mBuffers->GetHeight());
RenderScreenQuad();
Expand Down
2 changes: 2 additions & 0 deletions src/gl/renderer/gl_renderbuffers.h
Expand Up @@ -43,6 +43,8 @@ class FGLRenderBuffers
void BindNextFB();
void NextTexture();

int GetCurrentFB() const { return mPipelineFB[mCurrentPipelineTexture]; }

void BindOutputFB();

void BlitToEyeTexture(int eye);
Expand Down
4 changes: 4 additions & 0 deletions src/gl/renderer/gl_renderer.cpp
Expand Up @@ -62,6 +62,7 @@
#include "gl/shaders/gl_presentshader.h"
#include "gl/shaders/gl_present3dRowshader.h"
#include "gl/shaders/gl_shadowmapshader.h"
#include "gl/shaders/gl_postprocessshader.h"
#include "gl/stereo3d/gl_stereo3d.h"
#include "gl/textures/gl_texture.h"
#include "gl/textures/gl_translate.h"
Expand Down Expand Up @@ -128,6 +129,7 @@ FGLRenderer::FGLRenderer(OpenGLFrameBuffer *fb)
mFXAAShader = nullptr;
mFXAALumaShader = nullptr;
mShadowMapShader = nullptr;
mCustomPostProcessShaders = nullptr;
}

void gl_LoadModels();
Expand Down Expand Up @@ -157,6 +159,7 @@ void FGLRenderer::Initialize(int width, int height)
mPresent3dColumnShader = new FPresent3DColumnShader();
mPresent3dRowShader = new FPresent3DRowShader();
mShadowMapShader = new FShadowMapShader();
mCustomPostProcessShaders = new FCustomPostProcessShaders();
m2DDrawer = new F2DDrawer;

// needed for the core profile, because someone decided it was a good idea to remove the default VAO.
Expand Down Expand Up @@ -232,6 +235,7 @@ FGLRenderer::~FGLRenderer()
if (mColormapShader) delete mColormapShader;
if (mLensShader) delete mLensShader;
if (mShadowMapShader) delete mShadowMapShader;
delete mCustomPostProcessShaders;
delete mFXAAShader;
delete mFXAALumaShader;
}
Expand Down
3 changes: 3 additions & 0 deletions src/gl/renderer/gl_renderer.h
Expand Up @@ -42,6 +42,7 @@ class FPresent3DRowShader;
class F2DDrawer;
class FHardwareTexture;
class FShadowMapShader;
class FCustomPostProcessShaders;

inline float DEG2RAD(float deg)
{
Expand Down Expand Up @@ -126,6 +127,7 @@ class FGLRenderer
FPresent3DColumnShader *mPresent3dColumnShader;
FPresent3DRowShader *mPresent3dRowShader;
FShadowMapShader *mShadowMapShader;
FCustomPostProcessShaders *mCustomPostProcessShaders;

FShadowMap mShadowMap;

Expand Down Expand Up @@ -182,6 +184,7 @@ class FGLRenderer
void ClearTonemapPalette();
void LensDistortScene();
void ApplyFXAA();
void BlurScene(float gameinfobluramount);
void CopyToBackbuffer(const GL_IRECT *bounds, bool applyGamma);
void DrawPresentTexture(const GL_IRECT &box, bool applyGamma);
void Flush();
Expand Down
8 changes: 4 additions & 4 deletions src/gl/scene/gl_weapon.cpp
Expand Up @@ -98,7 +98,7 @@ void GLSceneDrawer::DrawPSprite (player_t * player,DPSprite *psp, float sx, floa
// calculate edges of the shape
scalex = (320.0f / (240.0f * r_viewwindow.WidescreenRatio)) * vw / 320;

tx = sx - (160 - r.left);
tx = (psp->Flags & PSPF_MIRROR) ? ((160 - r.width) - (sx + r.left)) : (sx - (160 - r.left));
x1 = tx * scalex + vw/2;
if (x1 > vw) return; // off the right side
x1 += viewwindowx;
Expand All @@ -108,7 +108,6 @@ void GLSceneDrawer::DrawPSprite (player_t * player,DPSprite *psp, float sx, floa
if (x2 < 0) return; // off the left side
x2 += viewwindowx;


// killough 12/98: fix psprite positioning problem
ftexturemid = 100.f - sy - r.top;

Expand All @@ -130,7 +129,8 @@ void GLSceneDrawer::DrawPSprite (player_t * player,DPSprite *psp, float sx, floa
y1 = viewwindowy + vh / 2 - (ftexturemid * scale);
y2 = y1 + (r.height * scale) + 1;

if (!(mirror) != !(psp->Flags & PSPF_FLIP))

if (!(mirror) != !(psp->Flags & (PSPF_FLIP)))
{
fU2 = tex->GetSpriteUL();
fV1 = tex->GetSpriteVT();
Expand Down Expand Up @@ -437,7 +437,7 @@ void GLSceneDrawer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)

if (psp->Flags & PSPF_ADDBOB)
{
sx += bobx;
sx += (psp->Flags & PSPF_MIRROR) ? -bobx : bobx;
sy += boby;
}

Expand Down

0 comments on commit 714ada0

Please sign in to comment.