Another try at fixing metadata, maybe.

This commit is contained in:
Ottermandias 2022-09-26 13:12:42 +02:00
parent 2ee64137a7
commit 0ff851f717
3 changed files with 50 additions and 63 deletions

View file

@ -8,6 +8,7 @@ using System.Collections.Generic;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Threading; using System.Threading;
using Penumbra.Interop; using Penumbra.Interop;
using Penumbra.Meta.Files;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
namespace Penumbra.Collections; namespace Penumbra.Collections;
@ -159,18 +160,23 @@ public partial class ModCollection
} }
// Used for short periods of changed files. // Used for short periods of changed files.
public CharacterUtility.List.MetaReverter? TemporarilySetEqdpFile( GenderRace genderRace, bool accessory ) public CharacterUtility.List.MetaReverter TemporarilySetEqdpFile( GenderRace genderRace, bool accessory )
=> _cache?.MetaManipulations.TemporarilySetEqdpFile( genderRace, accessory ); => _cache?.MetaManipulations.TemporarilySetEqdpFile( genderRace, accessory )
?? Penumbra.CharacterUtility.TemporarilyResetResource( Interop.Structs.CharacterUtility.EqdpIdx( genderRace, accessory ) );
public CharacterUtility.List.MetaReverter? TemporarilySetEqpFile() public CharacterUtility.List.MetaReverter TemporarilySetEqpFile()
=> _cache?.MetaManipulations.TemporarilySetEqpFile(); => _cache?.MetaManipulations.TemporarilySetEqpFile()
?? Penumbra.CharacterUtility.TemporarilyResetResource( Interop.Structs.CharacterUtility.Index.Eqp );
public CharacterUtility.List.MetaReverter? TemporarilySetGmpFile() public CharacterUtility.List.MetaReverter TemporarilySetGmpFile()
=> _cache?.MetaManipulations.TemporarilySetGmpFile(); => _cache?.MetaManipulations.TemporarilySetGmpFile()
?? Penumbra.CharacterUtility.TemporarilyResetResource( Interop.Structs.CharacterUtility.Index.Gmp );
public CharacterUtility.List.MetaReverter? TemporarilySetCmpFile() public CharacterUtility.List.MetaReverter TemporarilySetCmpFile()
=> _cache?.MetaManipulations.TemporarilySetCmpFile(); => _cache?.MetaManipulations.TemporarilySetCmpFile()
?? Penumbra.CharacterUtility.TemporarilyResetResource( Interop.Structs.CharacterUtility.Index.HumanCmp );
public CharacterUtility.List.MetaReverter? TemporarilySetEstFile( EstManipulation.EstType type ) public CharacterUtility.List.MetaReverter TemporarilySetEstFile( EstManipulation.EstType type )
=> _cache?.MetaManipulations.TemporarilySetEstFile( type ); => _cache?.MetaManipulations.TemporarilySetEstFile( type )
?? Penumbra.CharacterUtility.TemporarilyResetResource( ( Interop.Structs.CharacterUtility.Index )type );
} }

View file

