- Backend update from Raze.

This commit is contained in:
Christoph Oelckers 2021-03-04 14:45:29 +01:00
parent 996b4f9f5c
commit 357163c60d
13 changed files with 137 additions and 24 deletions

View file

@ -254,6 +254,11 @@ public:
virtual void StopChannel(FSoundChan* chan); virtual void StopChannel(FSoundChan* chan);
sfxinfo_t* LoadSound(sfxinfo_t* sfx); sfxinfo_t* LoadSound(sfxinfo_t* sfx);
const sfxinfo_t* GetSfx(unsigned snd)
{
if (snd >= S_sfx.Size()) return nullptr;
return &S_sfx[snd];
}
// Initializes sound stuff, including volume // Initializes sound stuff, including volume
// Sets channels, SFX and music volume, // Sets channels, SFX and music volume,

View file

@ -70,6 +70,8 @@
#define RIGHTMARGIN 8 #define RIGHTMARGIN 8
#define BOTTOMARGIN 12 #define BOTTOMARGIN 12
extern bool AppActive;
CUSTOM_CVAR(Int, con_buffersize, -1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CUSTOM_CVAR(Int, con_buffersize, -1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
{ {
// ensure a minimum size // ensure a minimum size
@ -1039,7 +1041,7 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer)
// Close console and clear command line. But if we're in the // Close console and clear command line. But if we're in the
// fullscreen console mode, there's nothing to fall back on // fullscreen console mode, there's nothing to fall back on
// if it's closed, so open the main menu instead. // if it's closed, so open the main menu instead.
if (gamestate == GS_STARTUP) if (gamestate == GS_STARTUP || !AppActive)
{ {
return false; return false;
} }

View file

@ -525,6 +525,7 @@ xx(ZDoom)
xx(ZDoomTranslated) xx(ZDoomTranslated)
xx(Vavoom) xx(Vavoom)
xx(GZDoom) xx(GZDoom)
xx(Eternity)
xx(Xpanningfloor) xx(Xpanningfloor)
xx(Ypanningfloor) xx(Ypanningfloor)

View file

@ -86,6 +86,7 @@ int Printf (int printlevel, const char *format, ...) ATTRIBUTE((format(printf,2,
int Printf (const char *format, ...) ATTRIBUTE((format(printf,1,2))); int Printf (const char *format, ...) ATTRIBUTE((format(printf,1,2)));
int DPrintf (int level, const char *format, ...) ATTRIBUTE((format(printf,2,3))); int DPrintf (int level, const char *format, ...) ATTRIBUTE((format(printf,2,3)));
void I_DebugPrint(const char* cp);
void debugprintf(const char* f, ...); // Prints to the debugger's log. void debugprintf(const char* f, ...); // Prints to the debugger's log.
// flag to silence non-error output // flag to silence non-error output

View file

@ -306,7 +306,7 @@ void FMD3Model::AddSkins(uint8_t *hitlist)
{ {
for (unsigned i = 0; i < Surfaces.Size(); i++) for (unsigned i = 0; i < Surfaces.Size(); i++)
{ {
if (curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid()) if (curSpriteMDLFrame && curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid())
{ {
hitlist[curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].GetIndex()] |= FTextureManager::HIT_Flat; hitlist[curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].GetIndex()] |= FTextureManager::HIT_Flat;
} }
@ -357,13 +357,16 @@ void FMD3Model::RenderFrame(FModelRenderer *renderer, FGameTexture * skin, int f
FGameTexture *surfaceSkin = skin; FGameTexture *surfaceSkin = skin;
if (!surfaceSkin) if (!surfaceSkin)
{ {
if (curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid()) if (curSpriteMDLFrame)
{ {
surfaceSkin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i], true); if (curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid())
} {
else if (surf->numSkins > 0 && surf->Skins[0].isValid()) surfaceSkin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i], true);
{ }
surfaceSkin = TexMan.GetGameTexture(surf->Skins[0], true); else if (surf->numSkins > 0 && surf->Skins[0].isValid())
{
surfaceSkin = TexMan.GetGameTexture(surf->Skins[0], true);
}
} }
if (!surfaceSkin) if (!surfaceSkin)

View file

@ -636,7 +636,7 @@ void FOBJModel::RenderFrame(FModelRenderer *renderer, FGameTexture * skin, int f
OBJSurface *surf = &surfaces[i]; OBJSurface *surf = &surfaces[i];
FGameTexture *userSkin = skin; FGameTexture *userSkin = skin;
if (!userSkin) if (!userSkin && curSpriteMDLFrame)
{ {
if (i < MD3_MAX_SURFACES && curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid()) if (i < MD3_MAX_SURFACES && curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid())
{ {
@ -669,7 +669,7 @@ void FOBJModel::AddSkins(uint8_t* hitlist)
{ {
for (size_t i = 0; i < surfaces.Size(); i++) for (size_t i = 0; i < surfaces.Size(); i++)
{ {
if (i < MD3_MAX_SURFACES && curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid()) if (curSpriteMDLFrame && i < MD3_MAX_SURFACES && curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid())
{ {
// Precache skins manually reassigned by the user. // Precache skins manually reassigned by the user.
// On OBJs with lots of skins, such as Doom map OBJs exported from GZDB, // On OBJs with lots of skins, such as Doom map OBJs exported from GZDB,

View file

@ -242,7 +242,7 @@ void FUE1Model::RenderFrame( FModelRenderer *renderer, FGameTexture *skin, int f
FGameTexture *sskin = skin; FGameTexture *sskin = skin;
if ( !sskin ) if ( !sskin )
{ {
if ( curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum].isValid() ) if (curSpriteMDLFrame && curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum].isValid() )
sskin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum], true); sskin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum], true);
if ( !sskin ) if ( !sskin )
{ {
@ -303,7 +303,7 @@ void FUE1Model::BuildVertexBuffer( FModelRenderer *renderer )
void FUE1Model::AddSkins( uint8_t *hitlist ) void FUE1Model::AddSkins( uint8_t *hitlist )
{ {
for ( int i=0; i<numGroups; i++ ) for ( int i=0; i<numGroups; i++ )
if ( curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum].isValid() ) if (curSpriteMDLFrame && curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum].isValid() )
hitlist[curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum].GetIndex()] |= FTextureManager::HIT_Flat; hitlist[curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum].GetIndex()] |= FTextureManager::HIT_Flat;
} }

View file

@ -37,6 +37,7 @@
#include "texturemanager.h" #include "texturemanager.h"
#include "palettecontainer.h" #include "palettecontainer.h"
#include "textures.h" #include "textures.h"
#include "imagehelpers.h"
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(disable:4244) // warning C4244: conversion from 'double' to 'float', possible loss of data #pragma warning(disable:4244) // warning C4244: conversion from 'double' to 'float', possible loss of data
@ -99,6 +100,7 @@ TArray<uint8_t> FVoxelTexture::CreatePalettedPixels(int conversion)
pe.b = (pp[2] << 2) | (pp[2] >> 4); pe.b = (pp[2] << 2) | (pp[2] >> 4);
// Alphatexture handling is just for completeness, but rather unlikely to be used ever. // Alphatexture handling is just for completeness, but rather unlikely to be used ever.
Pixels[i] = conversion == luminance ? pe.r : ColorMatcher.Pick(pe); Pixels[i] = conversion == luminance ? pe.r : ColorMatcher.Pick(pe);
} }
} }
else else
@ -108,6 +110,7 @@ TArray<uint8_t> FVoxelTexture::CreatePalettedPixels(int conversion)
Pixels[i] = (uint8_t)i; Pixels[i] = (uint8_t)i;
} }
} }
ImageHelpers::FlipSquareBlock(Pixels.Data(), Width);
return Pixels; return Pixels;
} }

View file

@ -452,16 +452,16 @@ void DStatusBarCore::StatusbarToRealCoords(double& x, double& y, double& w, doub
// //
//============================================================================ //============================================================================
void DStatusBarCore::DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color, int translation, double rotate, ERenderStyle style) void DStatusBarCore::DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color, int translation, ERenderStyle style, double clipwidth)
{ {
if (!texture.isValid()) if (!texture.isValid())
return; return;
FGameTexture* tex = TexMan.GetGameTexture(texture, !(flags & DI_DONTANIMATE)); FGameTexture* tex = TexMan.GetGameTexture(texture, !(flags & DI_DONTANIMATE));
DrawGraphic(tex, x, y, flags, Alpha, boxwidth, boxheight, scaleX, scaleY, color, translation, rotate, style); DrawGraphic(tex, x, y, flags, Alpha, boxwidth, boxheight, scaleX, scaleY, color, translation, style);
} }
void DStatusBarCore::DrawGraphic(FGameTexture* tex, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color, int translation, double rotate, ERenderStyle style) void DStatusBarCore::DrawGraphic(FGameTexture* tex, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color, int translation, ERenderStyle style, double clipwidth)
{ {
double texwidth = tex->GetDisplayWidth() * scaleX; double texwidth = tex->GetDisplayWidth() * scaleX;
double texheight = tex->GetDisplayHeight() * scaleY; double texheight = tex->GetDisplayHeight() * scaleY;
@ -582,6 +582,10 @@ void DStatusBarCore::DrawGraphic(FGameTexture* tex, double x, double y, int flag
DTA_LeftOffset, 0, DTA_LeftOffset, 0,
DTA_DestWidthF, boxwidth, DTA_DestWidthF, boxwidth,
DTA_DestHeightF, boxheight, DTA_DestHeightF, boxheight,
DTA_ClipLeft, 0,
DTA_ClipTop, 0,
DTA_ClipBottom, twod->GetHeight(),
DTA_ClipRight, clipwidth < 0? twod->GetWidth() : int(x + boxwidth * clipwidth),
DTA_Color, color, DTA_Color, color,
DTA_TranslationIndex, translation? translation : (flags & DI_TRANSLATABLE) ? GetTranslation() : 0, DTA_TranslationIndex, translation? translation : (flags & DI_TRANSLATABLE) ? GetTranslation() : 0,
DTA_ColorOverlay, (flags & DI_DIM) ? MAKEARGB(170, 0, 0, 0) : 0, DTA_ColorOverlay, (flags & DI_DIM) ? MAKEARGB(170, 0, 0, 0) : 0,
@ -590,7 +594,96 @@ void DStatusBarCore::DrawGraphic(FGameTexture* tex, double x, double y, int flag
DTA_FillColor, (flags & DI_ALPHAMAPPED) ? 0 : -1, DTA_FillColor, (flags & DI_ALPHAMAPPED) ? 0 : -1,
DTA_FlipX, !!(flags & DI_MIRROR), DTA_FlipX, !!(flags & DI_MIRROR),
DTA_FlipY, !!(flags& DI_MIRRORY), DTA_FlipY, !!(flags& DI_MIRRORY),
DTA_Rotate, rotate, DTA_LegacyRenderStyle, style,
TAG_DONE);
}
//============================================================================
//
// draw stuff
//
//============================================================================
void DStatusBarCore::DrawRotated(FTextureID texture, double x, double y, double angle, int flags, double Alpha, double scaleX, double scaleY, PalEntry color, int translation, ERenderStyle style)
{
if (!texture.isValid())
return;
FGameTexture* tex = TexMan.GetGameTexture(texture, !(flags & DI_DONTANIMATE));
DrawRotated(tex, x, y, angle, flags, Alpha, scaleX, scaleY, color, translation, style);
}
void DStatusBarCore::DrawRotated(FGameTexture* tex, double x, double y, int flags, double angle, double Alpha, double scaleX, double scaleY, PalEntry color, int translation, ERenderStyle style)
{
double texwidth = tex->GetDisplayWidth() * scaleX;
double texheight = tex->GetDisplayHeight() * scaleY;
double texleftoffs = tex->GetDisplayLeftOffset() * scaleY;
double textopoffs = tex->GetDisplayTopOffset() * scaleY;
// resolve auto-alignment before making any adjustments to the position values.
if (!(flags & DI_SCREEN_MANUAL_ALIGN))
{
if (x < 0) flags |= DI_SCREEN_RIGHT;
else flags |= DI_SCREEN_LEFT;
if (y < 0) flags |= DI_SCREEN_BOTTOM;
else flags |= DI_SCREEN_TOP;
}
Alpha *= this->Alpha;
if (Alpha <= 0) return;
x += drawOffset.X;
y += drawOffset.Y;
DVector2 Scale = GetHUDScale();
scaleX = 1 / scaleX;
scaleY = 1 / scaleY;
if (!fullscreenOffsets)
{
StatusbarToRealCoords(x, y, texwidth, texheight);
}
else
{
double orgx, orgy;
switch (flags & DI_SCREEN_HMASK)
{
default: orgx = 0; break;
case DI_SCREEN_HCENTER: orgx = twod->GetWidth() / 2; break;
case DI_SCREEN_RIGHT: orgx = twod->GetWidth(); break;
}
switch (flags & DI_SCREEN_VMASK)
{
default: orgy = 0; break;
case DI_SCREEN_VCENTER: orgy = twod->GetHeight() / 2; break;
case DI_SCREEN_BOTTOM: orgy = twod->GetHeight(); break;
}
// move stuff in the top right corner a bit down if the fps counter is on.
if ((flags & (DI_SCREEN_HMASK | DI_SCREEN_VMASK)) == DI_SCREEN_RIGHT_TOP && vid_fps) y += 10;
x *= Scale.X;
y *= Scale.Y;
scaleX *= Scale.X;
scaleY *= Scale.Y;
x += orgx;
y += orgy;
}
DrawTexture(twod, tex, x, y,
DTA_ScaleX, scaleX,
DTA_ScaleY, scaleY,
DTA_Color, color,
DTA_CenterOffsetRel, !!(flags & DI_ITEM_RELCENTER),
DTA_Rotate, angle,
DTA_TranslationIndex, translation ? translation : (flags & DI_TRANSLATABLE) ? GetTranslation() : 0,
DTA_ColorOverlay, (flags & DI_DIM) ? MAKEARGB(170, 0, 0, 0) : 0,
DTA_Alpha, Alpha,
DTA_AlphaChannel, !!(flags & DI_ALPHAMAPPED),
DTA_FillColor, (flags & DI_ALPHAMAPPED) ? 0 : -1,
DTA_FlipX, !!(flags & DI_MIRROR),
DTA_FlipY, !!(flags & DI_MIRRORY),
DTA_LegacyRenderStyle, style, DTA_LegacyRenderStyle, style,
TAG_DONE); TAG_DONE);
} }

View file

@ -184,8 +184,10 @@ public:
virtual void SetScale(); virtual void SetScale();
void ValidateResolution(int& hres, int& vres) const; void ValidateResolution(int& hres, int& vres) const;
void StatusbarToRealCoords(double& x, double& y, double& w, double& h) const; void StatusbarToRealCoords(double& x, double& y, double& w, double& h) const;
void DrawGraphic(FGameTexture* texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, double rotate = 0, ERenderStyle style = STYLE_Translucent); void DrawGraphic(FGameTexture* texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, ERenderStyle style = STYLE_Translucent, double clipwidth = -1.0);
void DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, double rotate = 0, ERenderStyle style = STYLE_Translucent); void DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, ERenderStyle style = STYLE_Translucent, double clipwidth = -1.0);
void DrawRotated(FTextureID texture, double x, double y, double angle, int flags, double Alpha, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, ERenderStyle style = STYLE_Translucent);
void DrawRotated(FGameTexture* tex, double x, double y, int flags, double angle, double Alpha, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, ERenderStyle style = STYLE_Translucent);
void DrawString(FFont* font, const FString& cstring, double x, double y, int flags, double Alpha, int translation, int spacing, EMonospacing monospacing, int shadowX, int shadowY, double scaleX, double scaleY, int pt); void DrawString(FFont* font, const FString& cstring, double x, double y, int flags, double Alpha, int translation, int spacing, EMonospacing monospacing, int shadowX, int shadowY, double scaleX, double scaleY, int pt);
void TransformRect(double& x, double& y, double& w, double& h, int flags = 0); void TransformRect(double& x, double& y, double& w, double& h, int flags = 0);
void Fill(PalEntry color, double x, double y, double w, double h, int flags = 0); void Fill(PalEntry color, double x, double y, double w, double h, int flags = 0);

