- moved around more stuff from the FRenderer interface.

This commit is contained in:
Christoph Oelckers 2018-04-03 22:50:47 +02:00
parent 91813ec43d
commit fcc33f0a09
11 changed files with 133 additions and 129 deletions

View File

@ -680,7 +680,7 @@ void D_Display ()
cycles.Clock(); cycles.Clock();
r_UseVanillaTransparency = UseVanillaTransparency(); // [SP] Cache UseVanillaTransparency() call r_UseVanillaTransparency = UseVanillaTransparency(); // [SP] Cache UseVanillaTransparency() call
r_renderercaps = Renderer->GetCaps(); // [SP] Get the current capabilities of the renderer r_renderercaps = screen->GetCaps(); // [SP] Get the current capabilities of the renderer
if (players[consoleplayer].camera == NULL) if (players[consoleplayer].camera == NULL)
{ {
@ -808,8 +808,9 @@ void D_Display ()
Renderer->RenderView(&players[consoleplayer]); Renderer->RenderView(&players[consoleplayer]);
screen->Begin2D(viewactive); screen->Begin2D(viewactive);
Renderer->DrawRemainingPlayerSprites(); // todo: These need to go into RenderView.
screen->DrawBlendingRect(); //Renderer->DrawRemainingPlayerSprites();
//screen->DrawBlendingRect();
if (automapactive) if (automapactive)
{ {
AM_Drawer (hud_althud? viewheight : StatusBar->GetTopOfStatusbar()); AM_Drawer (hud_althud? viewheight : StatusBar->GetTopOfStatusbar());

View File

@ -1003,10 +1003,6 @@ struct FGLInterface : public FRenderer
void RenderView(player_t *player) override; void RenderView(player_t *player) override;
void WriteSavePic (player_t *player, FileWriter *file, int width, int height) override; void WriteSavePic (player_t *player, FileWriter *file, int width, int height) override;
void RenderTextureView (FCanvasTexture *self, AActor *viewpoint, double fov) override; void RenderTextureView (FCanvasTexture *self, AActor *viewpoint, double fov) override;
void PreprocessLevel() override;
void SetClearColor(int color) override;
uint32_t GetCaps() override;
}; };
//========================================================================== //==========================================================================
@ -1021,20 +1017,6 @@ void FGLInterface::Precache(uint8_t *texhitlist, TMap<PClassActor*, bool> &actor
gl_PrecacheTexture(texhitlist, actorhitlist); gl_PrecacheTexture(texhitlist, actorhitlist);
} }
//===========================================================================
//
//
//
//===========================================================================
void FGLInterface::SetClearColor(int color)
{
PalEntry pe = GPalette.BaseColors[color];
GLRenderer->mSceneClearColor[0] = pe.r / 255.f;
GLRenderer->mSceneClearColor[1] = pe.g / 255.f;
GLRenderer->mSceneClearColor[2] = pe.b / 255.f;
}
//=========================================================================== //===========================================================================
// //
// Render the view to a savegame picture // Render the view to a savegame picture
@ -1110,44 +1092,6 @@ void FGLInterface::RenderTextureView (FCanvasTexture *tex, AActor *Viewpoint, do
camtexcount++; camtexcount++;
} }
//===========================================================================
//
//
//
//===========================================================================
void FGLInterface::PreprocessLevel()
{
if (GLRenderer != NULL)
{
GLRenderer->SetupLevel();
}
}
uint32_t FGLInterface::GetCaps()
{
// describe our basic feature set
ActorRenderFeatureFlags FlagSet = RFF_FLATSPRITES | RFF_MODELS | RFF_SLOPE3DFLOORS |
RFF_TILTPITCH | RFF_ROLLSPRITES | RFF_POLYGONAL;
if (r_drawvoxels)
FlagSet |= RFF_VOXELS;
if (gl_legacy_mode)
{
// legacy mode always has truecolor because palette tonemap is not available
FlagSet |= RFF_TRUECOLOR;
}
else if (!(FGLRenderBuffers::IsEnabled()))
{
// truecolor is always available when renderbuffers are unavailable because palette tonemap is not possible
FlagSet |= RFF_TRUECOLOR | RFF_MATSHADER | RFF_BRIGHTMAP;
}
else
{
if (gl_tonemap != 5) // not running palette tonemap shader
FlagSet |= RFF_TRUECOLOR;
FlagSet |= RFF_MATSHADER | RFF_POSTSHADER | RFF_BRIGHTMAP;
}
return (uint32_t)FlagSet;
}
//=========================================================================== //===========================================================================
// //
// //

