From 3f0ed5d2529b7d6b4870303d28a0c8a22149b563 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 12 Apr 2016 19:44:12 +0200 Subject: [PATCH] - added a distancecheck property to AActor that allows a given CVAR to be used as maximum display distance for actors of this type. This is for WolfenDoom: BOA, which has some scripted sprite distance checks that very negatively affected performance. --- src/actor.h | 6 ++++++ src/info.h | 2 ++ src/r_things.cpp | 15 +++++++++++++-- src/thingdef/thingdef_properties.cpp | 22 ++++++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/actor.h b/src/actor.h index 539144ed9..e7fe048ef 100644 --- a/src/actor.h +++ b/src/actor.h @@ -804,6 +804,12 @@ public: return bloodcls; } + double Distance2DSquared(AActor *other, bool absolute = false) + { + DVector2 otherpos = absolute ? other->Pos() : other->PosRelative(this); + return (Pos().XY() - otherpos).LengthSquared(); + } + double Distance2D(AActor *other, bool absolute = false) { DVector2 otherpos = absolute ? other->Pos() : other->PosRelative(this); diff --git a/src/info.h b/src/info.h index decfd72df..285894dc7 100644 --- a/src/info.h +++ b/src/info.h @@ -53,6 +53,7 @@ struct Baggage; class FScanner; struct FActorInfo; class FArchive; +class FIntCVar; // Sprites that are fixed in position because they can have special meanings. enum @@ -259,6 +260,7 @@ public: DDropItem *DropItems; FString SourceLumpName; + FIntCVar *distancecheck; // Old Decorate compatibility stuff bool DontHurtShooter; diff --git a/src/r_things.cpp b/src/r_things.cpp index 2033423e8..c2fa165db 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -1246,9 +1246,20 @@ void R_AddSprites (sector_t *sec, int lightlevel, int fakeside) // Handle all things in sector. for (thing = sec->thinglist; thing; thing = thing->snext) { + FIntCVar *cvar = thing->GetClass()->distancecheck; + if (cvar != NULL && *cvar >= 0) + { + double dist = thing->Distance2DSquared(camera); + double check = (double)**cvar; + if (dist >= check * check) + { + continue; + } + } + // find fake level - for(int i = 0; i < (int)frontsector->e->XFloor.ffloors.Size(); i++) { - rover = frontsector->e->XFloor.ffloors[i]; + for(auto rover : frontsector->e->XFloor.ffloors) + { if(!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES)) continue; if(!(rover->flags & FF_SOLID) || rover->alpha != 255) continue; if(!fakefloor) diff --git a/src/thingdef/thingdef_properties.cpp b/src/thingdef/thingdef_properties.cpp index c435cd575..3ec4c624d 100644 --- a/src/thingdef/thingdef_properties.cpp +++ b/src/thingdef/thingdef_properties.cpp @@ -1523,6 +1523,28 @@ DEFINE_PROPERTY(riplevelmax, I, Actor) defaults->RipLevelMax = id; } +//========================================================================== +// +//========================================================================== +DEFINE_PROPERTY(distancecheck, S, Actor) +{ + PROP_STRING_PARM(cvar, 0); + FBaseCVar *scratch; + FBaseCVar *cv = FindCVar(cvar, &scratch); + if (cv == NULL) + { + I_Error("CVar %s not defined", cvar); + } + else if (cv->GetRealType() == CVAR_Int) + { + static_cast(info)->distancecheck = static_cast(cv); + } + else + { + I_Error("CVar %s must of type Int", cvar); + } +} + //========================================================================== // // Special inventory properties