From 00dab8677a50d232cbafdd703925bafb53dc98a2 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 2 May 2017 17:12:54 -0400 Subject: [PATCH 1/8] - fixed: Changing fullscreen while vid_renderer != currentrenderer will cause a fake vid_renderer to be passed to the mode change function in order to prevent a crash. --- src/d_main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/d_main.cpp b/src/d_main.cpp index 36d57e280..bed80387b 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -682,6 +682,13 @@ void D_Display () // [RH] change the screen mode if needed if (setmodeneeded) { + int oldrenderer; + extern int currentrenderer; + EXTERN_CVAR(Int, vid_renderer) + oldrenderer = vid_renderer; // [SP] Save pending vid_renderer setting (hack) + if (currentrenderer != vid_renderer) + vid_renderer = currentrenderer; + // Change screen mode. if (Video->SetResolution (NewWidth, NewHeight, NewBits)) { @@ -700,6 +707,7 @@ void D_Display () // Reset the mouse cursor in case the bit depth changed vid_cursor.Callback(); } + vid_renderer = oldrenderer; // [SP] Restore pending vid_renderer setting } // change the view size if needed From f9445e96f5142a83abb12d122f1e5b8273264da9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 3 May 2017 10:26:25 +0200 Subject: [PATCH 2/8] - fixed: DPSprite::GetRenderStyle returned the wrong alpha value. --- src/p_pspr.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/p_pspr.cpp b/src/p_pspr.cpp index bd2e4219c..2404b8b9c 100644 --- a/src/p_pspr.cpp +++ b/src/p_pspr.cpp @@ -322,7 +322,6 @@ std::pair DPSprite::GetRenderStyle(FRenderStyle ownerstyle, mystyle.CheckFuzz(); if (Flags & PSPF_RENDERSTYLE) { - ownerstyle.CheckFuzz(); if (Flags & PSPF_FORCESTYLE) { returnstyle = mystyle; @@ -372,6 +371,10 @@ std::pair DPSprite::GetRenderStyle(FRenderStyle ownerstyle, returnalpha = owneralpha * alpha; } } + else + { + returnalpha = owneralpha; + } // Should normal renderstyle come out on top at the end and we desire alpha, // switch it to translucent. Normal never applies any sort of alpha. @@ -381,7 +384,7 @@ std::pair DPSprite::GetRenderStyle(FRenderStyle ownerstyle, returnalpha = owneralpha * alpha; } - return{ returnstyle, clamp(float(alpha), 0.f, 1.f) }; + return{ returnstyle, clamp(float(returnalpha), 0.f, 1.f) }; } //--------------------------------------------------------------------------- From 8303d8bbd14a77b74dc9a8ab9d9a00d9efcad1d6 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Wed, 3 May 2017 16:56:22 +0300 Subject: [PATCH 3/8] Fixed name of mpg123 shared library on Linux https://forum.zdoom.org/viewtopic.php?t=56253 --- src/sound/mpg123_decoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/mpg123_decoder.cpp b/src/sound/mpg123_decoder.cpp index dccaa6600..27a26c747 100644 --- a/src/sound/mpg123_decoder.cpp +++ b/src/sound/mpg123_decoder.cpp @@ -52,7 +52,7 @@ FModule MPG123Module{"MPG123"}; #elif defined(__APPLE__) #define MPG123LIB "libmpg123.0.dylib" #else -#define MPG123LIB "libmpg123.so.1" +#define MPG123LIB "libmpg123.so.0" #endif bool IsMPG123Present() From 2acb485121e9414cb6da197b15ad4a2d27f00986 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 3 May 2017 13:47:27 -0400 Subject: [PATCH 4/8] - Added +SPRITEFLIP which reverses a sprite's left-rightness. --- src/actor.h | 1 + src/r_data/sprites.cpp | 12 ++++++++++-- src/r_data/sprites.h | 2 +- src/scripting/thingdef_data.cpp | 1 + src/swrenderer/scene/r_opaque_pass.cpp | 3 ++- src/swrenderer/things/r_sprite.cpp | 4 ++++ 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/actor.h b/src/actor.h index ff9e27af9..17a7a6a8a 100644 --- a/src/actor.h +++ b/src/actor.h @@ -396,6 +396,7 @@ enum ActorFlag7 MF7_FORCEZERORADIUSDMG = 0x10000000, // passes zero radius damage on to P_DamageMobj, this is necessary in some cases where DoSpecialDamage gets overrideen. MF7_NOINFIGHTSPECIES = 0x20000000, // don't start infights with one's own species. MF7_FORCEINFIGHTING = 0x40000000, // overrides a map setting of 'no infighting'. + MF7_SPRITEFLIP = 0x80000000, // sprite flipped on x-axis }; // --- mobj.renderflags --- diff --git a/src/r_data/sprites.cpp b/src/r_data/sprites.cpp index aab36109a..9b2da567b 100644 --- a/src/r_data/sprites.cpp +++ b/src/r_data/sprites.cpp @@ -64,7 +64,7 @@ PalEntry OtherGameSkinPalette[256]; // //=========================================================================== -FTextureID spritedef_t::GetSpriteFrame(int frame, int rot, DAngle ang, bool *mirror) +FTextureID spritedef_t::GetSpriteFrame(int frame, int rot, DAngle ang, bool *mirror, bool flipagain) { if ((unsigned)frame >= numframes) { @@ -77,10 +77,18 @@ FTextureID spritedef_t::GetSpriteFrame(int frame, int rot, DAngle ang, bool *mir spriteframe_t *sprframe = &SpriteFrames[spriteframes + frame]; if (rot == -1) { - if (sprframe->Texture[0] == sprframe->Texture[1]) + if ((sprframe->Texture[0] == sprframe->Texture[1]) && flipagain) + { + rot = (360.0 - ang + 45.0 / 2 * 9).BAMs() >> 28; + } + else if (sprframe->Texture[0] == sprframe->Texture[1]) { rot = (ang + 45.0 / 2 * 9).BAMs() >> 28; } + else if (flipagain) + { + rot = (360.0 - ang + (45.0 / 2 * 9 - 180.0 / 16)).BAMs() >> 28; + } else { rot = (ang + (45.0 / 2 * 9 - 180.0 / 16)).BAMs() >> 28; diff --git a/src/r_data/sprites.h b/src/r_data/sprites.h index aec0a246d..37c608986 100644 --- a/src/r_data/sprites.h +++ b/src/r_data/sprites.h @@ -37,7 +37,7 @@ struct spritedef_t uint8_t numframes; uint16_t spriteframes; - FTextureID GetSpriteFrame(int frame, int rot, DAngle ang, bool *mirror); + FTextureID GetSpriteFrame(int frame, int rot, DAngle ang, bool *mirror, bool flipagain = false); }; extern TArray SpriteFrames; diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index be8726b06..0c3962c7d 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -322,6 +322,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF7, FORCEZERORADIUSDMG, AActor, flags7), DEFINE_FLAG(MF7, NOINFIGHTSPECIES, AActor, flags7), DEFINE_FLAG(MF7, FORCEINFIGHTING, AActor, flags7), + DEFINE_FLAG(MF7, SPRITEFLIP, AActor, flags7), // Effect flags DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index 2ce071f2b..3d0e9a08a 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -1006,7 +1006,8 @@ namespace swrenderer auto &viewpoint = Thread->Viewport->viewpoint; DAngle sprangle = thing->GetSpriteAngle((sprite.pos - viewpoint.Pos).Angle(), viewpoint.TicFrac); bool flipX; - FTextureID tex = sprdef->GetSpriteFrame(thing->frame, -1, sprangle, &flipX); + + FTextureID tex = sprdef->GetSpriteFrame(thing->frame, -1, sprangle, &flipX, !!(thing->flags7 & MF7_SPRITEFLIP)); if (!tex.isValid()) return false; if (flipX) diff --git a/src/swrenderer/things/r_sprite.cpp b/src/swrenderer/things/r_sprite.cpp index a34902560..889430004 100644 --- a/src/swrenderer/things/r_sprite.cpp +++ b/src/swrenderer/things/r_sprite.cpp @@ -145,6 +145,10 @@ namespace swrenderer // [RH] Flip for mirrors renderflags ^= renderportal->MirrorFlags & RF_XFLIP; + // [SP] SpriteFlip + if (thing->flags7 & MF7_SPRITEFLIP) + renderflags ^= RF_XFLIP; + // calculate edges of the shape const double thingxscalemul = spriteScale.X / tex->Scale.X; From 00a499365484b5087ae446e445e4d702e83acadc Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 3 May 2017 13:55:01 -0400 Subject: [PATCH 5/8] - forgot to implement +SPRITEFLIP for OpenGL --- src/gl/scene/gl_sprite.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 1c25fe4cc..1cd2070b8 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -800,7 +800,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal) sprangle = 0.; rot = 0; } - patch = sprites[spritenum].GetSpriteFrame(thing->frame, rot, sprangle, &mirror); + patch = sprites[spritenum].GetSpriteFrame(thing->frame, rot, sprangle, &mirror, !!(thing->flags7 & MF7_SPRITEFLIP)); } if (!patch.isValid()) return; @@ -814,7 +814,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal) if (thing->renderflags & RF_YFLIP) std::swap(vt, vb); gltexture->GetSpriteRect(&r); - if (mirror ^ !!(thing->renderflags & RF_XFLIP)) + if ((mirror ^ !!(thing->renderflags & RF_XFLIP)) || (thing->flags7 & MF7_SPRITEFLIP)) { r.left = -r.width - r.left; // mirror the sprite's x-offset ul = gltexture->GetSpriteUL(); From 5a450b5eaa3dcc937223e083c8733b519c344279 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 3 May 2017 15:56:33 -0400 Subject: [PATCH 6/8] - fixed: +FLIPSPRITE works in mirrors in OpenGL now. --- src/gl/scene/gl_sprite.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 1cd2070b8..629f8acb9 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -814,7 +814,12 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal) if (thing->renderflags & RF_YFLIP) std::swap(vt, vb); gltexture->GetSpriteRect(&r); - if ((mirror ^ !!(thing->renderflags & RF_XFLIP)) || (thing->flags7 & MF7_SPRITEFLIP)) + + // [SP] SpriteFlip + if (thing->flags7 & MF7_SPRITEFLIP) + thing->renderflags ^= RF_XFLIP; + + if (mirror ^ !!(thing->renderflags & RF_XFLIP)) { r.left = -r.width - r.left; // mirror the sprite's x-offset ul = gltexture->GetSpriteUL(); @@ -826,6 +831,9 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal) ur = gltexture->GetSpriteUL(); } + if (thing->flags7 & MF7_SPRITEFLIP) // [SP] Flip back + thing->renderflags ^= RF_XFLIP; + r.Scale(sprscale.X, sprscale.Y); float rightfac = -r.left; From 0877539315dca67c43e3485e4a67896e239c8ef8 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 3 May 2017 22:06:00 +0200 Subject: [PATCH 7/8] - fixed: The Talisman powerup for SVE was given to the wrong actor. --- wadsrc/static/zscript/strife/svestuff.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/strife/svestuff.txt b/wadsrc/static/zscript/strife/svestuff.txt index 0e17a7eca..1e52df1b5 100644 --- a/wadsrc/static/zscript/strife/svestuff.txt +++ b/wadsrc/static/zscript/strife/svestuff.txt @@ -81,7 +81,7 @@ class SVETalismanRed : Inventory toucher.FindInventory("SVETalismanBlue")) { toucher.A_Print("$MSG_TALISMANPOWER"); - GiveInventoryType("SVETalismanPowerup"); + toucher.GiveInventoryType("SVETalismanPowerup"); } } return useok; From 99a61e74c71142d172182881feded716b64ec961 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 4 May 2017 00:37:43 +0200 Subject: [PATCH 8/8] - fixed: The first model ID was always initialized to 0, even if that model wasn't even present in the definition. --- src/gl/models/gl_models.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gl/models/gl_models.cpp b/src/gl/models/gl_models.cpp index 768690bcc..8adee7cf0 100644 --- a/src/gl/models/gl_models.cpp +++ b/src/gl/models/gl_models.cpp @@ -521,7 +521,7 @@ void gl_InitModels() path = ""; sc.MustGetString(); memset(&smf, 0, sizeof(smf)); - smf.modelIDs[1] = smf.modelIDs[2] = smf.modelIDs[3] = -1; + smf.modelIDs[0] = smf.modelIDs[1] = smf.modelIDs[2] = smf.modelIDs[3] = -1; smf.xscale=smf.yscale=smf.zscale=1.f; smf.type = PClass::FindClass(sc.String);