mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-29 23:41:48 +00:00
- fixed attached dynamic light setup.
This was only run on a state change and missed every external light change. Any place which wants to flag a light change now only will set a flag and at the end of the thinker loop all flagged actors will be processed. For performance reasons this was merged with the P_RunEffects iterator loop.
This commit is contained in:
parent
6e8ee9a684
commit
ae57bc71d4
6 changed files with 29 additions and 36 deletions
|
@ -134,7 +134,6 @@ void P_Ticker (void)
|
||||||
for (auto Level : AllLevels())
|
for (auto Level : AllLevels())
|
||||||
{
|
{
|
||||||
// todo: set up a sandbox for secondary levels here.
|
// todo: set up a sandbox for secondary levels here.
|
||||||
|
|
||||||
auto it = Level->GetThinkerIterator<AActor>();
|
auto it = Level->GetThinkerIterator<AActor>();
|
||||||
AActor *ac;
|
AActor *ac;
|
||||||
|
|
||||||
|
@ -142,6 +141,7 @@ void P_Ticker (void)
|
||||||
{
|
{
|
||||||
ac->ClearInterpolation();
|
ac->ClearInterpolation();
|
||||||
}
|
}
|
||||||
|
|
||||||
P_ThinkParticles(Level); // [RH] make the particles think
|
P_ThinkParticles(Level); // [RH] make the particles think
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
@ -157,7 +157,22 @@ void P_Ticker (void)
|
||||||
if (!Level->isFrozen())
|
if (!Level->isFrozen())
|
||||||
{
|
{
|
||||||
P_UpdateSpecials(Level);
|
P_UpdateSpecials(Level);
|
||||||
P_RunEffects(Level); // [RH] Run particle effects
|
}
|
||||||
|
it = Level->GetThinkerIterator<AActor>();
|
||||||
|
|
||||||
|
// Set dynamic lights at the end of the tick, so that this catches all changes being made through the last frame.
|
||||||
|
while ((ac = it.Next()))
|
||||||
|
{
|
||||||
|
if (ac->flags8 & MF8_RECREATELIGHTS)
|
||||||
|
{
|
||||||
|
ac->flags8 &= ~MF8_RECREATELIGHTS;
|
||||||
|
ac->SetDynamicLights();
|
||||||
|
}
|
||||||
|
// This was merged from P_RunEffects to eliminate the costly duplicate ThinkerIterator loop.
|
||||||
|
if ((ac->effects || ac->fountaincolor) && !Level->isFrozen())
|
||||||
|
{
|
||||||
|
P_RunEffect(ac, ac->effects);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for par times
|
// for par times
|
||||||
|
|
|
@ -764,17 +764,11 @@ void AActor::SetDynamicLights()
|
||||||
AttachLight(count++, def);
|
AttachLight(count++, def);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LightAssociations.Size() > 0)
|
for (const auto asso : LightAssociations)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
if (asso->Sprite() == sprite && (asso->Frame() == frame || asso->Frame() == -1))
|
||||||
|
|
||||||
for (i = 0; i < LightAssociations.Size(); i++)
|
|
||||||
{
|
{
|
||||||
if (LightAssociations[i]->Sprite() == sprite &&
|
AttachLight(count++, asso->Light());
|
||||||
(LightAssociations[i]->Frame()==frame || LightAssociations[i]->Frame()==-1))
|
|
||||||
{
|
|
||||||
AttachLight(count++, LightAssociations[i]->Light());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (count == 0 && state->Light > 0)
|
if (count == 0 && state->Light > 0)
|
||||||
|
@ -850,6 +844,7 @@ int AttachLightDef(AActor *self, int _lightid, int _lightname)
|
||||||
{
|
{
|
||||||
auto userlight = self->UserLights[FindUserLight(self, lightid, true)];
|
auto userlight = self->UserLights[FindUserLight(self, lightid, true)];
|
||||||
userlight->CopyFrom(*LightDefaults[lightdef]);
|
userlight->CopyFrom(*LightDefaults[lightdef]);
|
||||||
|
self->flags8 |= MF8_RECREATELIGHTS;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -893,7 +888,7 @@ int AttachLightDirect(AActor *self, int _lightid, int type, int color, int radiu
|
||||||
{
|
{
|
||||||
userlight->UnsetSpotPitch();
|
userlight->UnsetSpotPitch();
|
||||||
}
|
}
|
||||||
|
self->flags8 |= MF8_RECREATELIGHTS;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -930,8 +925,10 @@ int RemoveLight(AActor *self, int _lightid)
|
||||||
{
|
{
|
||||||
delete self->UserLights[userlight];
|
delete self->UserLights[userlight];
|
||||||
self->UserLights.Delete(userlight);
|
self->UserLights.Delete(userlight);
|
||||||
|
self->flags8 |= MF8_RECREATELIGHTS;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION_NATIVE(AActor, A_RemoveLight, RemoveLight)
|
DEFINE_ACTION_FUNCTION_NATIVE(AActor, A_RemoveLight, RemoveLight)
|
||||||
|
|
|
@ -409,7 +409,8 @@ enum ActorFlag8
|
||||||
MF8_HITOWNER = 0x00000010, // projectile can hit the actor that fired it
|
MF8_HITOWNER = 0x00000010, // projectile can hit the actor that fired it
|
||||||
MF8_NOFRICTION = 0x00000020, // friction doesn't apply to the actor at all
|
MF8_NOFRICTION = 0x00000020, // friction doesn't apply to the actor at all
|
||||||
MF8_NOFRICTIONBOUNCE = 0x00000040, // don't bounce off walls when on icy floors
|
MF8_NOFRICTIONBOUNCE = 0x00000040, // don't bounce off walls when on icy floors
|
||||||
MF8_RETARGETAFTERSLAM = 0x00000080 // Forces jumping to the idle state after slamming into something
|
MF8_RETARGETAFTERSLAM = 0x00000080, // Forces jumping to the idle state after slamming into something
|
||||||
|
MF8_RECREATELIGHTS = 0x00000100, // Internal flag that signifies that the light attachments need to be recreated at the
|
||||||
};
|
};
|
||||||
|
|
||||||
// --- mobj.renderflags ---
|
// --- mobj.renderflags ---
|
||||||
|
|
|
@ -299,25 +299,6 @@ void P_SpawnParticle(FLevelLocals *Level, const DVector3 &pos, const DVector3 &v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// P_RunEffects
|
|
||||||
//
|
|
||||||
// Run effects on all actors in the world
|
|
||||||
//
|
|
||||||
void P_RunEffects (FLevelLocals *Level)
|
|
||||||
{
|
|
||||||
AActor *actor;
|
|
||||||
auto iterator = Level->GetThinkerIterator<AActor>();
|
|
||||||
|
|
||||||
while ( (actor = iterator.Next ()) )
|
|
||||||
{
|
|
||||||
if (actor->effects || actor->fountaincolor)
|
|
||||||
{
|
|
||||||
P_RunEffect (actor, actor->effects);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// JitterParticle
|
// JitterParticle
|
||||||
//
|
//
|
||||||
|
|
|
@ -78,7 +78,6 @@ particle_t *JitterParticle (FLevelLocals *Level, int ttl, double drift);
|
||||||
void P_ThinkParticles (FLevelLocals *Level);
|
void P_ThinkParticles (FLevelLocals *Level);
|
||||||
void P_SpawnParticle(FLevelLocals *Level, const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, double startalpha, int lifetime, double size, double fadestep, double sizestep, int flags = 0);
|
void P_SpawnParticle(FLevelLocals *Level, const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, double startalpha, int lifetime, double size, double fadestep, double sizestep, int flags = 0);
|
||||||
void P_InitEffects (void);
|
void P_InitEffects (void);
|
||||||
void P_RunEffects (FLevelLocals *Level);
|
|
||||||
|
|
||||||
void P_RunEffect (AActor *actor, int effects);
|
void P_RunEffect (AActor *actor, int effects);
|
||||||
|
|
||||||
|
|
|
@ -577,7 +577,7 @@ bool AActor::SetState (FState *newstate, bool nofunction)
|
||||||
newstate = newstate->GetNextState();
|
newstate = newstate->GetNextState();
|
||||||
} while (tics == 0);
|
} while (tics == 0);
|
||||||
|
|
||||||
SetDynamicLights();
|
flags8 |= MF8_RECREATELIGHTS;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4702,9 +4702,9 @@ void AActor::CallBeginPlay()
|
||||||
|
|
||||||
void AActor::PostBeginPlay ()
|
void AActor::PostBeginPlay ()
|
||||||
{
|
{
|
||||||
SetDynamicLights();
|
|
||||||
PrevAngles = Angles;
|
PrevAngles = Angles;
|
||||||
flags7 |= MF7_HANDLENODELAY;
|
flags7 |= MF7_HANDLENODELAY;
|
||||||
|
flags8 |= MF8_RECREATELIGHTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AActor::CallPostBeginPlay()
|
void AActor::CallPostBeginPlay()
|
||||||
|
|
Loading…
Reference in a new issue