Use MetaReverter for all cases, improve Eqdp handling through this.

This commit is contained in:
Ottermandias 2022-09-16 21:14:04 +02:00
parent af3a07c227
commit b34999a1a5
13 changed files with 199 additions and 195 deletions

View file

@ -18,6 +18,9 @@ public partial class MetaManager
public static void ResetCmpFiles()
=> SetFile( null, CharacterUtility.Index.HumanCmp );
public Interop.CharacterUtility.List.MetaReverter TemporarilySetCmpFile()
=> TemporarilySetFile( _cmpFile, CharacterUtility.Index.HumanCmp );
public void ResetCmp()
{
if( _cmpFile == null )

View file

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using OtterGui;
using OtterGui.Filesystem;
using Penumbra.GameData.Enums;
using Penumbra.Interop.Structs;
@ -23,6 +24,21 @@ public partial class MetaManager
}
}
public Interop.CharacterUtility.List.MetaReverter? TemporarilySetEqdpFile( GenderRace genderRace, bool accessory )
{
var idx = CharacterUtility.EqdpIdx( genderRace, accessory );
if( ( int )idx != -1 )
{
var i = CharacterUtility.EqdpIndices.IndexOf( idx );
if( i != -1 )
{
return TemporarilySetFile( _eqdpFiles[ i ], idx );
}
}
return null;
}
public static void ResetEqdpFiles()
{
foreach( var idx in CharacterUtility.EqdpIndices )
@ -33,7 +49,7 @@ public partial class MetaManager
public void ResetEqdp()
{
foreach( var file in _eqdpFiles.OfType<ExpandedEqdpFile>() )
foreach( var file in _eqdpFiles.OfType< ExpandedEqdpFile >() )
{
var relevant = Interop.CharacterUtility.RelevantIndices[ file.Index.Value ];
file.Reset( _eqdpManipulations.Where( m => m.FileIndex() == relevant ).Select( m => ( int )m.SetId ) );

View file

@ -18,6 +18,9 @@ public partial class MetaManager
public static void ResetEqpFiles()
=> SetFile( null, CharacterUtility.Index.Eqp );
public Interop.CharacterUtility.List.MetaReverter TemporarilySetEqpFile()
=> TemporarilySetFile( _eqpFile, CharacterUtility.Index.Eqp );
public void ResetEqp()
{
if( _eqpFile == null )

View file

@ -33,6 +33,20 @@ public partial class MetaManager
SetFile( null, CharacterUtility.Index.HeadEst );
}
public Interop.CharacterUtility.List.MetaReverter? TemporarilySetEstFile(EstManipulation.EstType type)
{
var (file, idx) = type switch
{
EstManipulation.EstType.Face => ( _estFaceFile, CharacterUtility.Index.FaceEst ),
EstManipulation.EstType.Hair => ( _estHairFile, CharacterUtility.Index.HairEst ),
EstManipulation.EstType.Body => ( _estBodyFile, CharacterUtility.Index.BodyEst ),
EstManipulation.EstType.Head => ( _estHeadFile, CharacterUtility.Index.HeadEst ),
_ => ( null, 0 ),
};
return idx != 0 ? TemporarilySetFile( file, idx ) : null;
}
public void ResetEst()
{
_estFaceFile?.Reset();

View file

@ -18,6 +18,9 @@ public partial class MetaManager
public static void ResetGmpFiles()
=> SetFile( null, CharacterUtility.Index.Gmp );
public Interop.CharacterUtility.List.MetaReverter TemporarilySetGmpFile()
=> TemporarilySetFile( _gmpFile, CharacterUtility.Index.Gmp );
public void ResetGmp()
{
if( _gmpFile == null )

View file

@ -179,4 +179,10 @@ public partial class MetaManager : IDisposable, IEnumerable< KeyValuePair< MetaM
Penumbra.CharacterUtility.SetResource( index, ( IntPtr )file.Data, file.Length );
}
}
[MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )]
private static unsafe Interop.CharacterUtility.List.MetaReverter TemporarilySetFile( MetaBaseFile? file, CharacterUtility.Index index )
=> file == null
? Penumbra.CharacterUtility.TemporarilyResetResource( index )
: Penumbra.CharacterUtility.TemporarilySetResource( index, ( IntPtr )file.Data, file.Length );
}