HUD tracking: refactor visibility checks

- Completely invisible trackers should not appear in
  tracker list, because they would occlude
- Add Visibility::kFlicker, so frame check is not
  duplicated
This commit is contained in:
James R 2024-01-06 01:09:31 -08:00
parent e58253a2b2
commit 2188338a7e

View file

@ -33,9 +33,9 @@ namespace
enum class Visibility enum class Visibility
{ {
kHidden,
kVisible, kVisible,
kTransparent, kTransparent,
kFlicker,
}; };
struct TargetTracking struct TargetTracking
@ -283,28 +283,26 @@ bool is_object_tracking_target(const mobj_t* mobj)
return Obj_IsSuperFlickyTargettingYou(mobj, stplyr->mo); return Obj_IsSuperFlickyTargettingYou(mobj, stplyr->mo);
case MT_SPRAYCAN: case MT_SPRAYCAN:
return !(mobj->renderflags & (RF_TRANSMASK | RF_DONTDRAW)); // the spraycan wasn't collected yet return !(mobj->renderflags & (RF_TRANSMASK | RF_DONTDRAW)) && // the spraycan wasn't collected yet
P_CheckSight(stplyr->mo, const_cast<mobj_t*>(mobj));
default: default:
return false; return false;
} }
} }
Visibility is_object_visible(mobj_t* mobj) Visibility is_object_visible(const mobj_t* mobj)
{ {
switch (mobj->type) switch (mobj->type)
{ {
case MT_SPRAYCAN:
case MT_SUPER_FLICKY: case MT_SUPER_FLICKY:
// Always flickers. // Always flickers.
return (leveltime & 1) ? Visibility::kVisible : Visibility::kHidden; return Visibility::kFlicker;
case MT_SPRAYCAN:
// Flickers, but only when visible.
return P_CheckSight(stplyr->mo, mobj) && (leveltime & 1) ? Visibility::kVisible : Visibility::kHidden;
default: default:
// Transparent when not visible. // Transparent when not visible.
return P_CheckSight(stplyr->mo, mobj) ? Visibility::kVisible : Visibility::kTransparent; return P_CheckSight(stplyr->mo, const_cast<mobj_t*>(mobj)) ? Visibility::kVisible : Visibility::kTransparent;
} }
} }
@ -312,7 +310,7 @@ void K_DrawTargetTracking(const TargetTracking& target)
{ {
Visibility visibility = is_object_visible(target.mobj); Visibility visibility = is_object_visible(target.mobj);
if (visibility == Visibility::kHidden) if (visibility == Visibility::kFlicker && (leveltime & 1))
{ {
return; return;
} }