View file

@ -115,11 +115,6 @@ FImageSource *PNGImage_TryCreate(FileReader & data, int lumpnum)
uint8_t filter = data.ReadUInt8(); uint8_t filter = data.ReadUInt8();
uint8_t interlace = data.ReadUInt8(); uint8_t interlace = data.ReadUInt8();
// NOTICE: GZDoom is the ONLY program in the typical development stack (GIMP, Slade, UDB) which does not support these formats
// As such, the average developer will have no other way to figure out what's going wrong without these: these CANNOT be allowed to fail silently.
// As things like PNG-compression and 64-bit color become more common in royalty-free PBR materials, support should be an eventual target.
// Even then, these warnings should remain to prevent this from being an issue the next time things change.
if (compression != 0 || filter != 0 || interlace > 1) if (compression != 0 || filter != 0 || interlace > 1)
{ {
Printf(TEXTCOLOR_YELLOW"WARNING: failed to load PNG %s: the compression, filter, or interlace is not supported!\n", fileSystem.GetFileFullName(lumpnum)); Printf(TEXTCOLOR_YELLOW"WARNING: failed to load PNG %s: the compression, filter, or interlace is not supported!\n", fileSystem.GetFileFullName(lumpnum));

View file

@ -208,10 +208,10 @@ bool D_AddFile(TArray<FString>& wadfiles, const char* file, bool check, int posi
// Confirm file exists in filesystem. // Confirm file exists in filesystem.
struct stat info; struct stat info;
bool found = stat(file, &info) == 0; bool found = stat(file, &info) == 0;
FString fullpath = file;
if (!found) if (!found)
{ {
// File not found, so split file into path and filename so we can enumerate the path for the file. // File not found, so split file into path and filename so we can enumerate the path for the file.
FString fullpath = file;
auto lastindex = fullpath.LastIndexOf("/"); auto lastindex = fullpath.LastIndexOf("/");
FString basepath = fullpath.Left(lastindex); FString basepath = fullpath.Left(lastindex);
FString filename = fullpath.Right(fullpath.Len() - lastindex - 1); FString filename = fullpath.Right(fullpath.Len() - lastindex - 1);

View file

@ -761,6 +761,10 @@ public:
ReadUserKey(ukey); ReadUserKey(ukey);
loader->MapThingsUserData.Push(ukey); loader->MapThingsUserData.Push(ukey);
} }
else
{
DPrintf(DMSG_WARNING, "Unknown UDMF thing key %s\n", key.GetChars());
}
break; break;
} }
} }
@ -1111,6 +1115,7 @@ public:
break; break;
default: default:
DPrintf(DMSG_WARNING, "Unknown UDMF linedef key %s\n", key.GetChars());
break; break;
} }
@ -1425,6 +1430,7 @@ public:
break; break;
default: default:
DPrintf(DMSG_WARNING, "Unknown UDMF sidedef key %s\n", key.GetChars());
break; break;
} }
@ -1929,6 +1935,7 @@ public:
break; break;
default: default:
DPrintf(DMSG_WARNING, "Unknown UDMF sector key %s\n", key.GetChars());
break; break;
} }
if ((namespace_bits & (Zd | Zdt)) && !strnicmp("user_", key.GetChars(), 5)) if ((namespace_bits & (Zd | Zdt)) && !strnicmp("user_", key.GetChars(), 5))
@ -2179,6 +2186,7 @@ public:
switch(namespc.GetIndex()) switch(namespc.GetIndex())
{ {
case NAME_ZDoom: case NAME_ZDoom:
case NAME_Eternity:
namespace_bits = Zd; namespace_bits = Zd;
isTranslated = false; isTranslated = false;
break; break;