mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-02-21 11:21:04 +00:00
- Add A_OverlayTranslation to set PSprite translations (#1202)
- Added PSPF_PLAYERTRANSLATED support to the software renderer
This commit is contained in:
parent
7da9f33cf9
commit
7bea14e6b2
8 changed files with 55 additions and 12 deletions
|
@ -134,6 +134,7 @@ DEFINE_FIELD(DPSprite, oldx)
|
||||||
DEFINE_FIELD(DPSprite, oldy)
|
DEFINE_FIELD(DPSprite, oldy)
|
||||||
DEFINE_FIELD(DPSprite, firstTic)
|
DEFINE_FIELD(DPSprite, firstTic)
|
||||||
DEFINE_FIELD(DPSprite, Tics)
|
DEFINE_FIELD(DPSprite, Tics)
|
||||||
|
DEFINE_FIELD(DPSprite, Translation)
|
||||||
DEFINE_FIELD(DPSprite, alpha)
|
DEFINE_FIELD(DPSprite, alpha)
|
||||||
DEFINE_FIELD_BIT(DPSprite, Flags, bAddWeapon, PSPF_ADDWEAPON)
|
DEFINE_FIELD_BIT(DPSprite, Flags, bAddWeapon, PSPF_ADDWEAPON)
|
||||||
DEFINE_FIELD_BIT(DPSprite, Flags, bAddBob, PSPF_ADDBOB)
|
DEFINE_FIELD_BIT(DPSprite, Flags, bAddBob, PSPF_ADDBOB)
|
||||||
|
@ -154,6 +155,7 @@ DPSprite::DPSprite(player_t *owner, AActor *caller, int id)
|
||||||
oldx(.0), oldy(.0),
|
oldx(.0), oldy(.0),
|
||||||
firstTic(true),
|
firstTic(true),
|
||||||
Tics(0),
|
Tics(0),
|
||||||
|
Translation(0),
|
||||||
Flags(0),
|
Flags(0),
|
||||||
Caller(caller),
|
Caller(caller),
|
||||||
Owner(owner),
|
Owner(owner),
|
||||||
|
@ -742,6 +744,30 @@ DEFINE_ACTION_FUNCTION(AActor, A_OverlayFlags)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// PROC A_OverlayTranslation
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION(AActor, A_OverlayTranslation)
|
||||||
|
{
|
||||||
|
PARAM_ACTION_PROLOGUE(AActor);
|
||||||
|
PARAM_INT(layer);
|
||||||
|
PARAM_UINT(trans);
|
||||||
|
|
||||||
|
if (!ACTION_CALL_FROM_PSPRITE())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DPSprite* pspr = self->player->FindPSprite(((layer != 0) ? layer : stateinfo->mPSPIndex));
|
||||||
|
if (pspr != nullptr)
|
||||||
|
{
|
||||||
|
pspr->Translation = trans;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC OverlayX/Y
|
// PROC OverlayX/Y
|
||||||
|
@ -1017,6 +1043,7 @@ void DPSprite::Serialize(FSerializer &arc)
|
||||||
("flags", Flags)
|
("flags", Flags)
|
||||||
("state", State)
|
("state", State)
|
||||||
("tics", Tics)
|
("tics", Tics)
|
||||||
|
("translation", Translation)
|
||||||
.Sprite("sprite", Sprite, nullptr)
|
.Sprite("sprite", Sprite, nullptr)
|
||||||
("frame", Frame)
|
("frame", Frame)
|
||||||
("id", ID)
|
("id", ID)
|
||||||
|
|
|
@ -83,15 +83,16 @@ public:
|
||||||
static void NewTick();
|
static void NewTick();
|
||||||
void SetState(FState *newstate, bool pending = false);
|
void SetState(FState *newstate, bool pending = false);
|
||||||
|
|
||||||
int GetID() const { return ID; }
|
int GetID() const { return ID; }
|
||||||
int GetSprite() const { return Sprite; }
|
int GetSprite() const { return Sprite; }
|
||||||
int GetFrame() const { return Frame; }
|
int GetFrame() const { return Frame; }
|
||||||
int GetTics() const { return Tics; }
|
int GetTics() const { return Tics; }
|
||||||
FState* GetState() const { return State; }
|
uint32_t GetTranslation() { return Translation; }
|
||||||
DPSprite* GetNext() { return Next; }
|
FState* GetState() const { return State; }
|
||||||
AActor* GetCaller() { return Caller; }
|
DPSprite* GetNext() { return Next; }
|
||||||
void SetCaller(AActor *newcaller) { Caller = newcaller; }
|
AActor* GetCaller() { return Caller; }
|
||||||
void ResetInterpolation() { oldx = x; oldy = y; }
|
void SetCaller(AActor *newcaller) { Caller = newcaller; }
|
||||||
|
void ResetInterpolation() { oldx = x; oldy = y; }
|
||||||
void OnDestroy() override;
|
void OnDestroy() override;
|
||||||
std::pair<FRenderStyle, float> GetRenderStyle(FRenderStyle ownerstyle, double owneralpha);
|
std::pair<FRenderStyle, float> GetRenderStyle(FRenderStyle ownerstyle, double owneralpha);
|
||||||
float GetYAdjust(bool fullscreen);
|
float GetYAdjust(bool fullscreen);
|
||||||
|
@ -100,6 +101,7 @@ public:
|
||||||
double oldx, oldy;
|
double oldx, oldy;
|
||||||
bool firstTic;
|
bool firstTic;
|
||||||
int Tics;
|
int Tics;
|
||||||
|
uint32_t Translation;
|
||||||
int Flags;
|
int Flags;
|
||||||
FRenderStyle Renderstyle;
|
FRenderStyle Renderstyle;
|
||||||
|
|
||||||
|
|
|
@ -214,7 +214,9 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, float ofsX, float o
|
||||||
float orientation = smf->xscale * smf->yscale * smf->zscale;
|
float orientation = smf->xscale * smf->yscale * smf->zscale;
|
||||||
|
|
||||||
renderer->BeginDrawHUDModel(playermo->RenderStyle, objectToWorldMatrix, orientation < 0);
|
renderer->BeginDrawHUDModel(playermo->RenderStyle, objectToWorldMatrix, orientation < 0);
|
||||||
RenderFrameModels(renderer, playermo->Level, smf, psp->GetState(), psp->GetTics(), playermo->player->ReadyWeapon->GetClass(), psp->Flags & PSPF_PLAYERTRANSLATED ? psp->Owner->mo->Translation : 0);
|
uint32_t trans = psp->GetTranslation() != 0 ? psp->GetTranslation() : 0;
|
||||||
|
if ((psp->Flags & PSPF_PLAYERTRANSLATED)) trans = psp->Owner->mo->Translation;
|
||||||
|
RenderFrameModels(renderer, playermo->Level, smf, psp->GetState(), psp->GetTics(), playermo->player->ReadyWeapon->GetClass(), trans);
|
||||||
renderer->EndDrawHUDModel(playermo->RenderStyle);
|
renderer->EndDrawHUDModel(playermo->RenderStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,9 @@ void HWDrawInfo::DrawPSprite(HUDSprite *huds, FRenderState &state)
|
||||||
{
|
{
|
||||||
float thresh = (huds->texture->GetTranslucency() || huds->OverrideShader != -1) ? 0.f : gl_mask_sprite_threshold;
|
float thresh = (huds->texture->GetTranslucency() || huds->OverrideShader != -1) ? 0.f : gl_mask_sprite_threshold;
|
||||||
state.AlphaFunc(Alpha_GEqual, thresh);
|
state.AlphaFunc(Alpha_GEqual, thresh);
|
||||||
state.SetMaterial(huds->texture, UF_Sprite, CTF_Expand, CLAMP_XY_NOMIP, (huds->weapon->Flags & PSPF_PLAYERTRANSLATED) ? huds->owner->Translation : 0, huds->OverrideShader);
|
uint32_t trans = huds->weapon->GetTranslation() != 0 ? huds->weapon->GetTranslation() : 0;
|
||||||
|
if ((huds->weapon->Flags & PSPF_PLAYERTRANSLATED)) trans = huds->owner->Translation;
|
||||||
|
state.SetMaterial(huds->texture, UF_Sprite, CTF_Expand, CLAMP_XY_NOMIP, trans, huds->OverrideShader);
|
||||||
state.Draw(DT_TriangleStrip, huds->mx, 4);
|
state.Draw(DT_TriangleStrip, huds->mx, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -141,7 +141,9 @@ namespace swrenderer
|
||||||
ThingColor.a = 255;
|
ThingColor.a = 255;
|
||||||
|
|
||||||
renderer.fillcolor = fullbrightSprite ? ThingColor : ThingColor.Modulate(playermo->Sector->SpecialColors[sector_t::sprites]);
|
renderer.fillcolor = fullbrightSprite ? ThingColor : ThingColor.Modulate(playermo->Sector->SpecialColors[sector_t::sprites]);
|
||||||
renderer.Translation = 0xffffffff;// playermo->Translation;
|
uint32_t trans = psp->GetTranslation() != 0 ? psp->GetTranslation() : 0;
|
||||||
|
if ((psp->Flags & PSPF_PLAYERTRANSLATED)) trans = playermo->Translation;
|
||||||
|
renderer.Translation = trans;
|
||||||
|
|
||||||
RenderHUDModel(&renderer, psp, ofsx, ofsy);
|
RenderHUDModel(&renderer, psp, ofsx, ofsy);
|
||||||
PolyTriangleDrawer::SetModelVertexShader(thread->DrawQueue, -1, -1, 0.0f);
|
PolyTriangleDrawer::SetModelVertexShader(thread->DrawQueue, -1, -1, 0.0f);
|
||||||
|
|
|
@ -313,6 +313,10 @@ namespace swrenderer
|
||||||
vis.yscale = float(pspriteyscale / stex->GetScale().Y);
|
vis.yscale = float(pspriteyscale / stex->GetScale().Y);
|
||||||
vis.pic = stex;
|
vis.pic = stex;
|
||||||
|
|
||||||
|
uint32_t trans = pspr->GetTranslation() != 0 ? pspr->GetTranslation() : 0;
|
||||||
|
if ((pspr->Flags & PSPF_PLAYERTRANSLATED)) trans = owner->Translation;
|
||||||
|
vis.Translation = trans;
|
||||||
|
|
||||||
// If flip is used, provided that it's not already flipped (that would just invert itself)
|
// If flip is used, provided that it's not already flipped (that would just invert itself)
|
||||||
// (It's an XOR...)
|
// (It's an XOR...)
|
||||||
if (!(flip) != !(pspr->Flags & PSPF_FLIP))
|
if (!(flip) != !(pspr->Flags & PSPF_FLIP))
|
||||||
|
@ -434,6 +438,8 @@ namespace swrenderer
|
||||||
accelSprite.x1 = x1;
|
accelSprite.x1 = x1;
|
||||||
accelSprite.flip = vis.xiscale < 0;
|
accelSprite.flip = vis.xiscale < 0;
|
||||||
|
|
||||||
|
accelSprite.Translation = trans;
|
||||||
|
|
||||||
if (vis.Light.BaseColormap >= &SpecialSWColormaps[0] &&
|
if (vis.Light.BaseColormap >= &SpecialSWColormaps[0] &&
|
||||||
vis.Light.BaseColormap < &SpecialSWColormaps[SpecialColormaps.Size()])
|
vis.Light.BaseColormap < &SpecialSWColormaps[SpecialColormaps.Size()])
|
||||||
{
|
{
|
||||||
|
|
|
@ -1185,6 +1185,7 @@ class Actor : Thinker native
|
||||||
action native void A_OverlayFlags(int layer, int flags, bool set);
|
action native void A_OverlayFlags(int layer, int flags, bool set);
|
||||||
action native void A_OverlayAlpha(int layer, double alph);
|
action native void A_OverlayAlpha(int layer, double alph);
|
||||||
action native void A_OverlayRenderStyle(int layer, int style);
|
action native void A_OverlayRenderStyle(int layer, int style);
|
||||||
|
action native void A_OverlayTranslation(int layer, int trans);
|
||||||
|
|
||||||
native bool A_AttachLightDef(Name lightid, Name lightdef);
|
native bool A_AttachLightDef(Name lightid, Name lightdef);
|
||||||
native bool A_AttachLight(Name lightid, int type, Color lightcolor, int radius1, int radius2, int flags = 0, Vector3 ofs = (0,0,0), double param = 0, double spoti = 10, double spoto = 25, double spotp = 0);
|
native bool A_AttachLight(Name lightid, int type, Color lightcolor, int radius1, int radius2, int flags = 0, Vector3 ofs = (0,0,0), double param = 0, double spoti = 10, double spoto = 25, double spotp = 0);
|
||||||
|
|
|
@ -2560,6 +2560,7 @@ class PSprite : Object native play
|
||||||
native double alpha;
|
native double alpha;
|
||||||
native Bool firstTic;
|
native Bool firstTic;
|
||||||
native int Tics;
|
native int Tics;
|
||||||
|
native uint Translation;
|
||||||
native bool bAddWeapon;
|
native bool bAddWeapon;
|
||||||
native bool bAddBob;
|
native bool bAddBob;
|
||||||
native bool bPowDouble;
|
native bool bPowDouble;
|
||||||
|
|
Loading…
Reference in a new issue