Replace usage of ThinkerIterator and BlockThingsIterator in various places where we can instead loop through sector thing lists.
While in the latter case this may result in longer loops, it also reduces GC thrashing by not needing to allocate an iterator every time. This also simplifies the DoBlast code as there is no longer a need to manually traverse portals vertically.
This commit is contained in:
parent
ea86ab99d0
commit
2bd1cb0657
17 changed files with 113 additions and 220 deletions
|
|
@ -3,7 +3,6 @@
|
|||
extend Class SWWMHandler
|
||||
{
|
||||
ui SWWMProjectionData projdata;
|
||||
transient ui ThinkerIterator dbgti;
|
||||
|
||||
private ui void DrawWorldLine( RenderEvent e, Vector3 apos, Vector3 bpos, Color col )
|
||||
{
|
||||
|
|
@ -103,10 +102,7 @@ extend Class SWWMHandler
|
|||
if ( !swwm_debugview ) return;
|
||||
// prepare projection data, we're going to need this
|
||||
SWWMUtility.PrepareProjData(projdata,e.ViewPos,e.ViewAngle,e.ViewPitch,e.ViewRoll,players[consoleplayer].fov);
|
||||
if ( !dbgti ) dbgti = ThinkerIterator.Create("Actor");
|
||||
else dbgti.Reinit();
|
||||
Actor a;
|
||||
while ( a = Actor(dbgti.Next()) )
|
||||
foreach ( s:level.Sectors ) for ( Actor a=s.thinglist; a; a=a.snext )
|
||||
{
|
||||
if ( (a == players[consoleplayer].Camera) && !(players[consoleplayer].cheats&CF_CHASECAM) ) continue;
|
||||
if ( a.bINVISIBLE && !(a is 'DynamicLight') ) continue;
|
||||
|
|
|
|||
|
|
@ -178,14 +178,18 @@ extend Class SWWMHandler
|
|||
// copies the floatbob of overlapping identical items, so it doesn't look weird
|
||||
private void CopyFloatBob( Actor a )
|
||||
{
|
||||
let bt = BlockThingsIterator.Create(a,16);
|
||||
while ( bt.Next() )
|
||||
bool breakout = false;
|
||||
foreach ( s:level.Sectors )
|
||||
{
|
||||
let t = bt.Thing;
|
||||
if ( !t || (t == a) || !(t is 'Inventory') || !(t.spawnpoint ~== a.spawnpoint) ) continue;
|
||||
a.floatbobphase = t.floatbobphase;
|
||||
a.angle = t.angle; // also copy angle
|
||||
break;
|
||||
for ( Actor t=s.thinglist; t; t=t.snext )
|
||||
{
|
||||
if ( (t == a) || !(t is 'Inventory') || !(t.spawnpoint ~== a.spawnpoint) ) continue;
|
||||
a.floatbobphase = t.floatbobphase;
|
||||
a.angle = t.angle; // also copy angle
|
||||
breakout = true;
|
||||
break;
|
||||
}
|
||||
if ( breakout ) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -98,11 +98,9 @@ extend Class SWWMHandler
|
|||
}
|
||||
bool enteredcombat = false;
|
||||
// add new entries
|
||||
if ( !cti ) cti = ThinkerIterator.Create("Actor");
|
||||
else cti.Reinit();
|
||||
Actor a, keyactor = null;
|
||||
bool bossfound = false;
|
||||
while ( a = Actor(cti.Next()) )
|
||||
// we can use this instead of a thinker iterator as only actors that EXIST physically could count as combatants
|
||||
foreach ( s:level.Sectors ) for ( Actor a=s.thinglist; a; a=a.snext )
|
||||
{
|
||||
if ( !a.player && !a.bISMONSTER ) continue;
|
||||
// ignore the dead
|
||||
|
|
@ -206,12 +204,12 @@ extend Class SWWMHandler
|
|||
}
|
||||
mapclearagain++;
|
||||
if ( !iwantdie ) return;
|
||||
let ti = ThinkerIterator.Create("SWWMStats",Thinker.STAT_STATIC);
|
||||
SWWMStats s;
|
||||
while ( s = SWWMStats(ti.Next()) )
|
||||
for ( int i=0; i<MAXPLAYERS; i++ )
|
||||
{
|
||||
if ( s.deaths > 0 )
|
||||
return;
|
||||
if ( !playeringame[i] ) continue;
|
||||
let demo = Demolitionist(players[i].mo);
|
||||
if ( !demo || !demo.mystats ) continue;
|
||||
if ( demo.mystats.deaths > 0 ) return;
|
||||
}
|
||||
SWWMUtility.MarkAchievement("wantdie",players[consoleplayer]);
|
||||
}
|
||||
|
|
@ -279,11 +277,9 @@ extend Class SWWMHandler
|
|||
}
|
||||
// update trackers for anything around the player
|
||||
double viewdist = SWWMStatusBar.MAPVIEWDIST*swwm_mm_zoom;
|
||||
BlockThingsIterator bt = BlockThingsIterator.Create(players[consoleplayer].Camera,viewdist);
|
||||
while ( bt.Next() )
|
||||
// still about as expensive as using a BlockThingsIterator, but without the need to allocate one every tic
|
||||
foreach ( s:level.Sectors ) for ( Actor a=s.thinglist; a; a=a.snext )
|
||||
{
|
||||
let a = bt.Thing;
|
||||
if ( !a ) continue;
|
||||
Vector2 rv = a.pos.xy-players[consoleplayer].Camera.pos.xy;
|
||||
if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > viewdist )
|
||||
continue;
|
||||
|
|
@ -325,19 +321,15 @@ extend Class SWWMHandler
|
|||
continue;
|
||||
SWWMSimpleTracker.Track(self,a);
|
||||
}
|
||||
bt.Destroy();
|
||||
// oh boy here we go
|
||||
int thisgroup = players[consoleplayer].Camera.CurSector.portalgroup;
|
||||
for ( int i=0; i<level.GetPortalGroupCount(); i++ )
|
||||
{
|
||||
if ( i == thisgroup ) continue;
|
||||
Vector2 relpos = players[consoleplayer].Camera.pos.xy+level.GetDisplacement(thisgroup,i);
|
||||
if ( bt ) bt.Destroy();
|
||||
bt = BlockThingsIterator.CreateFromPos(relpos.x,relpos.y,players[consoleplayer].Camera.pos.z,players[consoleplayer].Camera.pos.z+players[consoleplayer].Camera.height,viewdist,false);
|
||||
while ( bt.Next() )
|
||||
// still about as expensive as using a BlockThingsIterator, but without the need to allocate one every tic
|
||||
foreach ( s:level.Sectors ) for ( Actor a=s.thinglist; a; a=a.snext )
|
||||
{
|
||||
let a = bt.Thing;
|
||||
if ( !a ) continue;
|
||||
Vector2 rv = a.pos.xy-relpos;
|
||||
if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > viewdist )
|
||||
continue;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue