From df4f4359523f492d48c31c5054e3825f31be48c0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 7 Apr 2018 23:30:28 +0200 Subject: [PATCH] - merged vid_renderer, swtruecolor and r_polyrender into one CVAR to reduce menu clutter. - with renderers freely switchable, some shortcuts in the 3D floor code had to be removed, because now the hardware renderer can get FF_THISINSIDE-flagged 3D floors. - changed handling of attenuated lights in the legacy renderer to be adjusted when being rendered instead of when being spawned. For the software renderer the light needs to retain its original values. --- src/am_map.cpp | 6 +++- src/d_main.cpp | 8 ----- src/d_stats.cpp | 15 ++------ src/g_shared/a_dynlight.cpp | 8 ----- src/gl/compatibility/gl_20.cpp | 6 ++++ src/gl/data/gl_vertexbuffer.cpp | 2 +- src/gl/renderer/gl_renderer.cpp | 4 +-- src/gl/scene/gl_sprite.cpp | 1 + src/gl/scene/gl_swscene.cpp | 11 +++--- src/gl/scene/gl_walls.cpp | 3 ++ src/gl/system/gl_framebuffer.cpp | 11 +++--- src/gl/system/gl_interface.cpp | 7 +--- src/p_3dfloors.cpp | 4 +-- src/p_setup.cpp | 3 +- src/p_user.cpp | 4 +-- src/polyrenderer/drawers/screen_triangle.cpp | 3 +- src/posix/cocoa/i_video.mm | 20 ++--------- src/posix/sdl/hardware.cpp | 17 +-------- src/posix/sdl/sdlglvideo.cpp | 2 -- src/r_data/a_dynlightdata.cpp | 7 ---- src/r_utility.cpp | 8 ----- src/swrenderer/drawers/r_draw.cpp | 4 +-- src/swrenderer/r_swrenderer.cpp | 36 +++++--------------- src/swrenderer/scene/r_scene.cpp | 3 +- src/v_video.cpp | 34 +++++------------- src/v_video.h | 23 +++++++++++++ src/win32/hardware.cpp | 17 +-------- src/win32/i_system.cpp | 4 +-- src/win32/win32gliface.cpp | 2 +- src/win32/win32gliface.h | 1 - wadsrc/static/language.enu | 4 +++ wadsrc/static/menudef.txt | 30 ++++------------ 32 files changed, 95 insertions(+), 213 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 9487693c6..7e6e7546d 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2132,7 +2132,7 @@ void AM_drawSubsectors() { F3DFloor *rover = sec->e->XFloor.ffloors[i]; if (!(rover->flags & FF_EXISTS)) continue; - if (rover->flags & FF_FOG) continue; + if (rover->flags & (FF_FOG|FF_THISINSIDE)) continue; if (!(rover->flags & FF_RENDERPLANES)) continue; if (rover->alpha == 0) continue; double roverz = rover->top.plane->ZatPoint(secx, secy); @@ -2339,6 +2339,7 @@ bool AM_Check3DFloors(line_t *line) for(unsigned i=0;iflags & FF_THISINSIDE) continue; if (!(rover->flags & FF_EXISTS)) continue; if (rover->alpha == 0) continue; realfrontcount++; @@ -2347,6 +2348,7 @@ bool AM_Check3DFloors(line_t *line) for(unsigned i=0;iflags & FF_THISINSIDE) continue; if (!(rover->flags & FF_EXISTS)) continue; if (rover->alpha == 0) continue; realbackcount++; @@ -2357,6 +2359,7 @@ bool AM_Check3DFloors(line_t *line) for(unsigned i=0;iflags & FF_THISINSIDE) continue; // only relevant for software rendering. if (!(rover->flags & FF_EXISTS)) continue; if (rover->alpha == 0) continue; @@ -2364,6 +2367,7 @@ bool AM_Check3DFloors(line_t *line) for(unsigned j=0;jflags & FF_THISINSIDE) continue; // only relevant for software rendering. if (!(rover2->flags & FF_EXISTS)) continue; if (rover2->alpha == 0) continue; if (rover->model == rover2->model && rover->flags == rover2->flags) diff --git a/src/d_main.cpp b/src/d_main.cpp index 253ea6b8a..1d26efce3 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -703,13 +703,6 @@ void D_Display () // [RH] change the screen mode if needed if (setmodeneeded) { - int oldrenderer; - extern int currentrenderer; - EXTERN_CVAR(Int, vid_renderer) - oldrenderer = vid_renderer; // [SP] Save pending vid_renderer setting (hack) - if (currentrenderer != vid_renderer) - vid_renderer = currentrenderer; - // Change screen mode. if (Video->SetResolution (NewWidth, NewHeight, NewBits)) { @@ -728,7 +721,6 @@ void D_Display () // Reset the mouse cursor in case the bit depth changed vid_cursor.Callback(); } - vid_renderer = oldrenderer; // [SP] Restore pending vid_renderer setting } // change the view size if needed diff --git a/src/d_stats.cpp b/src/d_stats.cpp index d607a8a5b..8809ae494 100644 --- a/src/d_stats.cpp +++ b/src/d_stats.cpp @@ -36,7 +36,6 @@ extern int sys_ostype; #include "version.h" #include "v_video.h" -extern int currentrenderer; CVAR(Int, sys_statsenabled, -1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOSET) CVAR(String, sys_statshost, "gzstats.drdteam.org", CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOSET) CVAR(Int, sys_statsport, 80, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOSET) @@ -261,14 +260,7 @@ static void D_DoHTTPRequest(const char *request) { if (I_HTTPRequest(request)) { - if (currentrenderer == 0) - { - cvar_forceset("sentstats_swr_done", CHECKVERSIONSTR); - } - else - { - cvar_forceset("sentstats_hwr_done", CHECKVERSIONSTR); - } + cvar_forceset("sentstats_hwr_done", CHECKVERSIONSTR); } } @@ -284,12 +276,11 @@ void D_DoAnonStats() done = true; // Do not repeat if already sent. - if (currentrenderer == 0 && sentstats_swr_done >= CHECKVERSION) return; - if (currentrenderer == 1 && sentstats_hwr_done >= CHECKVERSION) return; + if (sentstats_hwr_done >= CHECKVERSION) return; static char requeststring[1024]; mysnprintf(requeststring, sizeof requeststring, "GET /stats.py?render=%i&cores=%i&os=%i&renderconfig=%i HTTP/1.1\nHost: %s\nConnection: close\nUser-Agent: %s %s\n\n", - GetRenderInfo(), GetCoreInfo(), GetOSVersion(), currentrenderer, sys_statshost.GetHumanString(), GAMENAME, VERSIONSTR); + GetRenderInfo(), GetCoreInfo(), GetOSVersion(), V_IsHardwareRenderer(), sys_statshost.GetHumanString(), GAMENAME, VERSIONSTR); DPrintf(DMSG_NOTIFY, "Sending %s", requeststring); std::thread t1(D_DoHTTPRequest, requeststring); t1.detach(); diff --git a/src/g_shared/a_dynlight.cpp b/src/g_shared/a_dynlight.cpp index 7f23f871e..69c798fd2 100644 --- a/src/g_shared/a_dynlight.cpp +++ b/src/g_shared/a_dynlight.cpp @@ -76,8 +76,6 @@ #include "gl/system//gl_interface.h" #include "vm.h" -extern int currentrenderer; - CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { @@ -181,12 +179,6 @@ void ADynamicLight::BeginPlay() specialf1 = DAngle(double(SpawnAngle)).Normalized360().Degrees; visibletoplayer = true; - - if (currentrenderer == 1 && gl.legacyMode && (lightflags & LF_ATTENUATE)) - { - args[LIGHT_INTENSITY] = args[LIGHT_INTENSITY] * 2 / 3; - args[LIGHT_SECONDARY_INTENSITY] = args[LIGHT_SECONDARY_INTENSITY] * 2 / 3; - } } //========================================================================== diff --git a/src/gl/compatibility/gl_20.cpp b/src/gl/compatibility/gl_20.cpp index ae8037d29..0a6a743e0 100644 --- a/src/gl/compatibility/gl_20.cpp +++ b/src/gl/compatibility/gl_20.cpp @@ -406,6 +406,12 @@ bool gl_SetupLight(int group, Plane & p, ADynamicLight * light, FVector3 & nearP float dist = fabsf(p.DistToPoint(lpos.X, lpos.Z, lpos.Y)); float radius = light->GetRadius(); + if (V_IsHardwareRenderer() && gl.legacyMode && (light->lightflags & LF_ATTENUATE)) + { + radius *= 0.66f; + } + + if (radius <= 0.f) return false; if (dist > radius) return false; if (checkside && gl_lights_checkside && p.PointOnSide(lpos.X, lpos.Z, lpos.Y)) diff --git a/src/gl/data/gl_vertexbuffer.cpp b/src/gl/data/gl_vertexbuffer.cpp index d40564386..8e9ab5c59 100644 --- a/src/gl/data/gl_vertexbuffer.cpp +++ b/src/gl/data/gl_vertexbuffer.cpp @@ -298,7 +298,7 @@ static F3DFloor *Find3DFloor(sector_t *target, sector_t *model) for(unsigned i=0; ie->XFloor.ffloors.Size(); i++) { F3DFloor *ffloor = target->e->XFloor.ffloors[i]; - if (ffloor->model == model) return ffloor; + if (ffloor->model == model && !(ffloor->flags & FF_THISINSIDE)) return ffloor; } return NULL; } diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index 0a29edf9f..74100cc80 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -77,7 +77,6 @@ EXTERN_CVAR(Int, screenblocks) EXTERN_CVAR(Bool, cl_capfps) EXTERN_CVAR(Float, underwater_fade_scalar) -EXTERN_CVAR(Bool, swtruecolor) CVAR(Bool, gl_scale_viewport, true, CVAR_ARCHIVE); extern bool NoInterpolateView; @@ -427,14 +426,13 @@ void FGLRenderer::EndOffscreen() // renders the view // //----------------------------------------------------------------------------- -extern int currentrenderer; void FGLRenderer::RenderView(player_t* player) { gl_RenderState.SetVertexBuffer(mVBO); mVBO->Reset(); - if (currentrenderer == 0) + if (!V_IsHardwareRenderer()) { if (swdrawer == nullptr) swdrawer = new SWSceneDrawer; swdrawer->RenderView(player); diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 55c675f74..939a109f7 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -597,6 +597,7 @@ void GLSprite::PerformSpriteClipAdjustment(AActor *thing, const DVector2 &thingp for (unsigned int i = 0; i < x.ffloors.Size(); i++) { F3DFloor * ff = x.ffloors[i]; + if (ff->flags & FF_THISINSIDE) continue; // only relevant for software rendering. float floorh = ff->top.plane->ZatPoint(thingpos); float ceilingh = ff->bottom.plane->ZatPoint(thingpos); if (floorh == thing->floorz) diff --git a/src/gl/scene/gl_swscene.cpp b/src/gl/scene/gl_swscene.cpp index 248016c45..7ee4766a4 100644 --- a/src/gl/scene/gl_swscene.cpp +++ b/src/gl/scene/gl_swscene.cpp @@ -43,7 +43,6 @@ int BaseBlendR, BaseBlendG, BaseBlendB; float BaseBlendA; -EXTERN_CVAR(Bool, swtruecolor) // using FDummyTexture as base because that implements the required software renderer functions. @@ -103,13 +102,13 @@ SWSceneDrawer::~SWSceneDrawer() void SWSceneDrawer::RenderView(player_t *player) { - DCanvas buffer(screen->GetWidth(), screen->GetHeight(), swtruecolor); - if (FBTexture == nullptr || FBTexture->hwtex == nullptr || FBTexture->GetWidth() != screen->GetWidth() || FBTexture->GetHeight() != screen->GetHeight() || (swtruecolor? 1:0) != FBTexture->WidthBits) + DCanvas buffer(screen->GetWidth(), screen->GetHeight(), V_IsTrueColor()); + if (FBTexture == nullptr || FBTexture->hwtex == nullptr || FBTexture->GetWidth() != screen->GetWidth() || FBTexture->GetHeight() != screen->GetHeight() || (V_IsTrueColor() ? 1:0) != FBTexture->WidthBits) { // This manually constructs its own material here. if (FBTexture != nullptr) delete FBTexture; - FBTexture = new FSWSceneTexture(screen->GetWidth(), screen->GetHeight(), swtruecolor); - FBTexture->hwtex->AllocateBuffer(screen->GetWidth(), screen->GetHeight(), swtruecolor ? 4 : 1); + FBTexture = new FSWSceneTexture(screen->GetWidth(), screen->GetHeight(), V_IsTrueColor()); + FBTexture->hwtex->AllocateBuffer(screen->GetWidth(), screen->GetHeight(), V_IsTrueColor() ? 4 : 1); auto mat = FMaterial::ValidateTexture(FBTexture, false); mat->AddTextureLayer(PaletteTexture); } @@ -123,5 +122,5 @@ void SWSceneDrawer::RenderView(player_t *player) screen->Begin2D(false); screen->DrawTexture(FBTexture, 0, 0, DTA_SpecialColormap, map, TAG_DONE); SWRenderer->DrawRemainingPlayerSprites(); - GLRenderer->DrawBlend(r_viewpoint.sector, !!map, swtruecolor, true); + GLRenderer->DrawBlend(r_viewpoint.sector, !!map, V_IsTrueColor(), true); } diff --git a/src/gl/scene/gl_walls.cpp b/src/gl/scene/gl_walls.cpp index b40a3ec4e..b7eb40393 100644 --- a/src/gl/scene/gl_walls.cpp +++ b/src/gl/scene/gl_walls.cpp @@ -1218,6 +1218,7 @@ void GLWall::InverseFloors(seg_t * seg, sector_t * frontsector, for (unsigned int i = 0; i < frontffloors.Size(); i++) { F3DFloor * rover = frontffloors[i]; + if (rover->flags & FF_THISINSIDE) continue; // only relevant for software rendering. if (!(rover->flags&FF_EXISTS)) continue; if (!(rover->flags&FF_RENDERSIDES)) continue; if (!(rover->flags&(FF_INVERTSIDES | FF_ALLSIDES))) continue; @@ -1270,6 +1271,7 @@ void GLWall::ClipFFloors(seg_t * seg, F3DFloor * ffloor, sector_t * frontsector, for (unsigned int i = 0; i < frontffloors.Size(); i++) { F3DFloor * rover = frontffloors[i]; + if (rover->flags & FF_THISINSIDE) continue; // only relevant for software rendering. if (!(rover->flags&FF_EXISTS)) continue; if (!(rover->flags&FF_RENDERSIDES)) continue; if ((rover->flags&(FF_SWIMMABLE | FF_TRANSLUCENT)) != flags) continue; @@ -1369,6 +1371,7 @@ void GLWall::DoFFloorBlocks(seg_t * seg, sector_t * frontsector, sector_t * back for (unsigned int i = 0; i < backffloors.Size(); i++) { F3DFloor * rover = backffloors[i]; + if (rover->flags & FF_THISINSIDE) continue; // only relevant for software rendering. if (!(rover->flags&FF_EXISTS)) continue; if (!(rover->flags&FF_RENDERSIDES) || (rover->flags&FF_INVERTSIDES)) continue; diff --git a/src/gl/system/gl_framebuffer.cpp b/src/gl/system/gl_framebuffer.cpp index c51bf96f9..1a9725656 100644 --- a/src/gl/system/gl_framebuffer.cpp +++ b/src/gl/system/gl_framebuffer.cpp @@ -195,13 +195,13 @@ void OpenGLFrameBuffer::Update() // // //=========================================================================== -extern int currentrenderer; void OpenGLFrameBuffer::RenderTextureView(FCanvasTexture *tex, AActor *Viewpoint, double FOV) { - if (currentrenderer == 0) + if (!V_IsHardwareRenderer()) + { Super::RenderTextureView(tex, Viewpoint, FOV); - + } else if (GLRenderer != nullptr) { GLRenderer->RenderTextureView(tex, Viewpoint, FOV); @@ -217,7 +217,7 @@ void OpenGLFrameBuffer::RenderTextureView(FCanvasTexture *tex, AActor *Viewpoint void OpenGLFrameBuffer::WriteSavePic(player_t *player, FileWriter *file, int width, int height) { - if (currentrenderer == 0) + if (!V_IsHardwareRenderer()) Super::WriteSavePic(player, file, width, height); if (GLRenderer != nullptr) @@ -249,7 +249,8 @@ EXTERN_CVAR(Int, gl_tonemap) uint32_t OpenGLFrameBuffer::GetCaps() { - if (currentrenderer == 0) return Super::GetCaps(); + if (!V_IsHardwareRenderer()) + return Super::GetCaps(); // describe our basic feature set ActorRenderFeatureFlags FlagSet = RFF_FLATSPRITES | RFF_MODELS | RFF_SLOPE3DFLOORS | diff --git a/src/gl/system/gl_interface.cpp b/src/gl/system/gl_interface.cpp index e1102de92..412d96352 100644 --- a/src/gl/system/gl_interface.cpp +++ b/src/gl/system/gl_interface.cpp @@ -44,7 +44,6 @@ RenderContext gl; static double realglversion; // this is public so the statistics code can access it. EXTERN_CVAR(Bool, gl_legacy_mode) -extern int currentrenderer; CVAR(Bool, gl_riskymodernpath, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) //========================================================================== @@ -211,11 +210,7 @@ void gl_LoadExtensions() // The minimum requirement for the modern render path is GL 3.3. // Although some GL 3.1 or 3.2 solutions may theoretically work they are usually too broken or too slow. - // unless, of course, we're simply using this as a software backend... - float minmodernpath = 3.3f; - if (gl_riskymodernpath) - minmodernpath = 3.1f; - if ((gl_version < minmodernpath && (currentrenderer==1)) || gl_version < 3.0f) + if (gl_version < 3.3f) { gl.legacyMode = true; gl.lightmethod = LM_LEGACY; diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index 2ad374166..376a1b060 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -50,8 +50,6 @@ #include "g_levellocals.h" #include "actorinlines.h" -extern int currentrenderer; - //========================================================================== // // 3D Floors @@ -197,7 +195,7 @@ static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flag // kg3D - software renderer only hack // this is really required because of ceilingclip and floorclip - if((currentrenderer == 0) && (flags & FF_BOTHPLANES)) + if(flags & FF_BOTHPLANES) { P_Add3DFloor(sec, sec2, master, FF_EXISTS | FF_THISINSIDE | FF_RENDERPLANES | FF_NOSHADE | FF_SEETHROUGH | FF_SHOOTTHROUGH | (flags & (FF_INVERTSECTOR | FF_TRANSLUCENT | FF_ADDITIVETRANS)), alpha); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index bafa30a9a..33fff756a 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -3427,7 +3427,6 @@ void P_GetPolySpots (MapData * map, TArray &spots, TAr // Preloads all relevant graphics for the level. // //=========================================================================== -extern int currentrenderer; void gl_PrecacheTexture(uint8_t *texhitlist, TMap &actorhitlist); static void P_PrecacheLevel() @@ -3504,7 +3503,7 @@ static void P_PrecacheLevel() } // This is just a temporary solution, until the hardware renderer's texture manager is in a better state. - if (currentrenderer == 0) + if (!V_IsHardwareRenderer()) SWRenderer->Precache(hitlist, actorhitlist); else gl_PrecacheTexture(hitlist, actorhitlist); diff --git a/src/p_user.cpp b/src/p_user.cpp index 7bf85b4a4..6ec5b629f 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -731,9 +731,7 @@ bool player_t::GetPainFlash(FName type, PalEntry *color) const //=========================================================================== EXTERN_CVAR(Float, maxviewpitch) -EXTERN_CVAR(Bool, r_polyrenderer) EXTERN_CVAR(Bool, cl_oldfreelooklimit); -extern int currentrenderer; static int GetSoftPitch(bool down) @@ -749,7 +747,7 @@ void player_t::SendPitchLimits() const { int uppitch, downpitch; - if (currentrenderer == 0 && !r_polyrenderer) + if (V_IsSoftwareRenderer()) { uppitch = GetSoftPitch(false); downpitch = GetSoftPitch(true); diff --git a/src/polyrenderer/drawers/screen_triangle.cpp b/src/polyrenderer/drawers/screen_triangle.cpp index 37a7f843b..4982c1be6 100644 --- a/src/polyrenderer/drawers/screen_triangle.cpp +++ b/src/polyrenderer/drawers/screen_triangle.cpp @@ -1071,11 +1071,10 @@ void TriangleBlock::DepthWrite(const TriDrawTriangleArgs *args) #endif -EXTERN_CVAR(Bool, r_polyrenderer) void ScreenTriangle::Draw(const TriDrawTriangleArgs *args, WorkerThreadData *thread) { - if (r_polyrenderer) + if (V_IsPolyRenderer()) { TriangleBlock block(args, thread); block.Render(); diff --git a/src/posix/cocoa/i_video.mm b/src/posix/cocoa/i_video.mm index 3d0c0c92d..ed20a6ca3 100644 --- a/src/posix/cocoa/i_video.mm +++ b/src/posix/cocoa/i_video.mm @@ -102,26 +102,10 @@ DFrameBuffer *CreateGLSWFrameBuffer(int width, int height, bool bgra, bool fullscreen); -extern int currentrenderer; - EXTERN_CVAR(Bool, ticker ) EXTERN_CVAR(Bool, vid_vsync) EXTERN_CVAR(Bool, vid_hidpi) -CUSTOM_CVAR(Bool, swtruecolor, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) -{ - // Strictly speaking this doesn't require a mode switch, but it is the easiest - // way to force a CreateFramebuffer call without a lot of refactoring. - if (currentrenderer == 0) - { - extern int NewWidth, NewHeight, NewBits, DisplayBits; - NewWidth = screen->VideoWidth; - NewHeight = screen->VideoHeight; - NewBits = DisplayBits; - setmodeneeded = true; - } -} - CUSTOM_CVAR(Bool, fullscreen, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) { extern int NewWidth, NewHeight, NewBits, DisplayBits; @@ -386,7 +370,7 @@ CocoaVideo::CocoaVideo() // Create OpenGL pixel format NSOpenGLPixelFormatAttribute defaultProfile = NSOpenGLProfileVersion3_2Core; - if (1 == vid_renderer && NSAppKitVersionNumber < AppKit10_9) + if (NSAppKitVersionNumber < AppKit10_9) { // There is no support for OpenGL 3.3 before Mavericks defaultProfile = NSOpenGLProfileVersionLegacy; @@ -821,7 +805,7 @@ void I_InitGraphics() DFrameBuffer* I_SetMode(int &width, int &height, DFrameBuffer* old) { - return Video->CreateFrameBuffer(width, height, swtruecolor, fullscreen, old); + return Video->CreateFrameBuffer(width, height, false, fullscreen, old); } bool I_CheckResolution(const int width, const int height, const int bits) diff --git a/src/posix/sdl/hardware.cpp b/src/posix/sdl/hardware.cpp index ca89bd8bf..12bb00c9c 100644 --- a/src/posix/sdl/hardware.cpp +++ b/src/posix/sdl/hardware.cpp @@ -52,7 +52,6 @@ EXTERN_CVAR (Bool, ticker) EXTERN_CVAR (Bool, fullscreen) -EXTERN_CVAR (Bool, swtruecolor) EXTERN_CVAR (Float, vid_winscale) IVideo *Video; @@ -91,7 +90,6 @@ void I_InitGraphics () val.Bool = !!Args->CheckParm ("-devparm"); ticker.SetGenericRepDefault (val, CVAR_Bool); - //currentrenderer = vid_renderer; Video = new SDLGLVideo(0); if (Video == NULL) @@ -121,7 +119,7 @@ DFrameBuffer *I_SetMode (int &width, int &height, DFrameBuffer *old) fs = fullscreen; break; } - DFrameBuffer *res = Video->CreateFrameBuffer (width, height, swtruecolor, fs, old); + DFrameBuffer *res = Video->CreateFrameBuffer (width, height, false, fs, old); /* Right now, CreateFrameBuffer cannot return NULL if (res == NULL) @@ -259,19 +257,6 @@ void I_SetFPSLimit(int limit) extern int NewWidth, NewHeight, NewBits, DisplayBits; -CUSTOM_CVAR(Bool, swtruecolor, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) -{ - // Strictly speaking this doesn't require a mode switch, but it is the easiest - // way to force a CreateFramebuffer call without a lot of refactoring. - if (currentrenderer == 0) - { - NewWidth = screen->VideoWidth; - NewHeight = screen->VideoHeight; - NewBits = DisplayBits; - setmodeneeded = true; - } -} - CUSTOM_CVAR (Bool, fullscreen, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) { NewWidth = screen->VideoWidth; diff --git a/src/posix/sdl/sdlglvideo.cpp b/src/posix/sdl/sdlglvideo.cpp index 4fbf1005f..4d2998095 100644 --- a/src/posix/sdl/sdlglvideo.cpp +++ b/src/posix/sdl/sdlglvideo.cpp @@ -67,12 +67,10 @@ // EXTERNAL DATA DECLARATIONS ---------------------------------------------- extern IVideo *Video; -// extern int vid_renderer; EXTERN_CVAR (Float, Gamma) EXTERN_CVAR (Int, vid_adapter) EXTERN_CVAR (Int, vid_displaybits) -EXTERN_CVAR (Int, vid_renderer) EXTERN_CVAR (Int, vid_maxfps) EXTERN_CVAR (Bool, cl_capfps) diff --git a/src/r_data/a_dynlightdata.cpp b/src/r_data/a_dynlightdata.cpp index 24a55ab71..b9c09a690 100644 --- a/src/r_data/a_dynlightdata.cpp +++ b/src/r_data/a_dynlightdata.cpp @@ -154,13 +154,6 @@ void AddLightDefaults(FLightDefaults *defaults) } } - // If the current renderer cannot handle attenuated lights we need to reduce the radius here to account for the far more bright lights this would create. - if (/*!Renderer->CanAttenuate() &&*/ (defaults->GetAttenuate())) - { - defaults->SetArg(LIGHT_INTENSITY, defaults->GetArg(LIGHT_INTENSITY) * 2 / 3); - defaults->SetArg(LIGHT_SECONDARY_INTENSITY, defaults->GetArg(LIGHT_SECONDARY_INTENSITY) * 2 / 3); - } - LightDefaults.Push(defaults); } diff --git a/src/r_utility.cpp b/src/r_utility.cpp index 25dc4adaa..abde8f8ad 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -398,8 +398,6 @@ subsector_t *R_PointInSubsector (fixed_t x, fixed_t y) // //========================================================================== -extern int currentrenderer; -EXTERN_CVAR(Int, vid_renderer) FRenderer *CreateSWRenderer(); @@ -417,12 +415,6 @@ void R_Init () R_InitTranslationTables (); R_SetViewSize (screenblocks); - currentrenderer = vid_renderer; - if (currentrenderer == 1) - Printf("Renderer: OpenGL\n"); - else - Printf("Renderer: Software on OpenGL\n"); - if (SWRenderer == NULL) { SWRenderer = CreateSWRenderer(); diff --git a/src/swrenderer/drawers/r_draw.cpp b/src/swrenderer/drawers/r_draw.cpp index 3eb63a85f..cf154dd08 100644 --- a/src/swrenderer/drawers/r_draw.cpp +++ b/src/swrenderer/drawers/r_draw.cpp @@ -193,7 +193,7 @@ namespace swrenderer void R_UpdateFuzzPosFrameStart() { - if (r_fuzzscale || r_polyrenderer) + if (r_fuzzscale || V_IsPolyRenderer()) { static int next_random = 0; @@ -207,7 +207,7 @@ namespace swrenderer void R_UpdateFuzzPos(const SpriteDrawerArgs &args) { - if (!r_fuzzscale && !r_polyrenderer) + if (!r_fuzzscale && !V_IsPolyRenderer()) { int yl = MAX(args.FuzzY1(), 1); int yh = MIN(args.FuzzY2(), fuzzviewheight); diff --git a/src/swrenderer/r_swrenderer.cpp b/src/swrenderer/r_swrenderer.cpp index 7bbbe6aae..cce974cde 100644 --- a/src/swrenderer/r_swrenderer.cpp +++ b/src/swrenderer/r_swrenderer.cpp @@ -52,8 +52,6 @@ #include "p_setup.h" #include "g_levellocals.h" -extern int currentrenderer; - // [BB] Use ZDoom's freelook limit for the sotfware renderer. // Note: ZDoom's limit is chosen such that the sky is rendered properly. CUSTOM_CVAR (Bool, cl_oldfreelooklimit, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) @@ -65,20 +63,6 @@ CUSTOM_CVAR (Bool, cl_oldfreelooklimit, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG EXTERN_CVAR(Float, maxviewpitch) // [SP] CVAR from OpenGL Renderer EXTERN_CVAR(Bool, r_drawvoxels) -CUSTOM_CVAR(Bool, r_polyrenderer, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) -{ - if (self == 1 && !hasglnodes) - { - Printf("No GL BSP detected. You must restart the map before rendering will be correct\n"); - } - - if (usergame) - { - // [SP] Update pitch limits to the netgame/gamesim. - players[consoleplayer].SendPitchLimits(); - } -} - using namespace swrenderer; FSoftwareRenderer::FSoftwareRenderer() @@ -96,11 +80,9 @@ FRenderer *CreateSWRenderer() return new FSoftwareRenderer; } -EXTERN_CVAR(Bool, swtruecolor) - void FSoftwareRenderer::PrecacheTexture(FTexture *tex, int cache) { - bool isbgra = swtruecolor; + bool isbgra = V_IsTrueColor(); if (tex != NULL) { @@ -177,7 +159,7 @@ void FSoftwareRenderer::Precache(uint8_t *texhitlist, TMap & void FSoftwareRenderer::RenderView(player_t *player, DCanvas *target) { - if (r_polyrenderer) + if (V_IsPolyRenderer()) { PolyRenderer::Instance()->Viewpoint = r_viewpoint; PolyRenderer::Instance()->Viewwindow = r_viewwindow; @@ -203,7 +185,7 @@ void FSoftwareRenderer::WriteSavePic (player_t *player, FileWriter *file, int wi PalEntry palette[256]; // Take a snapshot of the player's view - if (r_polyrenderer) + if (V_IsPolyRenderer()) { PolyRenderer::Instance()->Viewpoint = r_viewpoint; PolyRenderer::Instance()->Viewwindow = r_viewwindow; @@ -226,7 +208,7 @@ void FSoftwareRenderer::WriteSavePic (player_t *player, FileWriter *file, int wi void FSoftwareRenderer::DrawRemainingPlayerSprites() { - if (!r_polyrenderer) + if (!V_IsPolyRenderer()) { mScene.MainThread()->Viewport->viewpoint = r_viewpoint; mScene.MainThread()->Viewport->viewwindow = r_viewwindow; @@ -247,7 +229,7 @@ void FSoftwareRenderer::DrawRemainingPlayerSprites() void FSoftwareRenderer::OnModeSet () { // This does not work if the SW renderer is not in use. - if (currentrenderer == 0) + if (!V_IsHardwareRenderer()) mScene.ScreenResized(); } @@ -258,9 +240,9 @@ void FSoftwareRenderer::SetClearColor(int color) void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, double fov) { - auto renderTarget = r_polyrenderer ? PolyRenderer::Instance()->RenderTarget : mScene.MainThread()->Viewport->RenderTarget; - auto &cameraViewpoint = r_polyrenderer ? PolyRenderer::Instance()->Viewpoint : mScene.MainThread()->Viewport->viewpoint; - auto &cameraViewwindow = r_polyrenderer ? PolyRenderer::Instance()->Viewwindow : mScene.MainThread()->Viewport->viewwindow; + auto renderTarget = V_IsPolyRenderer() ? PolyRenderer::Instance()->RenderTarget : mScene.MainThread()->Viewport->RenderTarget; + auto &cameraViewpoint = V_IsPolyRenderer() ? PolyRenderer::Instance()->Viewpoint : mScene.MainThread()->Viewport->viewpoint; + auto &cameraViewwindow = V_IsPolyRenderer() ? PolyRenderer::Instance()->Viewwindow : mScene.MainThread()->Viewport->viewwindow; // Grab global state shared with rest of zdoom cameraViewpoint = r_viewpoint; @@ -276,7 +258,7 @@ void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoin DAngle savedfov = cameraViewpoint.FieldOfView; R_SetFOV (cameraViewpoint, fov); - if (r_polyrenderer) + if (V_IsPolyRenderer()) PolyRenderer::Instance()->RenderViewToCanvas(viewpoint, Canvas, 0, 0, tex->GetWidth(), tex->GetHeight(), tex->bFirstUpdate); else mScene.RenderViewToCanvas(viewpoint, Canvas, 0, 0, tex->GetWidth(), tex->GetHeight(), tex->bFirstUpdate); diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index 9a4bbb995..f11b6f486 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -64,7 +64,6 @@ void PeekThreadedErrorPane(); #endif EXTERN_CVAR(Int, r_clearbuffer) -EXTERN_CVAR(Bool, swtruecolor) CVAR(Bool, r_scene_multithreaded, false, 0); CVAR(Bool, r_models, false, 0); @@ -368,7 +367,7 @@ namespace swrenderer auto viewport = MainThread()->Viewport.get(); int width = SCREENWIDTH; int height = SCREENHEIGHT; - viewport->RenderTarget = new DCanvas(width, height, swtruecolor); // Some code deeper down needs something valid here, so give it a dummy canvas. + viewport->RenderTarget = new DCanvas(width, height, V_IsTrueColor()); // Some code deeper down needs something valid here, so give it a dummy canvas. float trueratio; ActiveRatio(width, height, &trueratio); viewport->SetViewport(MainThread(), SCREENWIDTH, SCREENHEIGHT, trueratio); diff --git a/src/v_video.cpp b/src/v_video.cpp index b78ab3f54..df7784548 100644 --- a/src/v_video.cpp +++ b/src/v_video.cpp @@ -104,41 +104,24 @@ CUSTOM_CVAR(Int, vid_maxfps, 200, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) } } -int currentrenderer = -1; - -// [ZDoomGL] -CUSTOM_CVAR(Int, vid_renderer, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +CUSTOM_CVAR(Int, vid_rendermode, 4, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { - // 0: Software renderer - // 1: OpenGL renderer - - if (self != currentrenderer) + if (usergame) { - switch (self) - { - case 0: - Printf("Switching to software renderer...\n"); - break; - case 1: - Printf("Switching to OpenGL renderer...\n"); - break; - default: - Printf("Unknown renderer (%d). Falling back to software renderer...\n", (int)vid_renderer); - self = 0; // make sure to actually switch to the software renderer - break; - } + // [SP] Update pitch limits to the netgame/gamesim. + players[consoleplayer].SendPitchLimits(); } - currentrenderer = self; + // No further checks needed. All this changes now is which scene drawer the render backend calls. } + EXTERN_CVAR(Bool, r_blendmethod) int active_con_scale(); FRenderer *SWRenderer; -EXTERN_CVAR (Bool, swtruecolor) EXTERN_CVAR (Bool, fullscreen) #define DBGBREAK assert(0) @@ -964,14 +947,13 @@ void DFrameBuffer::GameRestart() // //========================================================================== -EXTERN_CVAR(Bool, r_polyrenderer) EXTERN_CVAR(Bool, r_drawvoxels) uint32_t DFrameBuffer::GetCaps() { ActorRenderFeatureFlags FlagSet = 0; - if (r_polyrenderer) + if (V_IsPolyRenderer()) FlagSet |= RFF_POLYGONAL | RFF_TILTPITCH | RFF_SLOPE3DFLOORS; else { @@ -980,7 +962,7 @@ uint32_t DFrameBuffer::GetCaps() FlagSet |= RFF_VOXELS; } - if (swtruecolor) + if (V_IsTrueColor()) FlagSet |= RFF_TRUECOLOR; else FlagSet |= RFF_COLORMAP; diff --git a/src/v_video.h b/src/v_video.h index 393ffb891..299694524 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -53,6 +53,29 @@ void V_UpdateModeSize (int width, int height); void V_OutputResized (int width, int height); void V_CalcCleanFacs (int designwidth, int designheight, int realwidth, int realheight, int *cleanx, int *cleany, int *cx1=NULL, int *cx2=NULL); +EXTERN_CVAR(Int, vid_rendermode) + +inline bool V_IsHardwareRenderer() +{ + return vid_rendermode == 4; +} + +inline bool V_IsSoftwareRenderer() +{ + return vid_rendermode < 2; +} + +inline bool V_IsPolyRenderer() +{ + return vid_rendermode == 2 || vid_rendermode == 3; +} + +inline bool V_IsTrueColor() +{ + return vid_rendermode == 1 || vid_rendermode == 3; +} + + class FTexture; struct FColormap; class FileWriter; diff --git a/src/win32/hardware.cpp b/src/win32/hardware.cpp index e6be60788..4c7f43779 100644 --- a/src/win32/hardware.cpp +++ b/src/win32/hardware.cpp @@ -49,7 +49,6 @@ EXTERN_CVAR (Bool, ticker) EXTERN_CVAR (Bool, fullscreen) -EXTERN_CVAR (Bool, swtruecolor) EXTERN_CVAR (Float, vid_winscale) EXTERN_CVAR (Bool, win_borderless) @@ -67,7 +66,6 @@ IVideo *Video; IVideo *gl_CreateVideo(); void I_RestartRenderer(); -extern int currentrenderer; int currentcanvas = -1; int currentgpuswitch = -1; bool changerenderer; @@ -180,7 +178,7 @@ DFrameBuffer *I_SetMode (int &width, int &height, DFrameBuffer *old) } break; } - DFrameBuffer *res = Video->CreateFrameBuffer (width, height, swtruecolor, fs, old); + DFrameBuffer *res = Video->CreateFrameBuffer (width, height, false, fs, old); //* Right now, CreateFrameBuffer cannot return NULL if (res == NULL) @@ -359,19 +357,6 @@ void I_RestoreWindowedPos () extern int NewWidth, NewHeight, NewBits, DisplayBits; -CUSTOM_CVAR(Bool, swtruecolor, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) -{ - // Strictly speaking this doesn't require a mode switch, but it is the easiest - // way to force a CreateFramebuffer call without a lot of refactoring. - if (currentrenderer == 0) - { - NewWidth = screen->VideoWidth; - NewHeight = screen->VideoHeight; - NewBits = DisplayBits; - setmodeneeded = true; - } -} - CUSTOM_CVAR(Bool, win_borderless, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { // Just reinit the window. Saves a lot of trouble. diff --git a/src/win32/i_system.cpp b/src/win32/i_system.cpp index 35416de78..7b79ad26f 100644 --- a/src/win32/i_system.cpp +++ b/src/win32/i_system.cpp @@ -129,7 +129,6 @@ static void DestroyCustomCursor(); EXTERN_CVAR(String, language); EXTERN_CVAR (Bool, queryiwad); // Used on welcome/IWAD screen. -EXTERN_CVAR (Int, vid_renderer) EXTERN_CVAR (Bool, fullscreen) EXTERN_CVAR (Bool, disableautoload) EXTERN_CVAR (Bool, autoloadlights) @@ -824,7 +823,7 @@ BOOL CALLBACK IWADBoxCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa char szString[256]; // Check the current video settings. - SendDlgItemMessage( hDlg, vid_renderer ? IDC_WELCOME_OPENGL : IDC_WELCOME_SOFTWARE, BM_SETCHECK, BST_CHECKED, 0 ); + //SendDlgItemMessage( hDlg, vid_renderer ? IDC_WELCOME_OPENGL : IDC_WELCOME_SOFTWARE, BM_SETCHECK, BST_CHECKED, 0 ); SendDlgItemMessage( hDlg, IDC_WELCOME_FULLSCREEN, BM_SETCHECK, fullscreen ? BST_CHECKED : BST_UNCHECKED, 0 ); // [SP] This is our's @@ -870,7 +869,6 @@ BOOL CALLBACK IWADBoxCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa { SetQueryIWad(hDlg); // [SP] Upstreamed from Zandronum - vid_renderer = SendDlgItemMessage( hDlg, IDC_WELCOME_OPENGL, BM_GETCHECK, 0, 0 ) == BST_CHECKED; fullscreen = SendDlgItemMessage( hDlg, IDC_WELCOME_FULLSCREEN, BM_GETCHECK, 0, 0 ) == BST_CHECKED; // [SP] This is our's. diff --git a/src/win32/win32gliface.cpp b/src/win32/win32gliface.cpp index 1e138d79b..4a3a09ce7 100644 --- a/src/win32/win32gliface.cpp +++ b/src/win32/win32gliface.cpp @@ -1044,7 +1044,7 @@ Win32GLFrameBuffer::Win32GLFrameBuffer(void *hMonitor, int width, int height, in if (!static_cast(Video)->InitHardware(Window, 0)) { - vid_renderer = 0; + I_FatalError("Unable to initialize OpenGL"); return; } HDC hDC = GetDC(Window); diff --git a/src/win32/win32gliface.h b/src/win32/win32gliface.h index 89485a61a..f7bdfaf12 100644 --- a/src/win32/win32gliface.h +++ b/src/win32/win32gliface.h @@ -14,7 +14,6 @@ EXTERN_CVAR (Color, dimcolor) EXTERN_CVAR(Int, vid_defwidth); EXTERN_CVAR(Int, vid_defheight); -EXTERN_CVAR(Int, vid_renderer); EXTERN_CVAR(Int, vid_adapter); extern IVideo *Video; diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index d7da664e1..348faac9c 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2211,6 +2211,7 @@ RNDMNU_CANVAS = "Software Canvas"; // Video Options VIDMNU_TITLE = "VIDEO MODE"; +VIDMNU_RENDERMODE = "Render Mode"; VIDMNU_FULLSCREEN = "Fullscreen"; VIDMNU_HIDPI = "Retina/HiDPI support"; VIDMNU_BRDLSS = "Borderless Windowed Mode"; @@ -2398,6 +2399,9 @@ OPTVAL_SDL = "SDL"; OPTVAL_COCOA = "Cocoa"; OPTVAL_HWPOLY = "OpenGL-Accelerated"; OPTVAL_SWDOOM = "Doom Software Renderer"; +OPTVAL_SWDOOMTC = "True Color SW Renderer"; +OPTVAL_SWPOLY = "Softpoly Renderer"; +OPTVAL_SWPOLYTC = "True Color Softpoly"; OPTVAL_DEDICATED = "High-Performance"; OPTVAL_INTEGRATED = "Power-Saving"; OPTVAL_VANILLA = "Vanilla"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index dcb2c981f..85c77e35d 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -352,7 +352,6 @@ OptionMenu "OptionsMenu" protected Submenu "$OPTMNU_SOUND", "SoundOptions" Submenu "$OPTMNU_DISPLAY", "VideoOptions" Submenu "$OPTMNU_VIDEO", "VideoModeMenu" - Submenu "$OPTMNU_CHANGERENDER", "RendererMenu" StaticText " " SafeCommand "$OPTMNU_DEFAULTS", "reset2defaults" SafeCommand "$OPTMNU_RESETTOSAVED", "reset2saved" @@ -710,7 +709,6 @@ OptionMenu "TrueColorOptions" protected { Title "$TCMNU_TITLE" StaticText " " - //Option "$TCMNU_TRUECOLOR", "swtruecolor", "OnOff" Option "$TCMNU_MINFILTER", "r_minfilter", "OnOff" Option "$TCMNU_MAGFILTER", "r_magfilter", "OnOff" Option "$TCMNU_MIPMAP", "r_mipmap", "OnOff" @@ -1844,30 +1842,13 @@ OptionMenu ModReplayerOptions protected * *=======================================*/ -OptionValue "PolyDoom" +OptionValue "RenderMode" { 0, "$OPTVAL_SWDOOM" - 1, "$OPTVAL_HWPOLY" -} - -OptionValue "D3DGL" -{ - 0, "$OPTVAL_GL" - 1, "$OPTVAL_D3D" -} - -OptionValue "GLD3D" -{ - 0, "$OPTVAL_D3D" - 1, "$OPTVAL_GL" -} - -OptionMenu RendererMenu protected -{ - Title "$RNDMNU_TITLE" - Option "$RNDMNU_RENDERER", "vid_renderer", "PolyDoom" - Option "$RNDMNU_TRUECOLOR", "swtruecolor", "OnOff" - Option "$RNDMNU_POLY", "r_polyrenderer", "OnOff" + 1, "$OPTVAL_SWDOOMTC" + 2, "$OPTVAL_SWPOLY" + 3, "$OPTVAL_SWPOLYTC" + 4, "$OPTVAL_HWPOLY" } /*======================================= @@ -1914,6 +1895,7 @@ OptionMenu VideoModeMenu protected { Title "$VIDMNU_TITLE" + Option "$VIDMNU_RENDERMODE", "vid_rendermode", "RenderMode" Option "$VIDMNU_FULLSCREEN", "fullscreen", "YesNo" IfOption(Mac)