Opaque blood decals must be defined with 'OpaqueBlood' keyword in DECALDEF

This commit is contained in:
nashmuhandes 2020-03-16 22:31:58 +08:00 committed by Christoph Oelckers
parent 8facd5f3f3
commit dd0769de80
3 changed files with 19 additions and 5 deletions

View file

@ -174,6 +174,7 @@ static const char *DecalKeywords[] =
"colors", "colors",
"animator", "animator",
"lowerdecal", "lowerdecal",
"opaqueblood",
NULL NULL
}; };
@ -194,7 +195,8 @@ enum
DECAL_SHADE, DECAL_SHADE,
DECAL_COLORS, DECAL_COLORS,
DECAL_ANIMATOR, DECAL_ANIMATOR,
DECAL_LOWERDECAL DECAL_LOWERDECAL,
DECAL_OPAQUEBLOOD,
}; };
const FDecalTemplate *FDecalBase::GetDecal () const const FDecalTemplate *FDecalBase::GetDecal () const
@ -473,6 +475,11 @@ void FDecalLib::ParseDecal (FScanner &sc)
sc.MustGetString (); sc.MustGetString ();
newdecal.LowerDecal = GetDecalByName (sc.String); newdecal.LowerDecal = GetDecalByName (sc.String);
break; break;
case DECAL_OPAQUEBLOOD:
newdecal.RenderStyle = STYLE_Normal;
newdecal.opaqueBlood = true;
break;
} }
} }
} }

View file

@ -84,6 +84,8 @@ public:
const FDecalBase *LowerDecal; const FDecalBase *LowerDecal;
enum { DECAL_RandomFlipX = 0x100, DECAL_RandomFlipY = 0x200 }; enum { DECAL_RandomFlipX = 0x100, DECAL_RandomFlipY = 0x200 };
bool opaqueBlood;
}; };
class FDecalLib class FDecalLib

View file

@ -764,10 +764,11 @@ DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const FDecalTempl
decal->SetShade (color.r, color.g, color.b); decal->SetShade (color.r, color.g, color.b);
} }
// [Nash] For compatibility reasons, only do this if the 'Shaded' keyword is omitted from the base decal. // [Nash] opaque blood
if (bloodTranslation != 0 && tpl->ShadeColor == 0) if (bloodTranslation != 0 && tpl->ShadeColor == 0 && tpl->opaqueBlood)
{ {
decal->SetTranslation(bloodTranslation); decal->SetTranslation(bloodTranslation);
decal->RenderStyle = STYLE_Normal;
} }
if (!cl_spreaddecals || !decal->PicNum.isValid()) if (!cl_spreaddecals || !decal->PicNum.isValid())
@ -803,8 +804,12 @@ DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, double ix, doubl
tpl->ApplyToDecal (decal, wall); tpl->ApplyToDecal (decal, wall);
decal->AlphaColor = AlphaColor; decal->AlphaColor = AlphaColor;
// [Nash] For compatibility reasons, only do this if the 'Shaded' keyword is omitted from the base decal. // [Nash] opaque blood
if (tpl->ShadeColor == 0) decal->SetTranslation(Translation); if (tpl->ShadeColor == 0 && tpl->opaqueBlood)
{
decal->SetTranslation(Translation);
decal->RenderStyle = STYLE_Normal;
}
decal->RenderFlags = (decal->RenderFlags & RF_DECALMASK) | decal->RenderFlags = (decal->RenderFlags & RF_DECALMASK) |
(this->RenderFlags & ~RF_DECALMASK); (this->RenderFlags & ~RF_DECALMASK);