View File

@ -40,6 +40,7 @@
#include "gl/system/gl_interface.h" #include "gl/system/gl_interface.h"
#include "gl/system/gl_framebuffer.h" #include "gl/system/gl_framebuffer.h"
#include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_renderer.h"
#include "gl/renderer/gl_renderbuffers.h"
#include "gl/renderer/gl_renderstate.h" #include "gl/renderer/gl_renderstate.h"
#include "gl/renderer/gl_lightdata.h" #include "gl/renderer/gl_lightdata.h"
#include "gl/textures/gl_hwtexture.h" #include "gl/textures/gl_hwtexture.h"
@ -189,6 +190,43 @@ void OpenGLFrameBuffer::Update()
GLRenderer->SetOutputViewport(nullptr); GLRenderer->SetOutputViewport(nullptr);
} }
//===========================================================================
//
//
//
//===========================================================================
EXTERN_CVAR(Bool, r_drawvoxels)
EXTERN_CVAR(Int, gl_tonemap)
extern int currentrenderer;
uint32_t OpenGLFrameBuffer::GetCaps()
{
if (currentrenderer == 0) return Super::GetCaps();
// describe our basic feature set
ActorRenderFeatureFlags FlagSet = RFF_FLATSPRITES | RFF_MODELS | RFF_SLOPE3DFLOORS |
RFF_TILTPITCH | RFF_ROLLSPRITES | RFF_POLYGONAL;
if (r_drawvoxels)
FlagSet |= RFF_VOXELS;
if (gl.legacyMode)
{
// legacy mode always has truecolor because palette tonemap is not available
FlagSet |= RFF_TRUECOLOR;
}
else if (!(FGLRenderBuffers::IsEnabled()))
{
// truecolor is always available when renderbuffers are unavailable because palette tonemap is not possible
FlagSet |= RFF_TRUECOLOR | RFF_MATSHADER | RFF_BRIGHTMAP;
}
else
{
if (gl_tonemap != 5) // not running palette tonemap shader
FlagSet |= RFF_TRUECOLOR;
FlagSet |= RFF_MATSHADER | RFF_POSTSHADER | RFF_BRIGHTMAP;
}
return (uint32_t)FlagSet;
}
//========================================================================== //==========================================================================
// //
@ -329,6 +367,29 @@ void OpenGLFrameBuffer::GetFlash(PalEntry &rgb, int &amount)
amount = Flash.a; amount = Flash.a;
} }
void OpenGLFrameBuffer::InitForLevel()
{
if (GLRenderer != NULL)
{
GLRenderer->SetupLevel();
}
}
//===========================================================================
//
//
//
//===========================================================================
void OpenGLFrameBuffer::SetClearColor(int color)
{
PalEntry pe = GPalette.BaseColors[color];
GLRenderer->mSceneClearColor[0] = pe.r / 255.f;
GLRenderer->mSceneClearColor[1] = pe.g / 255.f;
GLRenderer->mSceneClearColor[2] = pe.b / 255.f;
}
//========================================================================== //==========================================================================
// //
// //

View File

@ -39,13 +39,16 @@ public:
bool SetContrast(float contrast); bool SetContrast(float contrast);
void DoSetGamma(); void DoSetGamma();
void UpdatePalette(); void UpdatePalette() override;
void GetFlashedPalette (PalEntry pal[256]); void GetFlashedPalette (PalEntry pal[256]) override;
PalEntry *GetPalette (); PalEntry *GetPalette () override;
bool SetFlash(PalEntry rgb, int amount); bool SetFlash(PalEntry rgb, int amount) override;
void GetFlash(PalEntry &rgb, int &amount); void GetFlash(PalEntry &rgb, int &amount) override;
bool Begin2D(bool copy3d); bool Begin2D(bool copy3d) override;
void GameRestart(); void GameRestart() override;
void InitForLevel() override;
void SetClearColor(int color) override;
uint32_t GetCaps() override;
// Retrieves a buffer containing image data for a screenshot. // Retrieves a buffer containing image data for a screenshot.
// Hint: Pitch can be negative for upside-down images, in which case buffer // Hint: Pitch can be negative for upside-down images, in which case buffer