@ -79,16 +79,9 @@ public unsafe partial class PathResolver
private void OnModelLoadCompleteDetour( IntPtr drawObject ) private void OnModelLoadCompleteDetour( IntPtr drawObject )
{ {
var collection = GetResolveData( drawObject ); var collection = GetResolveData( drawObject );
if( collection.Valid ) using var eqp = collection.ModCollection.TemporarilySetEqpFile();
{ using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
using var eqp = collection.ModCollection.TemporarilySetEqpFile(); _onModelLoadCompleteHook.Original.Invoke( drawObject );
using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
_onModelLoadCompleteHook.Original.Invoke( drawObject );
}
else
{
_onModelLoadCompleteHook.Original.Invoke( drawObject );
}
} }
private delegate void UpdateModelDelegate( IntPtr drawObject ); private delegate void UpdateModelDelegate( IntPtr drawObject );
@ -106,16 +99,9 @@ public unsafe partial class PathResolver
} }
var collection = GetResolveData( drawObject ); var collection = GetResolveData( drawObject );
if( collection.Valid ) using var eqp = collection.ModCollection.TemporarilySetEqpFile();
{ using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
using var eqp = collection.ModCollection.TemporarilySetEqpFile(); _updateModelsHook.Original.Invoke( drawObject );
using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
_updateModelsHook.Original.Invoke( drawObject );
}
else
{
_updateModelsHook.Original.Invoke( drawObject );
}
} }
private static GenderRace GetDrawObjectGenderRace( IntPtr drawObject ) private static GenderRace GetDrawObjectGenderRace( IntPtr drawObject )
@ -150,7 +136,7 @@ public unsafe partial class PathResolver
} }
var resolveData = GetResolveData( drawObject ); var resolveData = GetResolveData( drawObject );
using var eqp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetEqpFile() : null; using var eqp = resolveData.ModCollection.TemporarilySetEqpFile();
_getEqpIndirectHook.Original( drawObject ); _getEqpIndirectHook.Original( drawObject );
} }
@ -165,7 +151,7 @@ public unsafe partial class PathResolver
private byte SetupVisorDetour( IntPtr drawObject, ushort modelId, byte visorState ) private byte SetupVisorDetour( IntPtr drawObject, ushort modelId, byte visorState )
{ {
var resolveData = GetResolveData( drawObject ); var resolveData = GetResolveData( drawObject );
using var gmp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetGmpFile() : null; using var gmp = resolveData.ModCollection.TemporarilySetGmpFile();
return _setupVisorHook.Original( drawObject, modelId, visorState ); return _setupVisorHook.Original( drawObject, modelId, visorState );
} }
@ -184,7 +170,7 @@ public unsafe partial class PathResolver
else else
{ {
var resolveData = GetResolveData( drawObject ); var resolveData = GetResolveData( drawObject );
using var cmp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetCmpFile() : null; using var cmp = resolveData.ModCollection.TemporarilySetCmpFile();
_rspSetupCharacterHook.Original( drawObject, unk2, unk3, unk4, unk5 ); _rspSetupCharacterHook.Original( drawObject, unk2, unk3, unk4, unk5 );
} }
} }
@ -200,10 +186,8 @@ public unsafe partial class PathResolver
{ {
_inChangeCustomize = true; _inChangeCustomize = true;
var resolveData = GetResolveData( human ); var resolveData = GetResolveData( human );
using var cmp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetCmpFile() : null; using var cmp = resolveData.ModCollection.TemporarilySetCmpFile();
using var decals = resolveData.Valid using var decals = new CharacterUtility.DecalReverter( resolveData.ModCollection, DrawObjectState.UsesDecal( 0, data ) );
? new CharacterUtility.DecalReverter( resolveData.ModCollection, DrawObjectState.UsesDecal( 0, data ) )
: null;
return _changeCustomize.Original( human, data, skipEquipment ); return _changeCustomize.Original( human, data, skipEquipment );
} }
@ -224,6 +208,7 @@ public unsafe partial class PathResolver
return race switch return race switch
{ {
// @formatter:off
MidlanderMale => Convert( MidlanderMale ), MidlanderMale => Convert( MidlanderMale ),
HighlanderMale => Convert( MidlanderMale, HighlanderMale ), HighlanderMale => Convert( MidlanderMale, HighlanderMale ),
ElezenMale => Convert( MidlanderMale, ElezenMale ), ElezenMale => Convert( MidlanderMale, ElezenMale ),
@ -245,28 +230,29 @@ public unsafe partial class PathResolver
VieraFemale => Convert( MidlanderMale, MidlanderFemale, VieraFemale ), VieraFemale => Convert( MidlanderMale, MidlanderFemale, VieraFemale ),
MidlanderMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc ), MidlanderMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc ),
HighlanderMaleNpc => Convert( MidlanderMale, HighlanderMale, HighlanderMaleNpc ), HighlanderMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, HighlanderMale, HighlanderMaleNpc ),
ElezenMaleNpc => Convert( MidlanderMale, ElezenMale, ElezenMaleNpc ), ElezenMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, ElezenMale, ElezenMaleNpc ),
MiqoteMaleNpc => Convert( MidlanderMale, MiqoteMale, MiqoteMaleNpc ), MiqoteMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MiqoteMale, MiqoteMaleNpc ),
RoegadynMaleNpc => Convert( MidlanderMale, RoegadynMale, RoegadynMaleNpc ), RoegadynMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, RoegadynMale, RoegadynMaleNpc ),
LalafellMaleNpc => Convert( MidlanderMale, LalafellMale, LalafellMaleNpc ), LalafellMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, LalafellMale, LalafellMaleNpc ),
AuRaMaleNpc => Convert( MidlanderMale, AuRaMale, AuRaMaleNpc ), AuRaMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, AuRaMale, AuRaMaleNpc ),
HrothgarMaleNpc => Convert( MidlanderMale, RoegadynMale, HrothgarMale, HrothgarMaleNpc ), HrothgarMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, RoegadynMaleNpc, RoegadynMale, HrothgarMale, HrothgarMaleNpc ),
VieraMaleNpc => Convert( MidlanderMale, VieraMale, VieraMaleNpc ), VieraMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, VieraMale, VieraMaleNpc ),
MidlanderFemaleNpc => Convert( MidlanderMale, MidlanderFemale, MidlanderFemaleNpc ), MidlanderFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc ),
HighlanderFemaleNpc => Convert( MidlanderMale, MidlanderFemale, HighlanderFemale, HighlanderFemaleNpc ), HighlanderFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, HighlanderFemale, HighlanderFemaleNpc ),
ElezenFemaleNpc => Convert( MidlanderMale, MidlanderFemale, ElezenFemale, ElezenFemaleNpc ), ElezenFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, ElezenFemale, ElezenFemaleNpc ),
MiqoteFemaleNpc => Convert( MidlanderMale, MidlanderFemale, MiqoteFemale, MiqoteFemaleNpc ), MiqoteFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, MiqoteFemale, MiqoteFemaleNpc ),
RoegadynFemaleNpc => Convert( MidlanderMale, MidlanderFemale, RoegadynFemale, RoegadynFemaleNpc ), RoegadynFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, RoegadynFemale, RoegadynFemaleNpc ),
LalafellFemaleNpc => Convert( MidlanderMale, LalafellMale, LalafellFemale, LalafellFemaleNpc ), LalafellFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, LalafellMale, LalafellMaleNpc, LalafellFemale, LalafellFemaleNpc ),
AuRaFemaleNpc => Convert( MidlanderMale, MidlanderFemale, AuRaFemale, AuRaFemaleNpc ), AuRaFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, AuRaFemale, AuRaFemaleNpc ),
HrothgarFemaleNpc => Convert( MidlanderMale, MidlanderFemale, RoegadynFemale, HrothgarFemale, HrothgarFemaleNpc ), HrothgarFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, RoegadynFemale, RoegadynFemaleNpc, HrothgarFemale, HrothgarFemaleNpc ),
VieraFemaleNpc => Convert( MidlanderMale, MidlanderFemale, VieraFemale, VieraFemaleNpc ), VieraFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, VieraFemale, VieraFemaleNpc ),
UnknownMaleNpc => Convert( MidlanderMale, UnknownMaleNpc ), UnknownMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, UnknownMaleNpc ),
UnknownFemaleNpc => Convert( MidlanderMale, MidlanderFemale, UnknownFemaleNpc ), UnknownFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, UnknownFemaleNpc ),
_ => DisposableContainer.Empty, _ => DisposableContainer.Empty,
// @formatter:on
}; };
} }
} }

View file

@ -147,13 +147,8 @@ public partial class PathResolver : IDisposable
private static unsafe ResolveData GetResolveData( IntPtr drawObject ) private static unsafe ResolveData GetResolveData( IntPtr drawObject )
{ {
var parent = FindParent( drawObject, out var resolveData ); var _ = FindParent( drawObject, out var resolveData );
if( parent == null || resolveData.ModCollection == Penumbra.CollectionManager.Default ) return resolveData;
{
return ResolveData.Invalid;
}
return resolveData.ModCollection.HasCache ? resolveData : ResolveData.Invalid;
} }
internal IEnumerable< KeyValuePair< Utf8String, ResolveData > > PathCollections internal IEnumerable< KeyValuePair< Utf8String, ResolveData > > PathCollections