Test improving object manager.

This commit is contained in:
Ottermandias 2024-03-21 23:02:07 +01:00
parent cc88738e3e
commit 1a9239a358
8 changed files with 17 additions and 18 deletions

@ -1 +1 @@
Subproject commit 529e18115023732794994bfb8df4818b68951ea4 Subproject commit 9a1e5e7294a6929ee1cc72b1b5d76e12c000c327

View file

@ -442,8 +442,8 @@ public class IpcTester : IDisposable
DrawIntro(Ipc.RedrawObjectByIndex.Label, "Redraw by Index"); DrawIntro(Ipc.RedrawObjectByIndex.Label, "Redraw by Index");
var tmp = _redrawIndex; var tmp = _redrawIndex;
ImGui.SetNextItemWidth(100 * UiHelpers.Scale); ImGui.SetNextItemWidth(100 * UiHelpers.Scale);
if (ImGui.DragInt("##redrawIndex", ref tmp, 0.1f, 0, _objects.Count)) if (ImGui.DragInt("##redrawIndex", ref tmp, 0.1f, 0, _objects.TotalCount))
_redrawIndex = Math.Clamp(tmp, 0, _objects.Count); _redrawIndex = Math.Clamp(tmp, 0, _objects.TotalCount);
ImGui.SameLine(); ImGui.SameLine();
if (ImGui.Button("Redraw##Index")) if (ImGui.Button("Redraw##Index"))
@ -460,7 +460,7 @@ public class IpcTester : IDisposable
private void SetLastRedrawn(IntPtr address, int index) private void SetLastRedrawn(IntPtr address, int index)
{ {
if (index < 0 if (index < 0
|| index > _objects.Count || index > _objects.TotalCount
|| address == IntPtr.Zero || address == IntPtr.Zero
|| _objects[index].Address != address) || _objects[index].Address != address)
_lastRedrawnString = "Invalid"; _lastRedrawnString = "Invalid";

View file

@ -929,7 +929,7 @@ public class PenumbraApi : IDisposable, IPenumbraApi
{ {
CheckInitialized(); CheckInitialized();
if (actorIndex < 0 || actorIndex >= _objects.Count) if (actorIndex < 0 || actorIndex >= _objects.TotalCount)
return PenumbraApiEc.InvalidArgument; return PenumbraApiEc.InvalidArgument;
var identifier = _actors.FromObject(_objects[actorIndex], out _, false, false, true); var identifier = _actors.FromObject(_objects[actorIndex], out _, false, false, true);
@ -1166,7 +1166,7 @@ public class PenumbraApi : IDisposable, IPenumbraApi
private unsafe bool AssociatedCollection(int gameObjectIdx, out ModCollection collection) private unsafe bool AssociatedCollection(int gameObjectIdx, out ModCollection collection)
{ {
collection = _collectionManager.Active.Default; collection = _collectionManager.Active.Default;
if (gameObjectIdx < 0 || gameObjectIdx >= _objects.Count) if (gameObjectIdx < 0 || gameObjectIdx >= _objects.TotalCount)
return false; return false;
var ptr = _objects[gameObjectIdx]; var ptr = _objects[gameObjectIdx];
@ -1180,7 +1180,7 @@ public class PenumbraApi : IDisposable, IPenumbraApi
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
private unsafe ActorIdentifier AssociatedIdentifier(int gameObjectIdx) private unsafe ActorIdentifier AssociatedIdentifier(int gameObjectIdx)
{ {
if (gameObjectIdx < 0 || gameObjectIdx >= _objects.Count) if (gameObjectIdx < 0 || gameObjectIdx >= _objects.TotalCount)
return ActorIdentifier.Invalid; return ActorIdentifier.Invalid;
var ptr = _objects[gameObjectIdx]; var ptr = _objects[gameObjectIdx];

View file

@ -64,7 +64,7 @@ public sealed unsafe class LoadTimelineResources : FastHook<LoadTimelineResource
{ {
var getGameObjectIdx = ((delegate* unmanaged<nint, int>**)timeline)[0][Offsets.GetGameObjectIdxVfunc]; var getGameObjectIdx = ((delegate* unmanaged<nint, int>**)timeline)[0][Offsets.GetGameObjectIdxVfunc];
var idx = getGameObjectIdx(timeline); var idx = getGameObjectIdx(timeline);
if (idx >= 0 && idx < objects.Count) if (idx >= 0 && idx < objects.TotalCount)
{ {
var obj = objects[idx]; var obj = objects[idx];
return obj.Valid ? resolver.IdentifyCollection(obj.AsObject, true) : ResolveData.Invalid; return obj.Valid ? resolver.IdentifyCollection(obj.AsObject, true) : ResolveData.Invalid;

View file

@ -35,7 +35,7 @@ public sealed unsafe class SomePapLoad : FastHook<SomePapLoad.Delegate>
if (timelinePtr != nint.Zero) if (timelinePtr != nint.Zero)
{ {
var actorIdx = (int)(*(*(ulong**)timelinePtr + 1) >> 3); var actorIdx = (int)(*(*(ulong**)timelinePtr + 1) >> 3);
if (actorIdx >= 0 && actorIdx < _objects.Count) if (actorIdx >= 0 && actorIdx < _objects.TotalCount)
{ {
var newData = _collectionResolver.IdentifyCollection(_objects[actorIdx].AsObject, true); var newData = _collectionResolver.IdentifyCollection(_objects[actorIdx].AsObject, true);
var last = _state.SetAnimationData(newData); var last = _state.SetAnimationData(newData);

View file

@ -94,11 +94,10 @@ public sealed class DrawObjectState : IDisposable, IReadOnlyDictionary<nint, (ni
/// </summary> /// </summary>
private unsafe void InitializeDrawObjects() private unsafe void InitializeDrawObjects()
{ {
for (var i = 0; i < _objects.Count; ++i) foreach(var actor in _objects)
{ {
var ptr = _objects[i]; if (actor is { IsCharacter: true, Model.Valid: true })
if (ptr is { IsCharacter: true, Model.Valid: true }) IterateDrawObjectTree((Object*)actor.Model.Address, actor, false, false);
IterateDrawObjectTree((Object*)ptr.Model.Address, ptr, false, false);
} }
} }

View file

@ -388,7 +388,7 @@ public sealed unsafe partial class RedrawService : IDisposable
public void RedrawObject(int tableIndex, RedrawType settings) public void RedrawObject(int tableIndex, RedrawType settings)
{ {
if (tableIndex >= 0 && tableIndex < _objects.Count) if (tableIndex >= 0 && tableIndex < _objects.TotalCount)
RedrawObject(_objects.GetDalamudObject(tableIndex), settings); RedrawObject(_objects.GetDalamudObject(tableIndex), settings);
} }

View file

@ -431,16 +431,16 @@ public class DebugTab : Window, ITab
DrawSpecial("Current Card", _actors.GetCardPlayer()); DrawSpecial("Current Card", _actors.GetCardPlayer());
DrawSpecial("Current Glamour", _actors.GetGlamourPlayer()); DrawSpecial("Current Glamour", _actors.GetGlamourPlayer());
foreach (var obj in _objects.Objects) foreach (var obj in _objects)
{ {
ImGuiUtil.DrawTableColumn($"{((GameObject*)obj.Address)->ObjectIndex}"); ImGuiUtil.DrawTableColumn($"{((GameObject*)obj.Address)->ObjectIndex}");
ImGuiUtil.DrawTableColumn($"0x{obj.Address:X}"); ImGuiUtil.DrawTableColumn($"0x{obj.Address:X}");
ImGuiUtil.DrawTableColumn(obj.Address == nint.Zero ImGuiUtil.DrawTableColumn(obj.Address == nint.Zero
? string.Empty ? string.Empty
: $"0x{(nint)((Character*)obj.Address)->GameObject.GetDrawObject():X}"); : $"0x{(nint)((Character*)obj.Address)->GameObject.GetDrawObject():X}");
var identifier = _actors.FromObject(obj, false, true, false); var identifier = _actors.FromObject(obj, out _, false, true, false);
ImGuiUtil.DrawTableColumn(_actors.ToString(identifier)); ImGuiUtil.DrawTableColumn(_actors.ToString(identifier));
var id = obj.ObjectKind == ObjectKind.BattleNpc ? $"{identifier.DataId} | {obj.DataId}" : identifier.DataId.ToString(); var id = obj.AsObject->ObjectKind ==(byte) ObjectKind.BattleNpc ? $"{identifier.DataId} | {obj.AsObject->DataID}" : identifier.DataId.ToString();
ImGuiUtil.DrawTableColumn(id); ImGuiUtil.DrawTableColumn(id);
} }