This commit is contained in:
Ottermandias 2025-03-27 18:11:08 +01:00
parent 18ff905746
commit 22babad789
18 changed files with 160 additions and 111 deletions

View file

@ -15,7 +15,7 @@ jobs:
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@v1 uses: actions/setup-dotnet@v1
with: with:
dotnet-version: '8.x.x' dotnet-version: '9.x.x'
- name: Restore dependencies - name: Restore dependencies
run: dotnet restore run: dotnet restore
- name: Download Dalamud - name: Download Dalamud

View file

@ -15,7 +15,7 @@ jobs:
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@v1 uses: actions/setup-dotnet@v1
with: with:
dotnet-version: '8.x.x' dotnet-version: '9.x.x'
- name: Restore dependencies - name: Restore dependencies
run: dotnet restore run: dotnet restore
- name: Download Dalamud - name: Download Dalamud

@ -1 +1 @@
Subproject commit 9f9bdf0873899d2e45fabaca446bb1624303b418 Subproject commit 5e5c867a095eecac0dd494b30a33298a65e46426

View file

@ -29,30 +29,30 @@ Global
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{01EB903D-871F-4285-A8CF-6486561D5B5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {01EB903D-871F-4285-A8CF-6486561D5B5B}.Debug|Any CPU.ActiveCfg = Debug|x64
{01EB903D-871F-4285-A8CF-6486561D5B5B}.Debug|Any CPU.Build.0 = Debug|Any CPU {01EB903D-871F-4285-A8CF-6486561D5B5B}.Debug|Any CPU.Build.0 = Debug|x64
{01EB903D-871F-4285-A8CF-6486561D5B5B}.Release|Any CPU.ActiveCfg = Release|Any CPU {01EB903D-871F-4285-A8CF-6486561D5B5B}.Release|Any CPU.ActiveCfg = Release|x64
{01EB903D-871F-4285-A8CF-6486561D5B5B}.Release|Any CPU.Build.0 = Release|Any CPU {01EB903D-871F-4285-A8CF-6486561D5B5B}.Release|Any CPU.Build.0 = Release|x64
{29C589ED-7AF1-4DE9-82EF-33EBEF19AAFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {29C589ED-7AF1-4DE9-82EF-33EBEF19AAFA}.Debug|Any CPU.ActiveCfg = Debug|x64
{29C589ED-7AF1-4DE9-82EF-33EBEF19AAFA}.Debug|Any CPU.Build.0 = Debug|Any CPU {29C589ED-7AF1-4DE9-82EF-33EBEF19AAFA}.Debug|Any CPU.Build.0 = Debug|x64
{29C589ED-7AF1-4DE9-82EF-33EBEF19AAFA}.Release|Any CPU.ActiveCfg = Release|Any CPU {29C589ED-7AF1-4DE9-82EF-33EBEF19AAFA}.Release|Any CPU.ActiveCfg = Release|x64
{29C589ED-7AF1-4DE9-82EF-33EBEF19AAFA}.Release|Any CPU.Build.0 = Release|Any CPU {29C589ED-7AF1-4DE9-82EF-33EBEF19AAFA}.Release|Any CPU.Build.0 = Release|x64
{C0A2FAF8-C3AE-4B7B-ADDB-4AAC1A855428}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C0A2FAF8-C3AE-4B7B-ADDB-4AAC1A855428}.Debug|Any CPU.ActiveCfg = Debug|x64
{C0A2FAF8-C3AE-4B7B-ADDB-4AAC1A855428}.Debug|Any CPU.Build.0 = Debug|Any CPU {C0A2FAF8-C3AE-4B7B-ADDB-4AAC1A855428}.Debug|Any CPU.Build.0 = Debug|x64
{C0A2FAF8-C3AE-4B7B-ADDB-4AAC1A855428}.Release|Any CPU.ActiveCfg = Release|Any CPU {C0A2FAF8-C3AE-4B7B-ADDB-4AAC1A855428}.Release|Any CPU.ActiveCfg = Release|x64
{C0A2FAF8-C3AE-4B7B-ADDB-4AAC1A855428}.Release|Any CPU.Build.0 = Release|Any CPU {C0A2FAF8-C3AE-4B7B-ADDB-4AAC1A855428}.Release|Any CPU.Build.0 = Release|x64
{AAFE22E7-0F9B-462A-AAA3-6EE3B268F3F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AAFE22E7-0F9B-462A-AAA3-6EE3B268F3F8}.Debug|Any CPU.ActiveCfg = Debug|x64
{AAFE22E7-0F9B-462A-AAA3-6EE3B268F3F8}.Debug|Any CPU.Build.0 = Debug|Any CPU {AAFE22E7-0F9B-462A-AAA3-6EE3B268F3F8}.Debug|Any CPU.Build.0 = Debug|x64
{AAFE22E7-0F9B-462A-AAA3-6EE3B268F3F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {AAFE22E7-0F9B-462A-AAA3-6EE3B268F3F8}.Release|Any CPU.ActiveCfg = Release|x64
{AAFE22E7-0F9B-462A-AAA3-6EE3B268F3F8}.Release|Any CPU.Build.0 = Release|Any CPU {AAFE22E7-0F9B-462A-AAA3-6EE3B268F3F8}.Release|Any CPU.Build.0 = Release|x64
{EF233CE2-F243-449E-BE05-72B9D110E419}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF233CE2-F243-449E-BE05-72B9D110E419}.Debug|Any CPU.ActiveCfg = Debug|x64
{EF233CE2-F243-449E-BE05-72B9D110E419}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF233CE2-F243-449E-BE05-72B9D110E419}.Debug|Any CPU.Build.0 = Debug|x64
{EF233CE2-F243-449E-BE05-72B9D110E419}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF233CE2-F243-449E-BE05-72B9D110E419}.Release|Any CPU.ActiveCfg = Release|x64
{EF233CE2-F243-449E-BE05-72B9D110E419}.Release|Any CPU.Build.0 = Release|Any CPU {EF233CE2-F243-449E-BE05-72B9D110E419}.Release|Any CPU.Build.0 = Release|x64
{9B46691B-FAB2-4CC3-9B89-C8B91A590F47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9B46691B-FAB2-4CC3-9B89-C8B91A590F47}.Debug|Any CPU.ActiveCfg = Debug|x64
{9B46691B-FAB2-4CC3-9B89-C8B91A590F47}.Debug|Any CPU.Build.0 = Debug|Any CPU {9B46691B-FAB2-4CC3-9B89-C8B91A590F47}.Debug|Any CPU.Build.0 = Debug|x64
{9B46691B-FAB2-4CC3-9B89-C8B91A590F47}.Release|Any CPU.ActiveCfg = Release|Any CPU {9B46691B-FAB2-4CC3-9B89-C8B91A590F47}.Release|Any CPU.ActiveCfg = Release|x64
{9B46691B-FAB2-4CC3-9B89-C8B91A590F47}.Release|Any CPU.Build.0 = Release|Any CPU {9B46691B-FAB2-4CC3-9B89-C8B91A590F47}.Release|Any CPU.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View file

