diff --git a/src/posix/sdl/sdlglvideo.cpp b/src/posix/sdl/sdlglvideo.cpp index e2318a1fbe..6401e52cf3 100644 --- a/src/posix/sdl/sdlglvideo.cpp +++ b/src/posix/sdl/sdlglvideo.cpp @@ -255,7 +255,10 @@ DFrameBuffer *SDLGLVideo::CreateFrameBuffer (int width, int height, bool bgra, b { fb = (SDLBaseFB*)CreateGLSWFrameBuffer(width, height, bgra, fullscreen); if (!fb->IsValid()) + { + delete fb; fb = new SDLFB(width, height, bgra, fullscreen, nullptr); + } } retry = 0; diff --git a/src/swrenderer/drawers/r_draw_span32.h b/src/swrenderer/drawers/r_draw_span32.h index dcd43312fc..a48ec844b6 100644 --- a/src/swrenderer/drawers/r_draw_span32.h +++ b/src/swrenderer/drawers/r_draw_span32.h @@ -86,9 +86,6 @@ namespace swrenderer texdata.ystep = args.TextureVStep(); texdata.xfrac = args.TextureUPos(); texdata.yfrac = args.TextureVPos(); - texdata.yshift = 32 - texdata.ybits; - texdata.xshift = texdata.yshift - texdata.xbits; - texdata.xmask = ((1 << texdata.xbits) - 1) << texdata.ybits; texdata.source = (const uint32_t*)args.TexturePixels(); @@ -111,7 +108,11 @@ namespace swrenderer } } - bool is_nearest_filter = !((magnifying && r_magfilter) || (!magnifying && r_minfilter)); + texdata.yshift = 32 - texdata.ybits; + texdata.xshift = texdata.yshift - texdata.xbits; + texdata.xmask = ((1 << texdata.xbits) - 1) << texdata.ybits; + + bool is_nearest_filter = (magnifying && !r_magfilter) || (!magnifying && !r_minfilter); bool is_64x64 = texdata.xbits == 6 && texdata.ybits == 6; auto shade_constants = args.ColormapConstants(); diff --git a/src/swrenderer/drawers/r_draw_span32_sse2.h b/src/swrenderer/drawers/r_draw_span32_sse2.h index 68d68ec82d..8a4e28608a 100644 --- a/src/swrenderer/drawers/r_draw_span32_sse2.h +++ b/src/swrenderer/drawers/r_draw_span32_sse2.h @@ -86,9 +86,6 @@ namespace swrenderer texdata.ystep = args.TextureVStep(); texdata.xfrac = args.TextureUPos(); texdata.yfrac = args.TextureVPos(); - texdata.yshift = 32 - texdata.ybits; - texdata.xshift = texdata.yshift - texdata.xbits; - texdata.xmask = ((1 << texdata.xbits) - 1) << texdata.ybits; texdata.source = (const uint32_t*)args.TexturePixels(); @@ -111,7 +108,11 @@ namespace swrenderer } } - bool is_nearest_filter = !((magnifying && r_magfilter) || (!magnifying && r_minfilter)); + texdata.yshift = 32 - texdata.ybits; + texdata.xshift = texdata.yshift - texdata.xbits; + texdata.xmask = ((1 << texdata.xbits) - 1) << texdata.ybits; + + bool is_nearest_filter = (magnifying && !r_magfilter) || (!magnifying && !r_minfilter); bool is_64x64 = texdata.xbits == 6 && texdata.ybits == 6; auto shade_constants = args.ColormapConstants(); diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt index 1223b6bf8e..98b5049854 100644 --- a/wadsrc/static/zscript/shared/player.txt +++ b/wadsrc/static/zscript/shared/player.txt @@ -489,7 +489,7 @@ class PlayerPawn : Actor native Pitch = 0.; } } - CalcHeight (); + player.mo.CalcHeight (); if (player.attacker && player.attacker != self) { // Watch killer @@ -1243,9 +1243,9 @@ class PlayerPawn : Actor native CheckEnvironment(); CheckUse(); CheckUndoMorph(); - // Cycle psprites - TickPSprites(); - + // Cycle psprites. + // Note that after this point the PlayerPawn may have changed due to getting unmorphed so 'self' is no longer safe to use. + player.mo.TickPSprites(); // Other Counters if (player.damagecount) player.damagecount--; if (player.bonuscount) player.bonuscount--; @@ -1254,12 +1254,11 @@ class PlayerPawn : Actor native { player.hazardcount--; if (!(level.time % player.hazardinterval) && player.hazardcount > 16*TICRATE) - DamageMobj (NULL, NULL, 5, player.hazardtype); + player.mo.DamageMobj (NULL, NULL, 5, player.hazardtype); } - - CheckPoison(); - CheckDegeneration(); - CheckAirSupply(); + player.mo.CheckPoison(); + player.mo.CheckDegeneration(); + player.mo.CheckAirSupply(); } }