Some more Redraw changes.

This commit is contained in:
Ottermandias 2022-03-22 16:11:35 +01:00
parent b08bf388cc
commit efc21c7882
2 changed files with 39 additions and 37 deletions

View file

@ -3,7 +3,5 @@ namespace Penumbra.GameData.Enums;
public enum RedrawType public enum RedrawType
{ {
Redraw, Redraw,
Unload,
Load,
AfterGPose, AfterGPose,
} }

View file

@ -8,16 +8,15 @@ using Penumbra.Interop.Structs;
namespace Penumbra.Interop; namespace Penumbra.Interop;
public unsafe class ObjectReloader : IDisposable public sealed unsafe class ObjectReloader : IDisposable
{ {
public const int GPosePlayerIdx = 201; public const int GPosePlayerIdx = 201;
public const int GPoseSlots = 42; public const int GPoseSlots = 42;
public const int GPoseEndIdx = GPosePlayerIdx + GPoseSlots; public const int GPoseEndIdx = GPosePlayerIdx + GPoseSlots;
private readonly List< int > _unloadedObjects = new(Dalamud.Objects.Length); private readonly List< int > _queue = new(100);
private readonly List< int > _afterGPoseObjects = new(GPoseSlots); private readonly List< int > _afterGPoseQueue = new(GPoseSlots);
private int _target = -1; private int _target = -1;
private int _waitFrame = 0;
public ObjectReloader() public ObjectReloader()
=> Dalamud.Framework.Update += OnUpdateEvent; => Dalamud.Framework.Update += OnUpdateEvent;
@ -71,15 +70,13 @@ public unsafe class ObjectReloader : IDisposable
{ {
if( actor != null ) if( actor != null )
{ {
WriteInvisible( actor );
var idx = ObjectTableIndex( actor ); var idx = ObjectTableIndex( actor );
if( actor.Address == Dalamud.Targets.Target?.Address ) if( actor.Address == Dalamud.Targets.Target?.Address )
{ {
_target = idx; _target = idx;
} }
_unloadedObjects.Add( idx ); _queue.Add( ~idx );
_waitFrame = 1;
} }
} }
@ -94,8 +91,7 @@ public unsafe class ObjectReloader : IDisposable
if( actor != null ) if( actor != null )
{ {
WriteInvisible( actor ); WriteInvisible( actor );
_afterGPoseObjects.Add( ObjectTableIndex( actor ) ); _afterGPoseQueue.Add( ~ObjectTableIndex( actor ) );
_waitFrame = 1;
} }
} }
@ -124,32 +120,52 @@ public unsafe class ObjectReloader : IDisposable
private void HandleRedraw() private void HandleRedraw()
{ {
if( _unloadedObjects.Count == 0 ) if( _queue.Count == 0 )
{ {
return; return;
} }
foreach( var idx in _unloadedObjects ) var numKept = 0;
foreach( var idx in _queue )
{ {
WriteVisible( Dalamud.Objects[ idx ] ); if( idx < 0 )
{
var newIdx = ~idx;
WriteInvisible( Dalamud.Objects[ newIdx ] );
_queue[ numKept++ ] = newIdx;
}
else
{
WriteVisible( Dalamud.Objects[ idx ] );
}
} }
_unloadedObjects.Clear(); _queue.RemoveRange( numKept, _queue.Count - numKept );
} }
private void HandleAfterGPose() private void HandleAfterGPose()
{ {
if( _afterGPoseObjects.Count == 0 || Dalamud.Objects[ GPosePlayerIdx ] != null ) if( _afterGPoseQueue.Count == 0 || Dalamud.Objects[ GPosePlayerIdx ] != null )
{ {
return; return;
} }
foreach( var idx in _afterGPoseObjects ) var numKept = 0;
foreach( var idx in _afterGPoseQueue )
{ {
WriteVisible( Dalamud.Objects[ idx ] ); if( idx < 0 )
{
var newIdx = ~idx;
WriteInvisible( Dalamud.Objects[ newIdx ] );
_afterGPoseQueue[ numKept++ ] = newIdx;
}
else
{
WriteVisible( Dalamud.Objects[ idx ] );
}
} }
_afterGPoseObjects.Clear(); _afterGPoseQueue.RemoveRange( numKept, _queue.Count - numKept );
} }
private void OnUpdateEvent( object framework ) private void OnUpdateEvent( object framework )
@ -161,12 +177,6 @@ public unsafe class ObjectReloader : IDisposable
return; return;
} }
if( _waitFrame > 0 )
{
--_waitFrame;
return;
}
HandleRedraw(); HandleRedraw();
HandleAfterGPose(); HandleAfterGPose();
HandleTarget(); HandleTarget();
@ -179,12 +189,6 @@ public unsafe class ObjectReloader : IDisposable
case RedrawType.Redraw: case RedrawType.Redraw:
ReloadActor( actor ); ReloadActor( actor );
break; break;
case RedrawType.Unload:
WriteInvisible( actor );
break;
case RedrawType.Load:
WriteVisible( actor );
break;
case RedrawType.AfterGPose: case RedrawType.AfterGPose:
ReloadActorAfterGPose( actor ); ReloadActorAfterGPose( actor );
break; break;
@ -192,13 +196,13 @@ public unsafe class ObjectReloader : IDisposable
} }
} }
private GameObject? GetLocalPlayer() private static GameObject? GetLocalPlayer()
{ {
var gPosePlayer = Dalamud.Objects[ GPosePlayerIdx ]; var gPosePlayer = Dalamud.Objects[ GPosePlayerIdx ];
return gPosePlayer ?? Dalamud.Objects[ 0 ]; return gPosePlayer ?? Dalamud.Objects[ 0 ];
} }
private bool GetName( string lowerName, out GameObject? actor ) private static bool GetName( string lowerName, out GameObject? actor )
{ {
( actor, var ret ) = lowerName switch ( actor, var ret ) = lowerName switch
{ {