@ -1,38 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Dalamud.NET.Sdk/12.0.2">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<LangVersion>preview</LangVersion>
<PlatformTarget>x64</PlatformTarget>
<RootNamespace>Glamourer</RootNamespace> <RootNamespace>Glamourer</RootNamespace>
<AssemblyName>Glamourer</AssemblyName> <AssemblyName>Glamourer</AssemblyName>
<FileVersion>9.0.0.1</FileVersion> <FileVersion>9.0.0.1</FileVersion>
<AssemblyVersion>9.0.0.1</AssemblyVersion> <AssemblyVersion>9.0.0.1</AssemblyVersion>
<Company>SoftOtter</Company>
<Product>Glamourer</Product> <Product>Glamourer</Product>
<Copyright>Copyright © 2023</Copyright> <Copyright>Copyright © 2025</Copyright>
<Deterministic>true</Deterministic>
<OutputType>Library</OutputType>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Nullable>enable</Nullable>
<OutputPath>bin\$(Configuration)\</OutputPath> <OutputPath>bin\$(Configuration)\</OutputPath>
<MSBuildWarningsAsMessages>$(MSBuildWarningsAsMessages);MSB3277</MSBuildWarningsAsMessages>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
@ -47,41 +22,6 @@
<EmbeddedResource Include="LegacyTattoo.raw" /> <EmbeddedResource Include="LegacyTattoo.raw" />
</ItemGroup> </ItemGroup>
<PropertyGroup>
<DalamudLibPath>$(AppData)\XIVLauncher\addon\Hooks\dev\</DalamudLibPath>
</PropertyGroup>
<ItemGroup>
<Reference Include="Dalamud">
<HintPath>$(DalamudLibPath)Dalamud.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="FFXIVClientStructs">
<HintPath>$(DalamudLibPath)FFXIVClientStructs.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ImGui.NET">
<HintPath>$(DalamudLibPath)ImGui.NET.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ImGuiScene">
<HintPath>$(DalamudLibPath)ImGuiScene.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Lumina">
<HintPath>$(DalamudLibPath)Lumina.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Lumina.Excel">
<HintPath>$(DalamudLibPath)Lumina.Excel.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(DalamudLibPath)Newtonsoft.Json.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Glamourer.Api\Glamourer.Api.csproj" /> <ProjectReference Include="..\Glamourer.Api\Glamourer.Api.csproj" />
<ProjectReference Include="..\OtterGui\OtterGui.csproj" /> <ProjectReference Include="..\OtterGui\OtterGui.csproj" />

