Merge remote-tracking branch 'gzdoom/master' into swmodels

This commit is contained in:
Magnus Norddahl 2018-04-13 21:35:21 +02:00
commit 7e544c66fe
356 changed files with 11017 additions and 23856 deletions

View file

@ -37,6 +37,7 @@
#include "swrenderer/things/r_playersprite.h"
#include "swrenderer/scene/r_scene.h"
#include "swrenderer/scene/r_light.h"
#include "swrenderer/r_swcolormaps.h"
#include "v_palette.h"
#include "v_video.h"
#include "m_png.h"
@ -59,43 +60,29 @@ CUSTOM_CVAR (Bool, cl_oldfreelooklimit, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG
players[consoleplayer].SendPitchLimits();
}
EXTERN_CVAR(Bool, r_shadercolormaps)
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()
{
}
FSoftwareRenderer::~FSoftwareRenderer()
{
}
void FSoftwareRenderer::Init()
{
mScene.Init();
InitSWColorMaps();
R_InitShadeMaps();
InitSWColorMaps();
}
FRenderer *CreateSWRenderer()
{
return new FSoftwareRenderer;
}
void FSoftwareRenderer::PrecacheTexture(FTexture *tex, int cache)
{
bool isbgra = screen->IsBgra();
bool isbgra = V_IsTrueColor();
if (tex != NULL)
{
@ -170,13 +157,13 @@ void FSoftwareRenderer::Precache(uint8_t *texhitlist, TMap<PClassActor*, bool> &
}
}
void FSoftwareRenderer::RenderView(player_t *player)
void FSoftwareRenderer::RenderView(player_t *player, DCanvas *target)
{
if (r_polyrenderer)
if (V_IsPolyRenderer())
{
PolyRenderer::Instance()->Viewpoint = r_viewpoint;
PolyRenderer::Instance()->Viewwindow = r_viewwindow;
PolyRenderer::Instance()->RenderView(player);
PolyRenderer::Instance()->RenderView(player, target);
r_viewpoint = PolyRenderer::Instance()->Viewpoint;
r_viewwindow = PolyRenderer::Instance()->Viewwindow;
}
@ -184,7 +171,7 @@ void FSoftwareRenderer::RenderView(player_t *player)
{
mScene.MainThread()->Viewport->viewpoint = r_viewpoint;
mScene.MainThread()->Viewport->viewwindow = r_viewwindow;
mScene.RenderView(player);
mScene.RenderView(player, target);
r_viewpoint = mScene.MainThread()->Viewport->viewpoint;
r_viewwindow = mScene.MainThread()->Viewport->viewwindow;
}
@ -192,22 +179,13 @@ void FSoftwareRenderer::RenderView(player_t *player)
FCanvasTextureInfo::UpdateAll();
}
void FSoftwareRenderer::RemapVoxels()
{
for (unsigned i=0; i<Voxels.Size(); i++)
{
Voxels[i]->CreateBgraSlabData();
Voxels[i]->Remap();
}
}
void FSoftwareRenderer::WriteSavePic (player_t *player, FileWriter *file, int width, int height)
{
DSimpleCanvas pic(width, height, false);
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;
@ -224,12 +202,12 @@ void FSoftwareRenderer::WriteSavePic (player_t *player, FileWriter *file, int wi
r_viewwindow = mScene.MainThread()->Viewport->viewwindow;
}
screen->GetFlashedPalette (palette);
M_CreatePNG (file, pic.GetBuffer(), palette, SS_PAL, width, height, pic.GetPitch(), Gamma);
M_CreatePNG (file, pic.GetPixels(), palette, SS_PAL, width, height, pic.GetPitch(), Gamma);
}
void FSoftwareRenderer::DrawRemainingPlayerSprites()
{
if (!r_polyrenderer)
if (!V_IsPolyRenderer())
{
mScene.MainThread()->Viewport->viewpoint = r_viewpoint;
mScene.MainThread()->Viewport->viewwindow = r_viewwindow;
@ -247,21 +225,11 @@ void FSoftwareRenderer::DrawRemainingPlayerSprites()
}
}
int FSoftwareRenderer::GetMaxViewPitch(bool down)
{
int MAX_DN_ANGLE = MIN(56, (int)maxviewpitch); // Max looking down angle
int MAX_UP_ANGLE = MIN(32, (int)maxviewpitch); // Max looking up angle
return (r_polyrenderer) ? int(maxviewpitch) : (down ? MAX_DN_ANGLE : ((cl_oldfreelooklimit) ? MAX_UP_ANGLE : MAX_DN_ANGLE));
}
bool FSoftwareRenderer::RequireGLNodes()
{
return true;
}
void FSoftwareRenderer::OnModeSet ()
{
mScene.ScreenResized();
// This does not work if the SW renderer is not in use.
if (!V_IsHardwareRenderer())
mScene.ScreenResized();
}
void FSoftwareRenderer::SetClearColor(int color)
@ -271,9 +239,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;
@ -289,7 +257,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);
@ -298,24 +266,24 @@ void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoin
if (Canvas->IsBgra())
{
if (Pixels == Canvas->GetBuffer())
if (Pixels == Canvas->GetPixels())
{
FTexture::FlipSquareBlockBgra((uint32_t*)Pixels, tex->GetWidth(), tex->GetHeight());
}
else
{
FTexture::FlipNonSquareBlockBgra((uint32_t*)Pixels, (const uint32_t*)Canvas->GetBuffer(), tex->GetWidth(), tex->GetHeight(), Canvas->GetPitch());
FTexture::FlipNonSquareBlockBgra((uint32_t*)Pixels, (const uint32_t*)Canvas->GetPixels(), tex->GetWidth(), tex->GetHeight(), Canvas->GetPitch());
}
}
else
{
if (Pixels == Canvas->GetBuffer())
if (Pixels == Canvas->GetPixels())
{
FTexture::FlipSquareBlockRemap(Pixels, tex->GetWidth(), tex->GetHeight(), GPalette.Remap);
}
else
{
FTexture::FlipNonSquareBlockRemap(Pixels, Canvas->GetBuffer(), tex->GetWidth(), tex->GetHeight(), Canvas->GetPitch(), GPalette.Remap);
FTexture::FlipNonSquareBlockRemap(Pixels, Canvas->GetPixels(), tex->GetWidth(), tex->GetHeight(), Canvas->GetPitch(), GPalette.Remap);
}
}
@ -351,49 +319,15 @@ void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoin
r_viewwindow = cameraViewwindow;
}
void FSoftwareRenderer::PreprocessLevel()
void FSoftwareRenderer::SetColormap()
{
// This just sets the default colormap for the spftware renderer.
NormalLight.Maps = realcolormaps.Maps;
NormalLight.ChangeColor(PalEntry(255, 255, 255), 0);
NormalLight.ChangeFade(level.fadeto);
if (level.fadeto == 0)
{
SetDefaultColormap(level.info->FadeTable);
if (level.flags & LEVEL_HASFADETABLE)
{
// This should really be done differently.
level.fadeto = 0xff939393; //[SP] Hexen True-color compatibility, just use gray.
for (auto &s : level.sectors)
{
s.Colormap.FadeColor = level.fadeto;
}
}
}
}
void FSoftwareRenderer::CleanLevelData()
{
}
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;
}