- 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.
This commit is contained in:
Christoph Oelckers 2018-04-07 23:30:28 +02:00
parent fde87c40d2
commit df4f435952
32 changed files with 95 additions and 213 deletions

View file

@ -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;i<ff_front.Size();i++)
{
F3DFloor *rover = ff_front[i];
if (rover->flags & 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;i<ff_back.Size();i++)
{
F3DFloor *rover = ff_back[i];
if (rover->flags & 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;i<ff_front.Size();i++)
{
F3DFloor *rover = ff_front[i];
if (rover->flags & 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;j<ff_back.Size();j++)
{
F3DFloor *rover2 = ff_back[j];
if (rover2->flags & 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)

View file

@ -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

View file

@ -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();

View file

@ -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;
}
}
//==========================================================================

View file

@ -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))

View file

@ -298,7 +298,7 @@ static F3DFloor *Find3DFloor(sector_t *target, sector_t *model)
for(unsigned i=0; i<target->e->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;
}

View file

@ -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);

View file

@ -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)

View file

@ -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);
}

View file

@ -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;

View file

@ -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 |

View file

@ -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;

View file

@ -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);

View file

@ -3427,7 +3427,6 @@ void P_GetPolySpots (MapData * map, TArray<FNodeBuilder::FPolyStart> &spots, TAr
// Preloads all relevant graphics for the level.
//
//===========================================================================
extern int currentrenderer;
void gl_PrecacheTexture(uint8_t *texhitlist, TMap<PClassActor*, bool> &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);

View file

@ -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);

View file

@ -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();

View file

@ -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)

View file

@ -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;

View file

@ -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)

View file

@ -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);
}

View file

@ -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();

View file

@ -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);

View file

@ -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<PClassActor*, bool> &
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);

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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.

View file

@ -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.

View file

@ -1044,7 +1044,7 @@ Win32GLFrameBuffer::Win32GLFrameBuffer(void *hMonitor, int width, int height, in
if (!static_cast<Win32GLVideo *>(Video)->InitHardware(Window, 0))
{
vid_renderer = 0;
I_FatalError("Unable to initialize OpenGL");
return;
}
HDC hDC = GetDC(Window);

View file

@ -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;

View file

@ -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";

View file

@ -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)