View file

@ -8,7 +8,7 @@
"AssemblyVersion": "9.0.0.1", "AssemblyVersion": "9.0.0.1",
"RepoUrl": "https://github.com/Ottermandias/Glamourer", "RepoUrl": "https://github.com/Ottermandias/Glamourer",
"ApplicableVersion": "any", "ApplicableVersion": "any",
"DalamudApiLevel": 11, "DalamudApiLevel": 12,
"ImageUrls": null, "ImageUrls": null,
"IconUrl": "https://raw.githubusercontent.com/Ottermandias/Glamourer/master/images/icon.png" "IconUrl": "https://raw.githubusercontent.com/Ottermandias/Glamourer/master/images/icon.png"
} }

View file

@ -173,7 +173,7 @@ public sealed class DesignQuickBar : Window, IDisposable
available |= 2; available |= 2;
_tooltipBuilder.Append("Right-Click: Apply ") _tooltipBuilder.Append("Right-Click: Apply ")
.Append(design.ResolveName(_config.Ephemeral.IncognitoMode)) .Append(design.ResolveName(_config.Ephemeral.IncognitoMode))
.Append(" to {_targetIdentifier}."); .Append(" to ").Append(_config.Ephemeral.IncognitoMode ? _targetIdentifier.Incognito(null) : _targetIdentifier.ToName());
} }
if (available == 0) if (available == 0)

View file

@ -94,7 +94,7 @@ public sealed unsafe class AdvancedDyePopup(
: ByteString.FromSpanUnsafe(materialHandle->ResourceHandle.FileName.AsSpan(), true).ToString(); : ByteString.FromSpanUnsafe(materialHandle->ResourceHandle.FileName.AsSpan(), true).ToString();
var gamePath = modelHandle == null var gamePath = modelHandle == null
? string.Empty ? string.Empty
: modelHandle->GetMaterialFileNameBySlotAsString(index.MaterialIndex); : modelHandle->GetMaterialFileNameBySlot(index.MaterialIndex).ToString();
return (path, gamePath); return (path, gamePath);
} }

View file

