From 93a6e4bc9499975063eacb0cd7c4bc571982361b Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 17 Feb 2017 08:08:22 +0100 Subject: [PATCH 01/14] Add an aggressive blur pass for the scene --- src/gl/renderer/gl_postprocess.cpp | 71 ++++++++++++++++++++++++++++++ src/gl/renderer/gl_renderbuffers.h | 2 + src/gl/renderer/gl_renderer.h | 1 + 3 files changed, 74 insertions(+) diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index 2f9b31bbb..92ef89362 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -166,6 +166,7 @@ void FGLRenderer::PostProcessScene(int fixedcm) ColormapScene(fixedcm); LensDistortScene(); ApplyFXAA(); + BlurScene(); } //----------------------------------------------------------------------------- @@ -467,6 +468,76 @@ void FGLRenderer::BloomScene(int fixedcm) FGLDebug::PopGroup(); } +//----------------------------------------------------------------------------- +// +// Blur the scene +// +//----------------------------------------------------------------------------- + +void FGLRenderer::BlurScene() +{ + FGLDebug::PushGroup("BlurScene"); + + FGLPostProcessState savedState; + savedState.SaveTextureBindings(2); + + const float blurAmount = 5.0f; + 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 diff --git a/src/gl/renderer/gl_renderbuffers.h b/src/gl/renderer/gl_renderbuffers.h index 5df3bcca0..41202b499 100644 --- a/src/gl/renderer/gl_renderbuffers.h +++ b/src/gl/renderer/gl_renderbuffers.h @@ -43,6 +43,8 @@ public: void BindNextFB(); void NextTexture(); + int GetCurrentFB() const { return mPipelineFB[mCurrentPipelineTexture]; } + void BindOutputFB(); void BlitToEyeTexture(int eye); diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index 63168ff24..1bfad8841 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -180,6 +180,7 @@ public: void ClearTonemapPalette(); void LensDistortScene(); void ApplyFXAA(); + void BlurScene(); void CopyToBackbuffer(const GL_IRECT *bounds, bool applyGamma); void DrawPresentTexture(const GL_IRECT &box, bool applyGamma); void Flush(); From 786c4f01c8e4debcd5779c0da27849b10a774f1d Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Fri, 10 Mar 2017 12:47:52 -0500 Subject: [PATCH 02/14] - Monsters no longer search for players who are unfriendly. --- src/p_enemy.cpp | 8 +++++++- src/p_mobj.cpp | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 8aed0370e..cd986b5f2 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -250,6 +250,9 @@ void P_NoiseAlert (AActor *target, AActor *emitter, bool splash, double maxdist) if (emitter == NULL) return; + /*if (target != NULL && target->player && !(target->flags & MF_FRIENDLY)) + return;*/ + if (target != NULL && target->player && (target->player->cheats & CF_NOTARGET)) return; @@ -1883,6 +1886,9 @@ bool P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params) if (!(player->mo->flags & MF_SHOOTABLE)) continue; // not shootable (observer or dead) + if (!((actor->flags ^ player->mo->flags) & MF_FRIENDLY)) + continue; // same +MF_FRIENDLY, ignore + if (player->cheats & CF_NOTARGET) continue; // no target @@ -1982,7 +1988,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look) targ = NULL; } - if (targ && targ->player && (targ->player->cheats & CF_NOTARGET)) + if (targ && targ->player && ((targ->player->cheats & CF_NOTARGET) || !(targ->flags & MF_FRIENDLY))) { return 0; } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index c175858de..5c7b0ce7b 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -7354,6 +7354,9 @@ bool AActor::IsFriend (AActor *other) other->FriendPlayer == 0 || players[FriendPlayer-1].mo->IsTeammate(players[other->FriendPlayer-1].mo); } + // [SP] If friendly flags match, then they are on the same team. + /*if (!((flags ^ other->flags) & MF_FRIENDLY)) + return true;*/ return false; } From ff3d3f13c8ada898d5dd344474c9006c47dfa157 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Fri, 10 Mar 2017 14:00:58 -0500 Subject: [PATCH 03/14] - Implement hostile coop for -FRIENDLY players. --- src/p_enemy.cpp | 3 --- src/p_mobj.cpp | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index cd986b5f2..aca2d8bb0 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -250,9 +250,6 @@ void P_NoiseAlert (AActor *target, AActor *emitter, bool splash, double maxdist) if (emitter == NULL) return; - /*if (target != NULL && target->player && !(target->flags & MF_FRIENDLY)) - return;*/ - if (target != NULL && target->player && (target->player->cheats & CF_NOTARGET)) return; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 5c7b0ce7b..870b0a8df 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -7273,7 +7273,7 @@ bool AActor::IsTeammate (AActor *other) } else if (!deathmatch && player && other->player) { - return true; + return (!((flags ^ other->flags) & MF_FRIENDLY)); } else if (teamplay) { From 23141dc38a1dfad1fb2455c283a5659ffe8bcab4 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 14 Mar 2017 01:19:37 -0400 Subject: [PATCH 04/14] - QZDoom-ify --- CMakeLists.txt | 4 ++-- src/posix/cocoa/i_video.mm | 2 +- src/posix/sdl/hardware.cpp | 2 +- src/version.h | 20 ++++++++++---------- src/win32/hardware.cpp | 2 +- src/win32/zdoom.rc | 20 ++++++++++---------- wadsrc/CMakeLists.txt | 2 +- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e96249ff3..1a10e9997 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required( VERSION 2.8.7 ) -project(GZDoom) +project(QZDoom) if( COMMAND cmake_policy ) if( POLICY CMP0011 ) @@ -122,7 +122,7 @@ IF( NOT CMAKE_BUILD_TYPE ) ENDIF() set( ZDOOM_OUTPUT_DIR ${CMAKE_BINARY_DIR} CACHE PATH "Directory where zdoom.pk3 and the executable will be created." ) -set( ZDOOM_EXE_NAME "gzdoom" CACHE FILEPATH "Name of the executable to create" ) +set( ZDOOM_EXE_NAME "qzdoom" CACHE FILEPATH "Name of the executable to create" ) if( MSVC ) # Allow the user to use ZDOOM_OUTPUT_DIR as a single release point. # Use zdoom, zdoomd, zdoom64, and zdoomd64 for the binary names diff --git a/src/posix/cocoa/i_video.mm b/src/posix/cocoa/i_video.mm index 906fc413d..b0c6ed5b8 100644 --- a/src/posix/cocoa/i_video.mm +++ b/src/posix/cocoa/i_video.mm @@ -148,7 +148,7 @@ CUSTOM_CVAR(Bool, vid_autoswitch, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_ static int s_currentRenderer; -CUSTOM_CVAR(Int, vid_renderer, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +CUSTOM_CVAR(Int, vid_renderer, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { // 0: Software renderer // 1: OpenGL renderer diff --git a/src/posix/sdl/hardware.cpp b/src/posix/sdl/hardware.cpp index e512adb73..88870cb52 100644 --- a/src/posix/sdl/hardware.cpp +++ b/src/posix/sdl/hardware.cpp @@ -65,7 +65,7 @@ void I_RestartRenderer(); int currentrenderer; // [ZDoomGL] -CUSTOM_CVAR (Int, vid_renderer, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +CUSTOM_CVAR (Int, vid_renderer, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { // 0: Software renderer // 1: OpenGL renderer diff --git a/src/version.h b/src/version.h index 0bcbbb83e..b3382b474 100644 --- a/src/version.h +++ b/src/version.h @@ -46,16 +46,16 @@ const char *GetVersionString(); #ifdef GIT_DESCRIPTION #define VERSIONSTR GIT_DESCRIPTION #else -#define VERSIONSTR "2.5pre" +#define VERSIONSTR "1.4pre" #endif // The version as seen in the Windows resource -#define RC_FILEVERSION 2,4,9999,0 -#define RC_PRODUCTVERSION 2,4,9999,0 +#define RC_FILEVERSION 1,3,9999,0 +#define RC_PRODUCTVERSION 1,3,9999,0 #define RC_PRODUCTVERSION2 VERSIONSTR // These are for content versioning. The current state is '2.4'. #define VER_MAJOR 2 -#define VER_MINOR 5 +#define VER_MINOR 4 #define VER_REVISION 0 // Version identifier for network games. @@ -92,14 +92,14 @@ const char *GetVersionString(); #define SAVEVER 4551 // This is so that derivates can use the same savegame versions without worrying about engine compatibility -#define GAMESIG "GZDOOM" -#define BASEWAD "gzdoom.pk3" +#define GAMESIG "QZDOOM" +#define BASEWAD "qzdoom.pk3" // More stuff that needs to be different for derivatives. -#define GAMENAME "GZDoom" -#define GAMENAMELOWERCASE "gzdoom" -#define FORUM_URL "http://forum.drdteam.org" -#define BUGS_FORUM_URL "http://forum.drdteam.org/viewforum.php?f=24" +#define GAMENAME "QZDoom" +#define GAMENAMELOWERCASE "qzdoom" +#define FORUM_URL "http://forum.drdteam.org/viewforum.php?f=196" +#define BUGS_FORUM_URL "http://forum.drdteam.org/viewforum.php?f=197" #if defined(__APPLE__) || defined(_WIN32) #define GAME_DIR GAMENAME diff --git a/src/win32/hardware.cpp b/src/win32/hardware.cpp index b083f4fe9..70e622b39 100644 --- a/src/win32/hardware.cpp +++ b/src/win32/hardware.cpp @@ -106,7 +106,7 @@ CUSTOM_CVAR(Bool, vid_used3d, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOIN } // [ZDoomGL] -CUSTOM_CVAR (Int, vid_renderer, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +CUSTOM_CVAR (Int, vid_renderer, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { // 0: Software renderer // 1: OpenGL renderer diff --git a/src/win32/zdoom.rc b/src/win32/zdoom.rc index 0d21faae5..cede1e894 100644 --- a/src/win32/zdoom.rc +++ b/src/win32/zdoom.rc @@ -72,13 +72,13 @@ BEGIN " BEGIN\r\n" " VALUE ""Comments"", ""Thanks to id Software for creating DOOM and then releasing the source code. Thanks also to TeamTNT for creating BOOM, which ZDoom is partially based on. Includes code based on the Cajun Bot 0.97 by Martin Collberg.""\r\n" " VALUE ""CompanyName"", "" ""\r\n" - " VALUE ""FileDescription"", ""GZDoom""\r\n" + " VALUE ""FileDescription"", ""QZDoom""\r\n" " VALUE ""FileVersion"", RC_FILEVERSION2\r\n" - " VALUE ""InternalName"", ""GZDoom""\r\n" + " VALUE ""InternalName"", ""QZDoom""\r\n" " VALUE ""LegalCopyright"", ""Copyright \\u00A9 1993-1996 id Software, 1998-2010 Randy Heit, 2002-2010 Christoph Oelckers, et al.""\r\n" " VALUE ""LegalTrademarks"", ""DoomR is a Registered Trademark of id Software, Inc.""\r\n" - " VALUE ""OriginalFilename"", ""gzdoom.exe""\r\n" - " VALUE ""ProductName"", ""GZDoom""\r\n" + " VALUE ""OriginalFilename"", ""qzdoom.exe""\r\n" + " VALUE ""ProductName"", ""QZDoom""\r\n" " VALUE ""ProductVersion"", RC_PRODUCTVERSION2\r\n" " END\r\n" " END\r\n" @@ -228,7 +228,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US FONT 8, "MS Shell Dlg" { CONTROL 101, IDC_STATIC, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE, 7, 7, 21, 20 - CONTROL "Welcome to GZDoom!", IDC_STATIC, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 42, 8, 180, 8 + CONTROL "Welcome to QZDoom!", IDC_STATIC, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 42, 8, 180, 8 CONTROL "", IDC_WELCOME_VERSION, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 42, 18, 180, 8 CONTROL "IWAD selection", IDC_STATIC, BUTTON, BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 8, 32, 208, 117 CONTROL "Select which game file (IWAD) to run.", IDC_STATIC, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 12, 44, 190, 8 @@ -242,7 +242,7 @@ FONT 8, "MS Shell Dlg" CONTROL "Load lights", IDC_WELCOME_LIGHTS, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 130, 180, 51, 10 CONTROL "Load brightmaps", IDC_WELCOME_BRIGHTMAPS, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 130, 190, 65, 10 CONTROL "Don't ask me this again", IDC_DONTASKIWAD, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 73, 211, 87, 10 - CONTROL "Play GZDoom", IDOK, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 8, 228, 90, 14 + CONTROL "Play QZDoom", IDOK, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 8, 228, 90, 14 CONTROL "Exit", IDCANCEL, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 166, 228, 50, 14 } @@ -504,13 +504,13 @@ BEGIN BEGIN VALUE "Comments", "Thanks to id Software for creating DOOM and then releasing the source code. Thanks also to TeamTNT for creating BOOM, which ZDoom is partially based on. Includes code based on the Cajun Bot 0.97 by Martin Collberg." VALUE "CompanyName", " " - VALUE "FileDescription", "GZDoom" + VALUE "FileDescription", "QZDoom" VALUE "FileVersion", RC_FILEVERSION2 - VALUE "InternalName", "GZDoom" + VALUE "InternalName", "QZDoom" VALUE "LegalCopyright", "Copyright \u00A9 1993-1996 id Software, 1998-2010 Randy Heit, 2002-2010 Christoph Oelckers, et al." VALUE "LegalTrademarks", "DoomR is a Registered Trademark of id Software, Inc." - VALUE "OriginalFilename", "gzdoom.exe" - VALUE "ProductName", "GZDoom" + VALUE "OriginalFilename", "qzdoom.exe" + VALUE "ProductName", "QZDoom" VALUE "ProductVersion", RC_PRODUCTVERSION2 END END diff --git a/wadsrc/CMakeLists.txt b/wadsrc/CMakeLists.txt index 80189a328..5a85840e0 100644 --- a/wadsrc/CMakeLists.txt +++ b/wadsrc/CMakeLists.txt @@ -1,3 +1,3 @@ cmake_minimum_required( VERSION 2.8.7 ) -add_pk3(gzdoom.pk3 ${CMAKE_CURRENT_SOURCE_DIR}/static) +add_pk3(qzdoom.pk3 ${CMAKE_CURRENT_SOURCE_DIR}/static) From 48e98c66de08f7de61910ca7fb5eb3029d1cf7c0 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 14 Mar 2017 01:23:10 -0400 Subject: [PATCH 05/14] - fixed: this should probably be bumped to match GZDoom --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index b3382b474..8b081c14a 100644 --- a/src/version.h +++ b/src/version.h @@ -55,7 +55,7 @@ const char *GetVersionString(); #define RC_PRODUCTVERSION2 VERSIONSTR // These are for content versioning. The current state is '2.4'. #define VER_MAJOR 2 -#define VER_MINOR 4 +#define VER_MINOR 5 #define VER_REVISION 0 // Version identifier for network games. From 959fb2577bdd8187c26bae8213ccf4d80f5f07e1 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 14 Mar 2017 04:02:40 -0400 Subject: [PATCH 06/14] - Unfriendly players now spawn at deathmatch starts. --- src/g_game.cpp | 4 +++- src/p_setup.cpp | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/g_game.cpp b/src/g_game.cpp index 92ccc6555..447fb82db 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1766,6 +1766,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) @@ -1775,7 +1777,7 @@ void G_DoReborn (int playernum, bool freshbot) } // spawn at random spot if in deathmatch - if (deathmatch) + if (deathmatch || isUnfriendly) { G_DeathMatchSpawnPlayer (playernum); return; diff --git a/src/p_setup.cpp b/src/p_setup.cpp index eccad199e..064a92a1f 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -4080,6 +4080,22 @@ void P_SetupLevel (const char *lumpname, int position) } } + // [SP] move unfriendly players around + // horribly hacky - yes, this needs rewritten. + for (i = 0; i < MAXPLAYERS; ++i) + { + if (playeringame[i] && players[i].mo != NULL) + { + if (!(players[i].mo->flags & MF_FRIENDLY)) + { + AActor * oldSpawn = players[i].mo; + G_DeathMatchSpawnPlayer (i); + oldSpawn->Destroy(); + } + } + } + + // Don't count monsters in end-of-level sectors if option is on if (dmflags2 & DF2_NOCOUNTENDMONST) { From e49b5493642886764acfc5e2134c3599a3a6453d Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 14 Mar 2017 17:50:47 -0400 Subject: [PATCH 07/14] - added CVARs to control menu blur - made blur effect menu only --- src/gl/renderer/gl_postprocess.cpp | 9 +++++++-- src/menu/menu.cpp | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index 92ef89362..77edfe0c9 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -166,7 +166,7 @@ void FGLRenderer::PostProcessScene(int fixedcm) ColormapScene(fixedcm); LensDistortScene(); ApplyFXAA(); - BlurScene(); + //BlurScene(); } //----------------------------------------------------------------------------- @@ -474,14 +474,19 @@ void FGLRenderer::BloomScene(int fixedcm) // //----------------------------------------------------------------------------- +CVAR(Float, gl_menu_blur, 5.0f, CVAR_ARCHIVE) +CVAR(Bool, gl_menu_blur_enabled, false, CVAR_ARCHIVE) + void FGLRenderer::BlurScene() { + if ((!gl_menu_blur_enabled) || (gl_menu_blur <= 0.0)) + return; FGLDebug::PushGroup("BlurScene"); FGLPostProcessState savedState; savedState.SaveTextureBindings(2); - const float blurAmount = 5.0f; + const float blurAmount = gl_menu_blur; 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); diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index 2050c4834..5f0910759 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -57,6 +57,7 @@ #include "textures/textures.h" #include "virtual.h" #include "events.h" +#include "gl/renderer/gl_renderer.h" // for menu blur // // Todo: Move these elsewhere @@ -780,6 +781,8 @@ void M_Drawer (void) if (!CurrentMenu->DontDim) { screen->Dim(fade); + if (GLRenderer) + GLRenderer->BlurScene(); V_SetBorderNeedRefresh(); } CurrentMenu->CallDrawer(); From 954f21f71d4426c6680dfb82b9b1ba7512b025c4 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 14 Mar 2017 18:46:51 -0400 Subject: [PATCH 08/14] - changed defaults - moved CVARs to head of file as forward declaration - FGLRenderer::BlurScene now checks if postprocessing is enabled before executing --- src/gl/renderer/gl_postprocess.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index 77edfe0c9..cc1092ccc 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -145,6 +145,8 @@ CUSTOM_CVAR(Bool, gl_paltonemap_reverselookup, true, CVAR_ARCHIVE | CVAR_NOINITC GLRenderer->ClearTonemapPalette(); } +CVAR(Float, gl_menu_blur, 1.0f, CVAR_ARCHIVE) +CVAR(Bool, gl_menu_blur_enabled, true, CVAR_ARCHIVE) EXTERN_CVAR(Float, vid_brightness) EXTERN_CVAR(Float, vid_contrast) @@ -166,7 +168,6 @@ void FGLRenderer::PostProcessScene(int fixedcm) ColormapScene(fixedcm); LensDistortScene(); ApplyFXAA(); - //BlurScene(); } //----------------------------------------------------------------------------- @@ -474,19 +475,17 @@ void FGLRenderer::BloomScene(int fixedcm) // //----------------------------------------------------------------------------- -CVAR(Float, gl_menu_blur, 5.0f, CVAR_ARCHIVE) -CVAR(Bool, gl_menu_blur_enabled, false, CVAR_ARCHIVE) - void FGLRenderer::BlurScene() { - if ((!gl_menu_blur_enabled) || (gl_menu_blur <= 0.0)) + float blurAmount = gl_menu_blur; + if ((!gl_menu_blur_enabled) || (gl_menu_blur <= 0.0) || !FGLRenderBuffers::IsEnabled()) return; + FGLDebug::PushGroup("BlurScene"); FGLPostProcessState savedState; savedState.SaveTextureBindings(2); - const float blurAmount = gl_menu_blur; 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); From b747b0c3c6e1840c99954b00749c73a83300c68a Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 14 Mar 2017 19:11:13 -0400 Subject: [PATCH 09/14] - made gl_menu_blur into a menu option - made bluramount also into a gameinfo option - negative gl_menu_blur cvar now uses gameinfo option, 0 disables it - removed gl_menu_blur_enabled since gl_menu_blur==0 does that anyway - made gl_menu_blur default to -1 to use gameinfo option - add default gameinfo bluramount options --- src/gi.cpp | 1 + src/gi.h | 1 + src/gl/renderer/gl_postprocess.cpp | 14 ++++++++++---- src/gl/renderer/gl_renderer.h | 2 +- src/menu/menu.cpp | 2 +- wadsrc/static/language.enu | 1 + wadsrc/static/mapinfo/chex.txt | 1 + wadsrc/static/mapinfo/doomcommon.txt | 1 + wadsrc/static/mapinfo/heretic.txt | 1 + wadsrc/static/mapinfo/hexen.txt | 1 + wadsrc/static/mapinfo/mindefaults.txt | 1 + wadsrc/static/mapinfo/strife.txt | 1 + wadsrc/static/menudef.txt | 2 ++ 13 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/gi.cpp b/src/gi.cpp index 3c53b5b5c..0ac9c82b6 100644 --- a/src/gi.cpp +++ b/src/gi.cpp @@ -369,6 +369,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") diff --git a/src/gi.h b/src/gi.h index bf9ccd450..3f51055fe 100644 --- a/src/gi.h +++ b/src/gi.h @@ -155,6 +155,7 @@ struct gameinfo_t FString CursorPic; uint32_t dimcolor; float dimamount; + float bluramount; int definventorymaxamount; int defaultrespawntime; int defaultdropstyle; diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index cc1092ccc..827dd7da2 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -145,8 +145,7 @@ CUSTOM_CVAR(Bool, gl_paltonemap_reverselookup, true, CVAR_ARCHIVE | CVAR_NOINITC GLRenderer->ClearTonemapPalette(); } -CVAR(Float, gl_menu_blur, 1.0f, CVAR_ARCHIVE) -CVAR(Bool, gl_menu_blur_enabled, true, CVAR_ARCHIVE) +CVAR(Float, gl_menu_blur, -1.0f, CVAR_ARCHIVE) EXTERN_CVAR(Float, vid_brightness) EXTERN_CVAR(Float, vid_contrast) @@ -475,10 +474,17 @@ void FGLRenderer::BloomScene(int fixedcm) // //----------------------------------------------------------------------------- -void FGLRenderer::BlurScene() +void FGLRenderer::BlurScene(float gameinfobluramount) { + // first, respect the CVar float blurAmount = gl_menu_blur; - if ((!gl_menu_blur_enabled) || (gl_menu_blur <= 0.0) || !FGLRenderBuffers::IsEnabled()) + + // 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"); diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index 1bfad8841..ce59a032c 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -180,7 +180,7 @@ public: void ClearTonemapPalette(); void LensDistortScene(); void ApplyFXAA(); - void BlurScene(); + void BlurScene(float gameinfobluramount); void CopyToBackbuffer(const GL_IRECT *bounds, bool applyGamma); void DrawPresentTexture(const GL_IRECT &box, bool applyGamma); void Flush(); diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index 5f0910759..795ee99e5 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -782,7 +782,7 @@ void M_Drawer (void) { screen->Dim(fade); if (GLRenderer) - GLRenderer->BlurScene(); + GLRenderer->BlurScene(gameinfo.bluramount); V_SetBorderNeedRefresh(); } CurrentMenu->CallDrawer(); diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 1a4a97148..ecf47f78a 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2696,6 +2696,7 @@ GLPREFMNU_SPRBILLFACECAMERA = "Sprites face camera"; GLPREFMNU_PARTICLESTYLE = "Particle style"; GLPREFMNU_AMBLIGHT = "Ambient light level"; GLPREFMNU_RENDERQUALITY = "Rendering quality"; +GLPREFMNU_MENUBLUR = "Menu Blur"; GLPREFMNU_VRMODE = "Stereo 3D VR"; GLPREFMNU_VRQUADSTEREO = "Enable Quad Stereo"; GLPREFMNU_MULTISAMPLE = "Multisample"; diff --git a/wadsrc/static/mapinfo/chex.txt b/wadsrc/static/mapinfo/chex.txt index 4bff1283e..f35a5f2cd 100644 --- a/wadsrc/static/mapinfo/chex.txt +++ b/wadsrc/static/mapinfo/chex.txt @@ -38,6 +38,7 @@ gameinfo weaponslot = 7, "LAZDevice" dimcolor = "ff d7 00" dimamount = 0.2 + bluramount = 0.5 definventorymaxamount = 25 defaultrespawntime = 12 defaultdropstyle = 1 diff --git a/wadsrc/static/mapinfo/doomcommon.txt b/wadsrc/static/mapinfo/doomcommon.txt index f24095941..b96164a20 100644 --- a/wadsrc/static/mapinfo/doomcommon.txt +++ b/wadsrc/static/mapinfo/doomcommon.txt @@ -38,6 +38,7 @@ gameinfo weaponslot = 7, "BFG9000" dimcolor = "ff d7 00" dimamount = 0.2 + bluramount = 0.5 definventorymaxamount = 25 defaultrespawntime = 12 defaultdropstyle = 1 diff --git a/wadsrc/static/mapinfo/heretic.txt b/wadsrc/static/mapinfo/heretic.txt index 361bf5cde..f87bd0f02 100644 --- a/wadsrc/static/mapinfo/heretic.txt +++ b/wadsrc/static/mapinfo/heretic.txt @@ -37,6 +37,7 @@ gameinfo weaponslot = 7, "Mace" dimcolor = "00 00 ff" dimamount = 0.2 + bluramount = 0.5 definventorymaxamount = 16 defaultrespawntime = 12 defaultdropstyle = 1 diff --git a/wadsrc/static/mapinfo/hexen.txt b/wadsrc/static/mapinfo/hexen.txt index 6b17df101..a52105a07 100644 --- a/wadsrc/static/mapinfo/hexen.txt +++ b/wadsrc/static/mapinfo/hexen.txt @@ -36,6 +36,7 @@ gameinfo weaponslot = 4, "FWeapQuietus", "CWeapWraithverge", "MWeapBloodscourge" dimcolor = "00 00 ff" dimamount = 0.2 + bluramount = 0.5 definventorymaxamount = 25 defaultrespawntime = 12 defaultdropstyle = 1 diff --git a/wadsrc/static/mapinfo/mindefaults.txt b/wadsrc/static/mapinfo/mindefaults.txt index 885587281..f02ff78d0 100644 --- a/wadsrc/static/mapinfo/mindefaults.txt +++ b/wadsrc/static/mapinfo/mindefaults.txt @@ -27,6 +27,7 @@ gameinfo intermissioncounter = true dimcolor = "6f 00 6b" dimamount = 0.8 + bluramount = 0.0 definventorymaxamount = 25 defaultrespawntime = 12 defaultdropstyle = 1 diff --git a/wadsrc/static/mapinfo/strife.txt b/wadsrc/static/mapinfo/strife.txt index 17b8a1924..fbdf3d9e3 100644 --- a/wadsrc/static/mapinfo/strife.txt +++ b/wadsrc/static/mapinfo/strife.txt @@ -38,6 +38,7 @@ gameinfo weaponslot = 8, "Sigil" dimcolor = "ff d7 00" dimamount = 0.2 + bluramount = 0.5 definventorymaxamount = 25 defaultrespawntime = 16 defaultdropstyle = 2 diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index f6f699088..143057396 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -2169,6 +2169,8 @@ OptionMenu "OpenGLOptions" Option "$GLPREFMNU_PARTICLESTYLE", gl_particles_style, "Particles" Option "$GLPREFMNU_RENDERQUALITY", gl_render_precise, "Precision" StaticText " " + Slider "$GLPREFMNU_MENUBLUR", gl_menu_blur, 0, 5.0, 0.5, 2 + StaticText " " Option "$GLPREFMNU_VRMODE", vr_mode, "VRMode" Option "$GLPREFMNU_VRQUADSTEREO", vr_enable_quadbuffered, "OnOff" StaticText " " From f6d9d153b12573efb06cdd9c09a2885abc63d711 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 21 Mar 2017 08:46:42 -0400 Subject: [PATCH 10/14] - fixed: moved blur before and outside of menu dimming code. --- src/menu/menu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index 795ee99e5..cf82b27f5 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -778,11 +778,11 @@ void M_Drawer (void) if (CurrentMenu != nullptr && menuactive != MENU_Off) { + if (GLRenderer) + GLRenderer->BlurScene(gameinfo.bluramount); if (!CurrentMenu->DontDim) { screen->Dim(fade); - if (GLRenderer) - GLRenderer->BlurScene(gameinfo.bluramount); V_SetBorderNeedRefresh(); } CurrentMenu->CallDrawer(); From 0376d4e8fc4bb30b4897136abfc5a16bf9b09163 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 7 Apr 2017 02:17:34 +0200 Subject: [PATCH 11/14] - Use SDL_GL_GetProcAddress on platforms where the SDL is being used. Since SDL initialized OpenGL for us, it is the only reliable way of retrieving proc addresses. - Check if ogl_LoadFunctions failed and make OpenGLSWFrameBuffer gracefully recover from that --- src/gl/system/gl_load.c | 4 +++- src/gl/system/gl_swframebuffer.cpp | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/gl/system/gl_load.c b/src/gl/system/gl_load.c index 7075d6969..b0608ecb5 100644 --- a/src/gl/system/gl_load.c +++ b/src/gl/system/gl_load.c @@ -85,7 +85,9 @@ static PROC WinGetProcAddress(const char *name) #define IntGetProcAddress(name) AppleGLGetProcAddress(name) #else #if defined(__sgi) || defined(__sun) || defined(__unix__) - #define IntGetProcAddress(name) PosixGetProcAddress((const GLubyte*)name) + void* SDL_GL_GetProcAddress(const char* proc); + #define IntGetProcAddress(name) SDL_GL_GetProcAddress((const char*)name) + //#define IntGetProcAddress(name) PosixGetProcAddress((const GLubyte*)name) /* END OF MANUAL CHANGES, DO NOT REMOVE! */ #else /* GLX */ #include diff --git a/src/gl/system/gl_swframebuffer.cpp b/src/gl/system/gl_swframebuffer.cpp index ee5c0d58d..16138585d 100644 --- a/src/gl/system/gl_swframebuffer.cpp +++ b/src/gl/system/gl_swframebuffer.cpp @@ -194,7 +194,11 @@ OpenGLSWFrameBuffer::OpenGLSWFrameBuffer(void *hMonitor, int width, int height, static bool first = true; if (first) { - ogl_LoadFunctions(); + if (ogl_LoadFunctions() == ogl_LOAD_FAILED) + { + Printf("OpenGL load failed. No OpenGL acceleration will be used.\n"); + return; + } } gl_LoadExtensions(); InitializeState(); From a9591f57a64f45bad73d514018e373812631118d Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 7 Apr 2017 03:03:21 +0200 Subject: [PATCH 12/14] - Detect dinosaur OpenGL and refuse to use it --- src/gl/system/gl_swframebuffer.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/gl/system/gl_swframebuffer.cpp b/src/gl/system/gl_swframebuffer.cpp index 16138585d..b3de63eee 100644 --- a/src/gl/system/gl_swframebuffer.cpp +++ b/src/gl/system/gl_swframebuffer.cpp @@ -200,6 +200,19 @@ OpenGLSWFrameBuffer::OpenGLSWFrameBuffer(void *hMonitor, int width, int height, return; } } + + const char *glversion = (const char*)glGetString(GL_VERSION); + bool isGLES = (glversion && strlen(glversion) > 10 && memcmp(glversion, "OpenGL ES ", 10) == 0); + if (isGLES && ogl_IsVersionGEQ(2, 0) == 0) + { + Printf("OpenGL acceleration requires at least OpenGL ES 2.0. No Acceleration will be used.\n"); + return; + } + else if (!isGLES && ogl_IsVersionGEQ(3, 0) == 0) + { + Printf("OpenGL acceleration requires at least OpenGL 3.0. No Acceleration will be used.\n"); + return; + } gl_LoadExtensions(); InitializeState(); if (first) From 994740b3ae24309e2455c6f16b0a54123b9d1a7a Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 7 Apr 2017 04:09:04 +0200 Subject: [PATCH 13/14] - Add OpenGL ES 3 support to GL renderer --- src/gl/shaders/gl_shader.cpp | 18 ++++++++++++++---- src/gl/system/gl_interface.cpp | 1 + wadsrc/static/shaders/glsl/fuzz_noise.fp | 2 +- wadsrc/static/shaders/glsl/fuzz_standard.fp | 2 +- wadsrc/static/shaders/glsl/main.fp | 2 +- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/gl/shaders/gl_shader.cpp b/src/gl/shaders/gl_shader.cpp index 44be65ebe..2fdf9fbf3 100644 --- a/src/gl/shaders/gl_shader.cpp +++ b/src/gl/shaders/gl_shader.cpp @@ -85,8 +85,11 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * unsigned int lightbuffersize = GLRenderer->mLights->GetBlockSize(); if (lightbuffertype == GL_UNIFORM_BUFFER) { - // This differentiation is for some Intel drivers which fail on #extension, so use of #version 140 is necessary - if (gl.glslversion < 1.4f) + if (gl.es) + { + vp_comb.Format("#version 300 es\n#define NUM_UBO_LIGHTS %d\n", lightbuffersize); + } + else if (gl.glslversion < 1.4f) // This differentiation is for some Intel drivers which fail on #extension, so use of #version 140 is necessary { vp_comb.Format("#version 130\n#extension GL_ARB_uniform_buffer_object : require\n#define NUM_UBO_LIGHTS %d\n", lightbuffersize); } @@ -411,8 +414,15 @@ FShaderManager::FShaderManager() { if (!gl.legacyMode) { - for (int passType = 0; passType < MAX_PASS_TYPES; passType++) - mPassShaders.Push(new FShaderCollection((EPassType)passType)); + if (gl.es) // OpenGL ES does not support multiple fragment shader outputs. As a result, no GBUFFER passes are possible. + { + mPassShaders.Push(new FShaderCollection(NORMAL_PASS)); + } + else + { + for (int passType = 0; passType < MAX_PASS_TYPES; passType++) + mPassShaders.Push(new FShaderCollection((EPassType)passType)); + } } } diff --git a/src/gl/system/gl_interface.cpp b/src/gl/system/gl_interface.cpp index a0d16597f..1a3f4b1ae 100644 --- a/src/gl/system/gl_interface.cpp +++ b/src/gl/system/gl_interface.cpp @@ -176,6 +176,7 @@ void gl_LoadExtensions() gl.legacyMode = false; gl.lightmethod = LM_DEFERRED; gl.buffermethod = BM_DEFERRED; + gl.flags |= RFL_NO_CLIP_PLANES; } else { diff --git a/wadsrc/static/shaders/glsl/fuzz_noise.fp b/wadsrc/static/shaders/glsl/fuzz_noise.fp index 17f15d03b..75afc251f 100644 --- a/wadsrc/static/shaders/glsl/fuzz_noise.fp +++ b/wadsrc/static/shaders/glsl/fuzz_noise.fp @@ -5,7 +5,7 @@ vec4 ProcessTexel() { vec2 texCoord = vTexCoord.st; vec4 basicColor = getTexel(texCoord); - ivec2 texSize = textureSize(tex, 0); + vec2 texSize = vec2(textureSize(tex, 0)); texCoord.x = float( int(texCoord.x * texSize.x) ) / texSize.x; texCoord.y = float( int(texCoord.y * texSize.y) ) / texSize.y; diff --git a/wadsrc/static/shaders/glsl/fuzz_standard.fp b/wadsrc/static/shaders/glsl/fuzz_standard.fp index 95ba52431..b467f64b2 100644 --- a/wadsrc/static/shaders/glsl/fuzz_standard.fp +++ b/wadsrc/static/shaders/glsl/fuzz_standard.fp @@ -5,7 +5,7 @@ vec4 ProcessTexel() { vec2 texCoord = vTexCoord.st; vec4 basicColor = getTexel(texCoord); - ivec2 texSize = textureSize(tex, 0); + vec2 texSize = vec2(textureSize(tex, 0)); texCoord.x = float( int(texCoord.x * texSize.x) ) / texSize.x; texCoord.y = float( int(texCoord.y * texSize.y) ) / texSize.y; diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index 9a682f386..5b4d1438f 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -90,7 +90,7 @@ vec4 getTexel(vec2 st) } break; } - if (uObjectColor2.a == 0) texel *= uObjectColor; + if (uObjectColor2.a == 0.0) texel *= uObjectColor; else texel *= mix(uObjectColor, uObjectColor2, glowdist.z); return desaturate(texel); From dc1695918eb4eff5eb7949e602b20d7b0779f2ea Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 6 Apr 2017 23:29:15 -0400 Subject: [PATCH 14/14] - detect gl es shaders and request them --- src/gl/shaders/gl_shaderprogram.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gl/shaders/gl_shaderprogram.cpp b/src/gl/shaders/gl_shaderprogram.cpp index 5327eeac0..dfb46c544 100644 --- a/src/gl/shaders/gl_shaderprogram.cpp +++ b/src/gl/shaders/gl_shaderprogram.cpp @@ -216,7 +216,10 @@ FString FShaderProgram::PatchShader(ShaderType type, const FString &code, const FString patchedCode; int shaderVersion = MIN((int)round(gl.glslversion * 10) * 10, maxGlslVersion); - patchedCode.AppendFormat("#version %d\n", shaderVersion); + if (gl.es) + patchedCode.AppendFormat("#version %d es\n", shaderVersion); + else + patchedCode.AppendFormat("#version %d\n", shaderVersion); // TODO: Find some way to add extension requirements to the patching //