diff --git a/src/playsim/p_pspr.cpp b/src/playsim/p_pspr.cpp index 97be2772c8..bcbbf2f189 100644 --- a/src/playsim/p_pspr.cpp +++ b/src/playsim/p_pspr.cpp @@ -140,6 +140,7 @@ DEFINE_FIELD_BIT(DPSprite, Flags, bPowDouble, PSPF_POWDOUBLE) DEFINE_FIELD_BIT(DPSprite, Flags, bCVarFast, PSPF_CVARFAST) DEFINE_FIELD_BIT(DPSprite, Flags, bFlip, PSPF_FLIP) DEFINE_FIELD_BIT(DPSprite, Flags, bMirror, PSPF_MIRROR) +DEFINE_FIELD_BIT(DPSprite, Flags, bPlayerTranslated, PSPF_PLAYERTRANSLATED) //------------------------------------------------------------------------ // diff --git a/src/playsim/p_pspr.h b/src/playsim/p_pspr.h index 4723fa1cbc..b807e4f09a 100644 --- a/src/playsim/p_pspr.h +++ b/src/playsim/p_pspr.h @@ -68,6 +68,7 @@ enum PSPFlags PSPF_FORCEALPHA = 1 << 7, PSPF_FORCESTYLE = 1 << 8, PSPF_MIRROR = 1 << 9, + PSPF_PLAYERTRANSLATED = 1 << 10 }; class DPSprite : public DObject diff --git a/src/r_data/models/models.cpp b/src/r_data/models/models.cpp index 4d4471717a..51ff94b74a 100644 --- a/src/r_data/models/models.cpp +++ b/src/r_data/models/models.cpp @@ -211,7 +211,7 @@ void FModelRenderer::RenderHUDModel(DPSprite *psp, float ofsX, float ofsY) float orientation = smf->xscale * smf->yscale * smf->zscale; BeginDrawHUDModel(playermo, objectToWorldMatrix, orientation < 0); - RenderFrameModels(playermo->Level, smf, psp->GetState(), psp->GetTics(), playermo->player->ReadyWeapon->GetClass(), 0); + RenderFrameModels(playermo->Level, smf, psp->GetState(), psp->GetTics(), playermo->player->ReadyWeapon->GetClass(), psp->Flags & PSPF_PLAYERTRANSLATED ? psp->Owner->mo->Translation : 0); EndDrawHUDModel(playermo); } diff --git a/src/rendering/hwrenderer/scene/hw_weapon.cpp b/src/rendering/hwrenderer/scene/hw_weapon.cpp index 85f66ab093..8eec8a13a8 100644 --- a/src/rendering/hwrenderer/scene/hw_weapon.cpp +++ b/src/rendering/hwrenderer/scene/hw_weapon.cpp @@ -95,7 +95,7 @@ void HWDrawInfo::DrawPSprite(HUDSprite *huds, FRenderState &state) { float thresh = (huds->tex->tex->GetTranslucency() || huds->OverrideShader != -1) ? 0.f : gl_mask_sprite_threshold; state.AlphaFunc(Alpha_GEqual, thresh); - state.SetMaterial(huds->tex, CLAMP_XY_NOMIP, 0, huds->OverrideShader); + state.SetMaterial(huds->tex, CLAMP_XY_NOMIP, (huds->weapon->Flags & PSPF_PLAYERTRANSLATED) ? huds->owner->Translation : 0, huds->OverrideShader); state.Draw(DT_TriangleStrip, huds->mx, 4); } diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index 0036f922a2..58cba9f0f7 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -2543,7 +2543,8 @@ class PSprite : Object native play native bool bCVarFast; native bool bFlip; native bool bMirror; - + native bool bPlayerTranslated; + native void SetState(State newstate, bool pending = false); //------------------------------------------------------------------------ diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index bd6207dc3f..8c91efb09d 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -748,6 +748,7 @@ enum EPSpriteFlags PSPF_FORCEALPHA = 1 << 7, PSPF_FORCESTYLE = 1 << 8, PSPF_MIRROR = 1 << 9, + PSPF_PLAYERTRANSLATED = 1 << 10 }; // Default psprite layers