@ -29,7 +29,7 @@ public sealed class PenumbraChangedItemTooltip : IDisposable
.Select(p => new KeyValuePair<EquipSlot, EquipItem>(p.First, p.Second)); .Select(p => new KeyValuePair<EquipSlot, EquipItem>(p.First, p.Second));
public ChangedItemType LastType { get; private set; } = ChangedItemType.None; public ChangedItemType LastType { get; private set; } = ChangedItemType.None;
public uint LastId { get; private set; } = 0; public uint LastId { get; private set; }
public DateTime LastTooltip { get; private set; } = DateTime.MinValue; public DateTime LastTooltip { get; private set; } = DateTime.MinValue;
public DateTime LastClick { get; private set; } = DateTime.MinValue; public DateTime LastClick { get; private set; } = DateTime.MinValue;

View file

@ -1,12 +1,9 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
using Lumina.Data.Files;
using OtterGui.Services; using OtterGui.Services;
using Penumbra.GameData.Files.MaterialStructs; using Penumbra.GameData.Files.MaterialStructs;
using Penumbra.String.Functions; using Penumbra.String.Functions;
using SharpGen.Runtime; using SharpGen.Runtime;
using Vortice.Direct3D11; using Vortice.Direct3D11;
using Vortice.DXGI;
using MapFlags = Vortice.Direct3D11.MapFlags; using MapFlags = Vortice.Direct3D11.MapFlags;
using Texture = FFXIVClientStructs.FFXIV.Client.Graphics.Kernel.Texture; using Texture = FFXIVClientStructs.FFXIV.Client.Graphics.Kernel.Texture;
@ -32,9 +29,7 @@ public unsafe class DirectXService(IFramework framework) : IService
lock (_lock) lock (_lock)
{ {
using var texture = new SafeTextureHandle(Device.Instance()->CreateTexture2D(textureSize, 1, using var texture = new SafeTextureHandle(MaterialService.CreateColorTableTexture(), false);
(uint)TexFile.TextureFormat.R16G16B16A16F,
(uint)(TexFile.Attribute.TextureType2D | TexFile.Attribute.Managed | TexFile.Attribute.Immutable), 7), false);
if (texture.IsInvalid) if (texture.IsInvalid)
return false; return false;
@ -119,7 +114,7 @@ public unsafe class DirectXService(IFramework framework) : IService
{ {
var desc = resource.Description1; var desc = resource.Description1;
if (desc.Format is not Format.R16G16B16A16_Float if (desc.Format is not Vortice.DXGI.Format.R16G16B16A16_Float
|| desc.Width != MaterialService.TextureWidth || desc.Width != MaterialService.TextureWidth
|| desc.Height != MaterialService.TextureHeight || desc.Height != MaterialService.TextureHeight
|| map.DepthPitch != map.RowPitch * desc.Height) || map.DepthPitch != map.RowPitch * desc.Height)

View file

@ -9,18 +9,24 @@ namespace Glamourer.Interop.Material;
public static unsafe class MaterialService public static unsafe class MaterialService
{ {
private const TextureFormat Format = TextureFormat.R16G16B16A16_FLOAT;
private const TextureFlags Flags = TextureFlags.TextureType2D | TextureFlags.Managed | TextureFlags.Immutable;
public const int TextureWidth = 8; public const int TextureWidth = 8;
public const int TextureHeight = ColorTable.NumRows; public const int TextureHeight = ColorTable.NumRows;
public const int MaterialsPerModel = 10; public const int MaterialsPerModel = 10;
public static bool GenerateNewColorTable(in ColorTable.Table colorTable, out Texture* texture) public static Texture* CreateColorTableTexture()
{ {
var textureSize = stackalloc int[2]; var textureSize = stackalloc int[2];
textureSize[0] = TextureWidth; textureSize[0] = TextureWidth;
textureSize[1] = TextureHeight; textureSize[1] = TextureHeight;
return Device.Instance()->CreateTexture2D(textureSize, 1, Format, Flags, 7);
}
texture = Device.Instance()->CreateTexture2D(textureSize, 1, (uint)TexFile.TextureFormat.R16G16B16A16F, public static bool GenerateNewColorTable(in ColorTable.Table colorTable, out Texture* texture)
(uint)(TexFile.Attribute.TextureType2D | TexFile.Attribute.Managed | TexFile.Attribute.Immutable), 7); {
texture = CreateColorTableTexture();
if (texture == null) if (texture == null)
return false; return false;

View file

@ -133,7 +133,7 @@ public sealed unsafe class PrepareColorSet
public static ColorRow.Mode GetMode(MaterialResourceHandle* handle) public static ColorRow.Mode GetMode(MaterialResourceHandle* handle)
=> handle == null => handle == null
? ColorRow.Mode.Dawntrail ? ColorRow.Mode.Dawntrail
: handle->ShpkNameSpan.SequenceEqual("characterlegacy.shpk"u8) : handle->ShpkName.AsSpan().SequenceEqual("characterlegacy.shpk"u8)
? ColorRow.Mode.Legacy ? ColorRow.Mode.Legacy
: ColorRow.Mode.Dawntrail; : ColorRow.Mode.Dawntrail;

View file

@ -190,7 +190,7 @@ public class CustomizeUnlockManager : IDisposable, ISavable
? "Eternal Bond" ? "Eternal Bond"
: x.Value.HintItem.ValueNullable?.Name.ExtractText().Replace("Modern Aesthetics - ", string.Empty) : x.Value.HintItem.ValueNullable?.Name.ExtractText().Replace("Modern Aesthetics - ", string.Empty)
?? string.Empty; ?? string.Empty;
ret.TryAdd(hair, (x.Value.Data, name)); ret.TryAdd(hair, (x.Value.UnlockLink, name));
} }
} }
@ -201,7 +201,7 @@ public class CustomizeUnlockManager : IDisposable, ISavable
{ {
var name = x.Value.HintItem.ValueNullable?.Name.ExtractText().Replace("Modern Cosmetics - ", string.Empty) var name = x.Value.HintItem.ValueNullable?.Name.ExtractText().Replace("Modern Cosmetics - ", string.Empty)
?? string.Empty; ?? string.Empty;
ret.TryAdd(paint, (x.Value.Data, name)); ret.TryAdd(paint, (x.Value.UnlockLink, name));
} }
} }
} }

