Merge remote-tracking branch 'gzdoom/master' into swmodels
This commit is contained in:
commit
7e544c66fe
356 changed files with 11017 additions and 23856 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue