- reworked spot lights to receive all relevant information through the args.

As a bonus, arg0str can now be used for all dynamic lights to pass a color in textual form, including X11R6RGB-names.
This commit is contained in:
Christoph Oelckers 2018-01-20 22:41:28 +01:00
parent dbf0a68b02
commit 6aaf5df617
4 changed files with 20 additions and 14 deletions

View file

@ -372,8 +372,7 @@ struct FMapThing
uint32_t RenderStyle;
int FloatbobPhase;
int friendlyseeblocks;
double SpotInnerAngle = 10;
double SpotOuterAngle = 25;
FString arg0str;
};

View file

@ -503,8 +503,6 @@ xx(Scale)
xx(ScaleX)
xx(ScaleY)
xx(FriendlySeeBlocks)
xx(SpotInnerAngle)
xx(SpotOuterAngle)
xx(Floatbobphase)
xx(Floatbobstrength)
xx(Target)

View file

@ -6094,10 +6094,26 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position)
mobj->fillcolor = (mthing->fillcolor & 0xffffff) | (ColorMatcher.Pick((mthing->fillcolor & 0xff0000) >> 16,
(mthing->fillcolor & 0xff00) >> 8, (mthing->fillcolor & 0xff)) << 24);
// allow color strings for lights and reshuffle the args for spot lights
if (i->IsDescendantOf(RUNTIME_CLASS(ADynamicLight)))
{
((ADynamicLight*)mobj)->SpotInnerAngle = mthing->SpotInnerAngle;
((ADynamicLight*)mobj)->SpotOuterAngle = mthing->SpotOuterAngle;
auto light = static_cast<ADynamicLight*>(mobj);
if (mthing->arg0str.IsNotEmpty())
{
PalEntry color = V_GetColor(nullptr, mthing->arg0str);
}
else if (light->lightflags & LF_SPOT)
{
light->args[0] = RPART(mthing->args[0]);
light->args[1] = GPART(mthing->args[0]);
light->args[2] = BPART(mthing->args[0]);
}
if (light->lightflags & LF_SPOT)
{
light->SpotInnerAngle = double(mthing->args[1]);
light->SpotOuterAngle = double(mthing->args[2]);
}
}
mobj->CallBeginPlay ();

View file

@ -604,6 +604,7 @@ public:
case NAME_Arg0Str:
CHECK_N(Zd);
arg0str = CheckString(key);
th->arg0str = arg0str;
break;
case NAME_Arg1Str:
@ -799,14 +800,6 @@ public:
th->Scale.X = th->Scale.Y = CheckFloat(key);
break;
case NAME_SpotInnerAngle:
th->SpotInnerAngle = CheckFloat(key);
break;
case NAME_SpotOuterAngle:
th->SpotOuterAngle = CheckFloat(key);
break;
case NAME_FriendlySeeBlocks:
CHECK_N(Zd | Zdt)
th->friendlyseeblocks = CheckInt(key);