View file

@ -0,0 +1,108 @@
{
"version": 1,
"dependencies": {
"net9.0-windows7.0": {
"DalamudPackager": {
"type": "Direct",
"requested": "[12.0.0, )",
"resolved": "12.0.0",
"contentHash": "J5TJLV3f16T/E2H2P17ClWjtfEBPpq3yxvqW46eN36JCm6wR+EaoaYkqG9Rm5sHqs3/nK/vKjWWyvEs/jhKoXw=="
},
"DotNet.ReproducibleBuilds": {
"type": "Direct",
"requested": "[1.2.25, )",
"resolved": "1.2.25",
"contentHash": "xCXiw7BCxHJ8pF6wPepRUddlh2dlQlbr81gXA72hdk4FLHkKXas7EH/n+fk5UCA/YfMqG1Z6XaPiUjDbUNBUzg=="
},
"Vortice.Direct3D11": {
"type": "Direct",
"requested": "[3.4.2-beta, )",
"resolved": "3.4.2-beta",
"contentHash": "CWVMTF7ebylzzXbQXVp5C9UpBB/L+EpX2OxSdb2wlzcsdEmrev/Ith8wVs0WjZ6DbA0WiiybnYAWqB5v0nOO/A==",
"dependencies": {
"SharpGen.Runtime": "2.1.2-beta",
"Vortice.DXGI": "3.4.2-beta"
}
},
"JetBrains.Annotations": {
"type": "Transitive",
"resolved": "2024.3.0",
"contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "9.0.2",
"contentHash": "ZffbJrskOZ40JTzcTyKwFHS5eACSWp2bUQBBApIgGV+es8RaTD4OxUG7XxFr3RIPLXtYQ1jQzF2DjKB5fZn7Qg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "9.0.2",
"contentHash": "MNe7GSTBf3jQx5vYrXF0NZvn6l7hUKF6J54ENfAgCO8y6xjN1XUmKKWG464LP2ye6QqDiA1dkaWEZBYnhoZzjg=="
},
"SharpGen.Runtime": {
"type": "Transitive",
"resolved": "2.1.2-beta",
"contentHash": "nqZAjfEG1jX1ivvdZLsi6Pkt0DiOJyuOgRgldNFsmjXFPhxUbXQibofLSwuDZidL2kkmtTF8qLoRIeqeVdXgYw=="
},
"SharpGen.Runtime.COM": {
"type": "Transitive",
"resolved": "2.1.2-beta",
"contentHash": "HBCrb6HfnUWx9v5/GjJeBr5DuodZLnHlFQQYXPrQs1Hbe1c6Wd0uCXf+SJp4hW8fQNxjXEu0FgiyHGlA/SRzRw==",
"dependencies": {
"SharpGen.Runtime": "2.1.2-beta"
}
},
"Vortice.DirectX": {
"type": "Transitive",
"resolved": "3.4.2-beta",
"contentHash": "EwDbemXkmEiDGZVDem25uiEcZBYOMb+wzePuta+M/k2LXrQVGPknZhZUK56+QlHhI+Ducf/d+J75wgBzEjKi2g==",
"dependencies": {
"SharpGen.Runtime": "2.1.2-beta",
"SharpGen.Runtime.COM": "2.1.2-beta",
"Vortice.Mathematics": "1.7.6"
}
},
"Vortice.DXGI": {
"type": "Transitive",
"resolved": "3.4.2-beta",
"contentHash": "T4S3pp6l/SGJ6SH3ebCbodN/bimGOkIBiIYKeBpVEis7+/ac1XIjyzgSTJ5XsH3o3hSH7DqSbP6Yo6mL9nyFQA==",
"dependencies": {
"SharpGen.Runtime": "2.1.2-beta",
"Vortice.DirectX": "3.4.2-beta"
}
},
"Vortice.Mathematics": {
"type": "Transitive",
"resolved": "1.7.6",
"contentHash": "W8FNv850lPGxmHphwLyi1qnUlQHZBxh/62EenFJTaY6acPP29Fk0xMQJI60G+YNlsVJb3fSoriuW+ong5sM5UQ=="
},
"glamourer.api": {
"type": "Project"
},
"ottergui": {
"type": "Project",
"dependencies": {
"JetBrains.Annotations": "[2024.3.0, )",
"Microsoft.Extensions.DependencyInjection": "[9.0.2, )"
}
},
"penumbra.api": {
"type": "Project"
},
"penumbra.gamedata": {
"type": "Project",
"dependencies": {
"OtterGui": "[1.0.0, )",
"Penumbra.Api": "[5.6.1, )",
"Penumbra.String": "[1.0.6, )"
}
},
"penumbra.string": {
"type": "Project"
}
}
}
}

@ -1 +1 @@
Subproject commit 13f1a90b88d2b8572480748a209f957b70d6a46f Subproject commit 3396ee176fa72ad2dfb2de3294f7125ebce4dae5

@ -1 +1 @@
Subproject commit 70f046830cc7cd35b3480b12b7efe94182477fbb Subproject commit 2cbf4bace53a5749d3eab1ff03025a6e6bd9fc37

@ -1 +1 @@
Subproject commit 96163f79e13c7d52cc36cdd82ab4e823763f4f31 Subproject commit 9ae4a97110fff005a54213815086ce950d4d8b2d

@ -1 +1 @@
Subproject commit 4eb7c118cdac5873afb97cb04719602f061f03b7 Subproject commit 2896c0561f60827f97408650d52a15c38f4d9d10