- backend update.

This commit is contained in:
Christoph Oelckers 2020-10-28 21:46:43 +01:00
parent bc7c37779f
commit f341fbc1fb
9 changed files with 132 additions and 21 deletions

View file

@ -48,6 +48,8 @@
#define ALC_NUM_HRTF_SPECIFIERS_SOFT 0x1994 #define ALC_NUM_HRTF_SPECIFIERS_SOFT 0x1994
#define ALC_HRTF_SPECIFIER_SOFT 0x1995 #define ALC_HRTF_SPECIFIER_SOFT 0x1995
#define ALC_HRTF_ID_SOFT 0x1996 #define ALC_HRTF_ID_SOFT 0x1996
#define ALC_OUTPUT_LIMITER_SOFT 0x199A
typedef const ALCchar* (ALC_APIENTRY*LPALCGETSTRINGISOFT)(ALCdevice *device, ALCenum paramName, ALCsizei index); typedef const ALCchar* (ALC_APIENTRY*LPALCGETSTRINGISOFT)(ALCdevice *device, ALCenum paramName, ALCsizei index);
typedef ALCboolean (ALC_APIENTRY*LPALCRESETDEVICESOFT)(ALCdevice *device, const ALCint *attribs); typedef ALCboolean (ALC_APIENTRY*LPALCRESETDEVICESOFT)(ALCdevice *device, const ALCint *attribs);
#ifdef AL_ALEXT_PROTOTYPES #ifdef AL_ALEXT_PROTOTYPES
@ -181,6 +183,7 @@ private:
bool EXT_disconnect; bool EXT_disconnect;
bool SOFT_HRTF; bool SOFT_HRTF;
bool SOFT_pause_device; bool SOFT_pause_device;
bool SOFT_output_limiter;
} ALC; } ALC;
struct { struct {
bool EXT_source_distance_model; bool EXT_source_distance_model;

View file

@ -463,7 +463,7 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source,
} }
// If this sound doesn't like playing near itself, don't play it if that's what would happen. // If this sound doesn't like playing near itself, don't play it if that's what would happen.
if (near_limit > 0 && CheckSoundLimit(sfx, pos, near_limit, limit_range, type, source, channel)) if (near_limit > 0 && CheckSoundLimit(sfx, pos, near_limit, limit_range, type, source, channel, attenuation))
{ {
chanflags |= CHANF_EVICTED; chanflags |= CHANF_EVICTED;
} }
@ -675,7 +675,7 @@ void SoundEngine::RestartChannel(FSoundChan *chan)
// If this sound doesn't like playing near itself, don't play it if // If this sound doesn't like playing near itself, don't play it if
// that's what would happen. // that's what would happen.
if (chan->NearLimit > 0 && CheckSoundLimit(&S_sfx[chan->SoundID], pos, chan->NearLimit, chan->LimitRange, 0, NULL, 0)) if (chan->NearLimit > 0 && CheckSoundLimit(&S_sfx[chan->SoundID], pos, chan->NearLimit, chan->LimitRange, 0, NULL, 0, chan->DistanceScale))
{ {
return; return;
} }
@ -816,7 +816,7 @@ bool SoundEngine::CheckSingular(int sound_id)
//========================================================================== //==========================================================================
bool SoundEngine::CheckSoundLimit(sfxinfo_t *sfx, const FVector3 &pos, int near_limit, float limit_range, bool SoundEngine::CheckSoundLimit(sfxinfo_t *sfx, const FVector3 &pos, int near_limit, float limit_range,
int sourcetype, const void *actor, int channel) int sourcetype, const void *actor, int channel, float attenuation)
{ {
FSoundChan *chan; FSoundChan *chan;
int count; int count;
@ -835,7 +835,9 @@ bool SoundEngine::CheckSoundLimit(sfxinfo_t *sfx, const FVector3 &pos, int near_
} }
CalcPosVel(chan, &chanorigin, NULL); CalcPosVel(chan, &chanorigin, NULL);
if ((chanorigin - pos).LengthSquared() <= limit_range) // scale the limit distance with the attenuation. An attenuation of 0 means the limit distance is infinite and all sounds within the level are inside the limit.
float attn = std::min(chan->DistanceScale, attenuation);
if (attn <= 0 || (chanorigin - pos).LengthSquared() <= limit_range / attn)
{ {
count++; count++;
} }

View file

@ -234,7 +234,7 @@ private:
bool CheckSingular(int sound_id); bool CheckSingular(int sound_id);
virtual TArray<uint8_t> ReadSound(int lumpnum) = 0; virtual TArray<uint8_t> ReadSound(int lumpnum) = 0;
protected: protected:
virtual bool CheckSoundLimit(sfxinfo_t* sfx, const FVector3& pos, int near_limit, float limit_range, int sourcetype, const void* actor, int channel); virtual bool CheckSoundLimit(sfxinfo_t* sfx, const FVector3& pos, int near_limit, float limit_range, int sourcetype, const void* actor, int channel, float attenuation);
virtual FSoundID ResolveSound(const void *ent, int srctype, FSoundID soundid, float &attenuation); virtual FSoundID ResolveSound(const void *ent, int srctype, FSoundID soundid, float &attenuation);
public: public:

View file

@ -614,7 +614,7 @@ void C_DrawConsole ()
} }
else else
{ {
if (conflat.isValid()) if (conflat.isValid() && gamestate != GS_FULLCONSOLE)
{ {
int conbright = 255 - APART(conshade); int conbright = 255 - APART(conshade);
PalEntry pe((uint8_t(255 * con_alpha)), conbright, conbright, conbright); PalEntry pe((uint8_t(255 * con_alpha)), conbright, conbright, conbright);

View file

@ -12,6 +12,7 @@ struct FStartupInfo
int Type; int Type;
int LoadLights = -1; int LoadLights = -1;
int LoadBrightmaps = -1; int LoadBrightmaps = -1;
int LoadWidescreen = -1;
int modern = 0; int modern = 0;
enum enum
{ {

View file

@ -93,6 +93,7 @@ public:
bool mAnimatedTransition; bool mAnimatedTransition;
int mVirtWidth; int mVirtWidth;
int mVirtHeight; int mVirtHeight;
bool mCustomSizeSet;
void Reset(); void Reset();
}; };

View file

@ -267,10 +267,8 @@ static bool CheckSkipOptionBlock(FScanner &sc)
// //
//============================================================================= //=============================================================================
static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc) static void DoParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc, bool &sizecompatible, int insertIndex)
{ {
bool sizeset = false;
bool sizecompatible = true;
sc.MustGetStringName("{"); sc.MustGetStringName("{");
while (!sc.CheckString("}")) while (!sc.CheckString("}"))
{ {
@ -284,7 +282,7 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
if (!CheckSkipGameBlock(sc)) if (!CheckSkipGameBlock(sc))
{ {
// recursively parse sub-block // recursively parse sub-block
ParseListMenuBody(sc, desc); DoParseListMenuBody(sc, desc, sizecompatible, insertIndex);
} }
} }
else if (sc.Compare("ifnotgame")) else if (sc.Compare("ifnotgame"))
@ -292,7 +290,7 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
if (!CheckSkipGameBlock(sc, false)) if (!CheckSkipGameBlock(sc, false))
{ {
// recursively parse sub-block // recursively parse sub-block
ParseListMenuBody(sc, desc); DoParseListMenuBody(sc, desc, sizecompatible, insertIndex);
} }
} }
else if (sc.Compare("ifoption")) else if (sc.Compare("ifoption"))
@ -300,7 +298,7 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
if (!CheckSkipOptionBlock(sc)) if (!CheckSkipOptionBlock(sc))
{ {
// recursively parse sub-block // recursively parse sub-block
ParseListMenuBody(sc, desc); DoParseListMenuBody(sc, desc, sizecompatible, insertIndex);
} }
} }
else if (sc.Compare("Class")) else if (sc.Compare("Class"))
@ -382,6 +380,7 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
} }
else if (sc.Compare("size")) else if (sc.Compare("size"))
{ {
desc->mCustomSizeSet = true;
if (sc.CheckNumber()) if (sc.CheckNumber())
{ {
desc->mVirtWidth = sc.Number; desc->mVirtWidth = sc.Number;
@ -418,6 +417,17 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
PClass *cls = PClass::FindClass(buildname); PClass *cls = PClass::FindClass(buildname);
if (cls != nullptr && cls->IsDescendantOf("ListMenuItem")) if (cls != nullptr && cls->IsDescendantOf("ListMenuItem"))
{ {
bool inserting = insertIndex >= 0;
bool isSelectable = cls->IsDescendantOf("ListMenuItemSelectable");
double oldYpos = desc->mYpos;
// [Player701] If this is a selectable item and we're inserting in the middle,
// set the Y position of the descriptor to the Y of the item we're inserting before.
if (isSelectable && inserting)
{
desc->mYpos = desc->mItems[insertIndex]->mYpos;
}
auto func = dyn_cast<PFunction>(cls->FindSymbol("Init", true)); auto func = dyn_cast<PFunction>(cls->FindSymbol("Init", true));
if (func != nullptr && !(func->Variants[0].Flags & (VARF_Protected | VARF_Private))) // skip internal classes which have a protected init method. if (func != nullptr && !(func->Variants[0].Flags & (VARF_Protected | VARF_Private))) // skip internal classes which have a protected init method.
{ {
@ -528,11 +538,36 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
DMenuItemBase *item = (DMenuItemBase*)cls->CreateNew(); DMenuItemBase *item = (DMenuItemBase*)cls->CreateNew();
params[0] = item; params[0] = item;
VMCallWithDefaults(func->Variants[0].Implementation, params, nullptr, 0); VMCallWithDefaults(func->Variants[0].Implementation, params, nullptr, 0);
desc->mItems.Push((DMenuItemBase*)item);
if (cls->IsDescendantOf("ListMenuItemSelectable")) if (!inserting)
{ {
desc->mYpos += desc->mLinespacing; desc->mItems.Push(item);
}
else
{
// [Player701] Insert item in between
desc->mItems.Insert(insertIndex, item);
insertIndex++;
}
if (isSelectable)
{
if (inserting)
{
// [Player701] If we've inserted a selectable item,
// shift all following selectable items downwards
// NB: index has been incremented, so we're not affecting the newly inserted item here.
for (unsigned int i = insertIndex; i < desc->mItems.Size(); i++)
{
auto item = desc->mItems[i];
if (item->GetClass()->IsDescendantOf("ListMenuItemSelectable"))
{
desc->mItems[i]->mYpos += desc->mLinespacing;
}
}
}
desc->mYpos = oldYpos + desc->mLinespacing;
if (desc->mSelectedItem == -1) desc->mSelectedItem = desc->mItems.Size() - 1; if (desc->mSelectedItem == -1) desc->mSelectedItem = desc->mItems.Size() - 1;
} }
success = true; success = true;
@ -544,16 +579,24 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
} }
} }
} }
if (!sizeset && sizecompatible) // allow unclean scaling on this menu
{
desc->mVirtWidth = -2;
}
for (auto &p : desc->mItems) for (auto &p : desc->mItems)
{ {
GC::WriteBarrier(p); GC::WriteBarrier(p);
} }
} }
static void ParseListMenuBody(FScanner& sc, DListMenuDescriptor* desc, int insertIndex)
{
bool sizecompatible = true;
DoParseListMenuBody(sc, desc, sizecompatible, insertIndex);
if (!desc->mCustomSizeSet && !sizecompatible)
{
// No custom size and incompatible items,
// so force clean scaling for this menu
desc->mVirtWidth = -1;
}
}
//============================================================================= //=============================================================================
// //
// //
@ -700,11 +743,62 @@ static void ParseListMenu(FScanner &sc)
desc->mWRight = 0; desc->mWRight = 0;
desc->mCenter = false; desc->mCenter = false;
desc->mFromEngine = fileSystem.GetFileContainer(sc.LumpNum) == 0; // flags menu if the definition is from the IWAD. desc->mFromEngine = fileSystem.GetFileContainer(sc.LumpNum) == 0; // flags menu if the definition is from the IWAD.
desc->mVirtWidth = -2;
desc->mCustomSizeSet = false;
ParseListMenuBody(sc, desc); ParseListMenuBody(sc, desc, -1);
ReplaceMenu(sc, desc); ReplaceMenu(sc, desc);
} }
//=============================================================================
//
// [Player701] Allow extending list menus
//
//=============================================================================
static void ParseAddListMenu(FScanner& sc)
{
sc.MustGetString();
DMenuDescriptor** pOld = MenuDescriptors.CheckKey(sc.String);
if (pOld == nullptr || *pOld == nullptr || !(*pOld)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor)))
{
sc.ScriptError("%s is not a list menu that can be extended", sc.String);
return;
}
bool before = sc.CheckString("BEFORE");
bool after = sc.CheckString("AFTER");
int insertIndex = -1;
if (before || after)
{
// Find an existing menu item to use as insertion point
sc.MustGetString();
auto n = (*pOld)->mItems.Size();
for (unsigned int i = 0; i < n; i++)
{
auto item = (*pOld)->mItems[i];
if (item->mAction == sc.String)
{
insertIndex = before ? i : i + 1;
break;
}
}
// Inserting after the last item is the same as inserting at the end
if (insertIndex == n) insertIndex = -1;
// Don't error out if we haven't found a suitable item
// to avoid backwards compatibility issues.
}
ParseListMenuBody(sc, (DListMenuDescriptor*)(*pOld), insertIndex);
}
//============================================================================= //=============================================================================
// //
// //
@ -1048,6 +1142,7 @@ static void ParseAddOptionMenu(FScanner &sc)
if (pOld == nullptr || *pOld == nullptr || !(*pOld)->IsKindOf(RUNTIME_CLASS(DOptionMenuDescriptor))) if (pOld == nullptr || *pOld == nullptr || !(*pOld)->IsKindOf(RUNTIME_CLASS(DOptionMenuDescriptor)))
{ {
sc.ScriptError("%s is not an option menu that can be extended", sc.String); sc.ScriptError("%s is not an option menu that can be extended", sc.String);
return;
} }
ParseOptionMenuBody(sc, (DOptionMenuDescriptor*)(*pOld)); ParseOptionMenuBody(sc, (DOptionMenuDescriptor*)(*pOld));
} }
@ -1296,12 +1391,17 @@ void M_ParseMenuDefs()
} }
else if (sc.Compare("DEFAULTLISTMENU")) else if (sc.Compare("DEFAULTLISTMENU"))
{ {
ParseListMenuBody(sc, DefaultListMenuSettings); bool s = false;
DoParseListMenuBody(sc, DefaultListMenuSettings, s, -1);
if (DefaultListMenuSettings->mItems.Size() > 0) if (DefaultListMenuSettings->mItems.Size() > 0)
{ {
I_FatalError("You cannot add menu items to the menu default settings."); I_FatalError("You cannot add menu items to the menu default settings.");
} }
} }
else if (sc.Compare("ADDLISTMENU"))
{
ParseAddListMenu(sc);
}
else if (sc.Compare("OPTIONVALUE")) else if (sc.Compare("OPTIONVALUE"))
{ {
ParseOptionValue(sc); ParseOptionValue(sc);

View file

@ -112,6 +112,7 @@ EXTERN_CVAR (Bool, queryiwad);
EXTERN_CVAR (Bool, disableautoload) EXTERN_CVAR (Bool, disableautoload)
EXTERN_CVAR (Bool, autoloadlights) EXTERN_CVAR (Bool, autoloadlights)
EXTERN_CVAR (Bool, autoloadbrightmaps) EXTERN_CVAR (Bool, autoloadbrightmaps)
EXTERN_CVAR (Bool, autoloadwidescreen)
EXTERN_CVAR (Int, vid_preferbackend) EXTERN_CVAR (Int, vid_preferbackend)
extern HWND Window, ConWindow, GameTitleWindow; extern HWND Window, ConWindow, GameTitleWindow;
@ -529,6 +530,7 @@ BOOL CALLBACK IWADBoxCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa
SendDlgItemMessage( hDlg, IDC_WELCOME_NOAUTOLOAD, BM_SETCHECK, disableautoload ? BST_CHECKED : BST_UNCHECKED, 0 ); SendDlgItemMessage( hDlg, IDC_WELCOME_NOAUTOLOAD, BM_SETCHECK, disableautoload ? BST_CHECKED : BST_UNCHECKED, 0 );
SendDlgItemMessage( hDlg, IDC_WELCOME_LIGHTS, BM_SETCHECK, autoloadlights ? BST_CHECKED : BST_UNCHECKED, 0 ); SendDlgItemMessage( hDlg, IDC_WELCOME_LIGHTS, BM_SETCHECK, autoloadlights ? BST_CHECKED : BST_UNCHECKED, 0 );
SendDlgItemMessage( hDlg, IDC_WELCOME_BRIGHTMAPS, BM_SETCHECK, autoloadbrightmaps ? BST_CHECKED : BST_UNCHECKED, 0 ); SendDlgItemMessage( hDlg, IDC_WELCOME_BRIGHTMAPS, BM_SETCHECK, autoloadbrightmaps ? BST_CHECKED : BST_UNCHECKED, 0 );
SendDlgItemMessage( hDlg, IDC_WELCOME_WIDESCREEN, BM_SETCHECK, autoloadwidescreen ? BST_CHECKED : BST_UNCHECKED, 0 );
// Set up our version string. // Set up our version string.
sprintf(szString, "Version %s.", GetVersionString()); sprintf(szString, "Version %s.", GetVersionString());
@ -583,6 +585,7 @@ BOOL CALLBACK IWADBoxCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa
disableautoload = SendDlgItemMessage( hDlg, IDC_WELCOME_NOAUTOLOAD, BM_GETCHECK, 0, 0 ) == BST_CHECKED; disableautoload = SendDlgItemMessage( hDlg, IDC_WELCOME_NOAUTOLOAD, BM_GETCHECK, 0, 0 ) == BST_CHECKED;
autoloadlights = SendDlgItemMessage( hDlg, IDC_WELCOME_LIGHTS, BM_GETCHECK, 0, 0 ) == BST_CHECKED; autoloadlights = SendDlgItemMessage( hDlg, IDC_WELCOME_LIGHTS, BM_GETCHECK, 0, 0 ) == BST_CHECKED;
autoloadbrightmaps = SendDlgItemMessage( hDlg, IDC_WELCOME_BRIGHTMAPS, BM_GETCHECK, 0, 0 ) == BST_CHECKED; autoloadbrightmaps = SendDlgItemMessage( hDlg, IDC_WELCOME_BRIGHTMAPS, BM_GETCHECK, 0, 0 ) == BST_CHECKED;
autoloadwidescreen = SendDlgItemMessage( hDlg, IDC_WELCOME_WIDESCREEN, BM_GETCHECK, 0, 0 ) == BST_CHECKED;
ctrl = GetDlgItem (hDlg, IDC_IWADLIST); ctrl = GetDlgItem (hDlg, IDC_IWADLIST);
EndDialog(hDlg, SendMessage (ctrl, LB_GETCURSEL, 0, 0)); EndDialog(hDlg, SendMessage (ctrl, LB_GETCURSEL, 0, 0));
} }

View file

@ -153,6 +153,7 @@
#define IDC_WELCOME_NOAUTOLOAD 4023 #define IDC_WELCOME_NOAUTOLOAD 4023
#define IDC_WELCOME_LIGHTS 4024 #define IDC_WELCOME_LIGHTS 4024
#define IDC_WELCOME_BRIGHTMAPS 4025 #define IDC_WELCOME_BRIGHTMAPS 4025
#define IDC_WELCOME_WIDESCREEN 1087
#define IDC_WELCOME_VULKAN 4026 #define IDC_WELCOME_VULKAN 4026
#define IDC_WELCOME_VULKAN1 4026 #define IDC_WELCOME_VULKAN1 4026