diff --git a/Glamourer/Gui/Materials/AdvancedDyePopup.cs b/Glamourer/Gui/Materials/AdvancedDyePopup.cs index 56f4d24..2521f83 100644 --- a/Glamourer/Gui/Materials/AdvancedDyePopup.cs +++ b/Glamourer/Gui/Materials/AdvancedDyePopup.cs @@ -1,6 +1,7 @@ using Dalamud.Interface; using Dalamud.Interface.Utility; using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; +using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; using FFXIVClientStructs.Interop; using Glamourer.Designs; using Glamourer.Interop.Material; @@ -79,8 +80,7 @@ public sealed unsafe class AdvancedDyePopup( private (string Path, string GamePath) ResourceName(MaterialValueIndex index) { - var materialHandle = - _actor.Model.AsCharacterBase->Materials()[index.MaterialIndex + index.SlotIndex * MaterialService.MaterialsPerModel].Value; + var materialHandle = (MaterialResourceHandle*)_actor.Model.AsCharacterBase->MaterialsSpan[index.MaterialIndex + index.SlotIndex * MaterialService.MaterialsPerModel].Value; var model = _actor.Model.AsCharacterBase->ModelsSpan[index.SlotIndex].Value; var modelHandle = model == null ? null : model->ModelResourceHandle; var path = materialHandle == null diff --git a/Glamourer/Interop/Material/MaterialService.cs b/Glamourer/Interop/Material/MaterialService.cs index 3e972a8..5adaf4d 100644 --- a/Glamourer/Interop/Material/MaterialService.cs +++ b/Glamourer/Interop/Material/MaterialService.cs @@ -41,10 +41,10 @@ public static unsafe class MaterialService return null; var index = modelSlot * MaterialsPerModel + materialSlot; - if (index < 0 || index >= model.AsCharacterBase->ColorTableTextures().Length) + if (index < 0 || index >= model.AsCharacterBase->ColorTableTexturesSpan.Length) return null; - var texture = (Texture**)Unsafe.AsPointer(ref model.AsCharacterBase->ColorTableTextures()[index]); + var texture = (Texture**)Unsafe.AsPointer(ref model.AsCharacterBase->ColorTableTexturesSpan[index]); return texture; } @@ -59,10 +59,10 @@ public static unsafe class MaterialService return null; var index = modelSlot * MaterialsPerModel + materialSlot; - if (index < 0 || index >= model.AsCharacterBase->Materials().Length) + if (index < 0 || index >= model.AsCharacterBase->MaterialsSpan.Length) return null; - var material = model.AsCharacterBase->Materials()[index].Value; + var material = (MaterialResourceHandle*) model.AsCharacterBase->MaterialsSpan[index].Value; if (material == null || material->ColorTable == null) return null; diff --git a/Glamourer/Interop/Material/MaterialValueIndex.cs b/Glamourer/Interop/Material/MaterialValueIndex.cs index 5c44e21..5104713 100644 --- a/Glamourer/Interop/Material/MaterialValueIndex.cs +++ b/Glamourer/Interop/Material/MaterialValueIndex.cs @@ -1,6 +1,4 @@ using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; -using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; -using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; using FFXIVClientStructs.Interop; using Newtonsoft.Json; using Penumbra.GameData.Enums; @@ -81,13 +79,13 @@ public readonly record struct MaterialValueIndex( { if (!TryGetModel(actor, out var model) || SlotIndex >= model.AsCharacterBase->SlotCount - || model.AsCharacterBase->ColorTableTextures().Length < (SlotIndex + 1) * MaterialService.MaterialsPerModel) + || model.AsCharacterBase->ColorTableTexturesSpan.Length < (SlotIndex + 1) * MaterialService.MaterialsPerModel) { textures = []; return false; } - textures = model.AsCharacterBase->ColorTableTextures().Slice(SlotIndex * MaterialService.MaterialsPerModel, + textures = model.AsCharacterBase->ColorTableTexturesSpan.Slice(SlotIndex * MaterialService.MaterialsPerModel, MaterialService.MaterialsPerModel); return true; } @@ -192,14 +190,4 @@ public readonly record struct MaterialValueIndex( JsonSerializer serializer) => FromKey(serializer.Deserialize(reader), out var value) ? value : throw new Exception($"Invalid material key {value.Key}."); } -} - -// TODO Remove when fixed in CS. -public static class ColorTableExtension -{ - public static unsafe Span> Materials(this ref CharacterBase character) - => new(character.Materials, character.SlotCount * MaterialService.MaterialsPerModel); - - public static unsafe Span> ColorTableTextures(this ref CharacterBase character) - => new(character.ColorTableTextures, character.SlotCount * MaterialService.MaterialsPerModel); -} +} \ No newline at end of file