View File

@ -4128,9 +4128,9 @@ void P_SetupLevel (const char *lumpname, int position)
} }
// This must be done BEFORE the PolyObj Spawn!!! // This must be done BEFORE the PolyObj Spawn!!!
InitRenderInfo(); InitRenderInfo(); // create hardware independent renderer resources for the level.
Renderer->PreprocessLevel(); screen->InitForLevel(); // create hardware dependent level resources (e.g. the vertex buffer)
SWRenderer->PreprocessLevel(); SWRenderer->SetColormap(); //The SW renderer needs to do some special setup for the level's default colormap.
InitPortalGroups(); InitPortalGroups();
times[16].Clock(); times[16].Clock();

View File

@ -18,23 +18,26 @@ class FileWriter;
struct FRenderer struct FRenderer
{ {
// precache one texture // precache one texture
virtual void Precache(uint8_t *texhitlist, TMap<PClassActor*, bool> &actorhitlist) = 0; virtual void Precache(uint8_t *texhitlist, TMap<PClassActor*, bool> &actorhitlist) = 0;
// render 3D view // render 3D view
virtual void RenderView(player_t *player) = 0; virtual void RenderView(player_t *player) = 0;
// renders view to a savegame picture // renders view to a savegame picture
virtual void WriteSavePic (player_t *player, FileWriter *file, int width, int height) = 0; virtual void WriteSavePic (player_t *player, FileWriter *file, int width, int height) = 0;
// render to a camera texture
virtual void RenderTextureView(FCanvasTexture *tex, AActor *viewpoint, double fov) = 0;
// draws player sprites with hardware acceleration (only useful for software rendering) // draws player sprites with hardware acceleration (only useful for software rendering)
virtual void DrawRemainingPlayerSprites() {} virtual void DrawRemainingPlayerSprites() {}
virtual void OnModeSet () {} // set up the colormap for a newly loaded level.
virtual void SetClearColor(int color) = 0; virtual void SetColormap() {}
virtual void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, double fov) = 0;
virtual void PreprocessLevel() {}
virtual uint32_t GetCaps() { return 0; } virtual void OnModeSet () {}
virtual void SetClearColor(int color) {};
}; };

View File

@ -994,7 +994,8 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor
{ {
color = pr_hom(); color = pr_hom();
} }
Renderer->SetClearColor(color); screen->SetClearColor(color);
SWRenderer->SetClearColor(color);
} }
} }

View File

@ -90,10 +90,11 @@ FRenderer *CreateSWRenderer()
return new FSoftwareRenderer; return new FSoftwareRenderer;
} }
EXTERN_CVAR(Bool, swtruecolor)
void FSoftwareRenderer::PrecacheTexture(FTexture *tex, int cache) void FSoftwareRenderer::PrecacheTexture(FTexture *tex, int cache)
{ {
bool isbgra = screen->IsBgra(); bool isbgra = swtruecolor;
if (tex != NULL) if (tex != NULL)
{ {
@ -329,7 +330,7 @@ void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoin
r_viewwindow = cameraViewwindow; r_viewwindow = cameraViewwindow;
} }
void FSoftwareRenderer::PreprocessLevel() void FSoftwareRenderer::SetColormap()
{ {
// This just sets the default colormap for the spftware renderer. // This just sets the default colormap for the spftware renderer.
NormalLight.Maps = realcolormaps.Maps; NormalLight.Maps = realcolormaps.Maps;
@ -341,23 +342,3 @@ void FSoftwareRenderer::PreprocessLevel()
} }
} }
uint32_t FSoftwareRenderer::GetCaps()
{
ActorRenderFeatureFlags FlagSet = 0;
if (r_polyrenderer)
FlagSet |= RFF_POLYGONAL | RFF_TILTPITCH | RFF_SLOPE3DFLOORS;
else
{
FlagSet |= RFF_UNCLIPPEDTEX;
if (r_drawvoxels)
FlagSet |= RFF_VOXELS;
}
if (screen && screen->IsBgra())
FlagSet |= RFF_TRUECOLOR;
else
FlagSet |= RFF_COLORMAP;
return (uint32_t)FlagSet;
}

View File

@ -24,9 +24,7 @@ struct FSoftwareRenderer : public FRenderer
void SetClearColor(int color) override; void SetClearColor(int color) override;
void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, double fov) override; void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, double fov) override;
void PreprocessLevel() override; void SetColormap() override;
uint32_t GetCaps() override;
private: private:
void PrecacheTexture(FTexture *tex, int cache); void PrecacheTexture(FTexture *tex, int cache);

View File

@ -868,20 +868,6 @@ bool DFrameBuffer::Begin2D (bool copy3d)
return false; return false;
} }
//==========================================================================
//
// DFrameBuffer :: DrawBlendingRect
//
// In hardware 2D modes, the blending rect needs to be drawn separately
// from transferring the 3D scene to video memory, because the weapon
// sprite is drawn on top of that.
//
//==========================================================================
void DFrameBuffer::DrawBlendingRect()
{
}
//========================================================================== //==========================================================================
// //
// DFrameBuffer :: WipeStartScreen // DFrameBuffer :: WipeStartScreen
@ -945,6 +931,37 @@ void DFrameBuffer::GameRestart()
{ {
} }
//==========================================================================
//
// DFrameBuffer :: GetCaps
//
//==========================================================================
EXTERN_CVAR(Bool, r_polyrenderer)
EXTERN_CVAR(Bool, r_drawvoxels)
uint32_t DFrameBuffer::GetCaps()
{
ActorRenderFeatureFlags FlagSet = 0;
if (r_polyrenderer)
FlagSet |= RFF_POLYGONAL | RFF_TILTPITCH | RFF_SLOPE3DFLOORS;
else
{
FlagSet |= RFF_UNCLIPPEDTEX;
if (r_drawvoxels)
FlagSet |= RFF_VOXELS;
}
if (swtruecolor)
FlagSet |= RFF_TRUECOLOR;
else
FlagSet |= RFF_COLORMAP;
return (uint32_t)FlagSet;
}
CCMD(clean) CCMD(clean)
{ {
Printf ("CleanXfac: %d\nCleanYfac: %d\n", CleanXfac, CleanYfac); Printf ("CleanXfac: %d\nCleanYfac: %d\n", CleanXfac, CleanYfac);
@ -1018,7 +1035,9 @@ void V_UpdateModeSize (int width, int height)
DisplayHeight = height; DisplayHeight = height;
R_OldBlend = ~0; R_OldBlend = ~0;
Renderer->OnModeSet();
// the software renderer also needs to be notified
SWRenderer->OnModeSet();
} }
void V_OutputResized (int width, int height) void V_OutputResized (int width, int height)

View File

@ -290,7 +290,6 @@ public:
inline int GetWidth() const { return Width; } inline int GetWidth() const { return Width; }
inline int GetHeight() const { return Height; } inline int GetHeight() const { return Height; }
inline bool IsBgra() const { return Bgra; }
virtual DCanvas *GetCanvas() { return nullptr; } virtual DCanvas *GetCanvas() { return nullptr; }
@ -343,10 +342,7 @@ public:
virtual bool LockCanvas() { return true; } virtual bool LockCanvas() { return true; }
virtual void UnlockCanvas() {} virtual void UnlockCanvas() {}
// Begin 2D drawing operations. This is like Update, but it doesn't end // Begin 2D drawing operations.
// the scene, and it doesn't present the image yet. If you are going to
// be covering the entire screen with 2D elements, then pass false to
// avoid copying the software buffer to the screen.
// Returns true if hardware-accelerated 2D has been entered, false if not. // Returns true if hardware-accelerated 2D has been entered, false if not.
virtual bool Begin2D(bool copy3d); virtual bool Begin2D(bool copy3d);
void End2D() { isIn2D = false; } void End2D() { isIn2D = false; }
@ -356,14 +352,11 @@ public:
// DrawTexture calls after Begin2D use native textures. // DrawTexture calls after Begin2D use native textures.
// Draws the blending rectangle over the viewwindow if in hardware-
// accelerated 2D mode.
virtual void DrawBlendingRect();
// Precaches or unloads a texture
// Report a game restart // Report a game restart
virtual void GameRestart(); virtual void GameRestart();
virtual void InitForLevel() {}
virtual void SetClearColor(int color) {}
virtual uint32_t GetCaps();
// Screen wiping // Screen wiping
virtual bool WipeStartScreen(int type); virtual bool WipeStartScreen(int type);