Skip to content

Commit 79c43fe

Browse files
Exter-NOttermandias
authored andcommitted
PathResolving: Better function signatures? (names + types + TMB param count + dedupe)
1 parent 69a4e2b commit 79c43fe

File tree

2 files changed

+72
-107
lines changed

2 files changed

+72
-107
lines changed

Penumbra/Interop/PathResolving/PathState.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public PathState(CollectionResolver collectionResolver, MetaState metaState, Cha
4242
MetaState = metaState;
4343
CharacterUtility = characterUtility;
4444
_human = new ResolvePathHooks(interop, this, _humanVTable, ResolvePathHooks.Type.Human);
45-
_weapon = new ResolvePathHooks(interop, this, _weaponVTable, ResolvePathHooks.Type.Weapon);
45+
_weapon = new ResolvePathHooks(interop, this, _weaponVTable, ResolvePathHooks.Type.Other);
4646
_demiHuman = new ResolvePathHooks(interop, this, _demiHumanVTable, ResolvePathHooks.Type.Other);
4747
_monster = new ResolvePathHooks(interop, this, _monsterVTable, ResolvePathHooks.Type.Other);
4848
_human.Enable();

Penumbra/Interop/PathResolving/ResolvePathHooks.cs

Lines changed: 71 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -12,45 +12,47 @@ public unsafe class ResolvePathHooks : IDisposable
1212
public enum Type
1313
{
1414
Human,
15-
Weapon,
1615
Other,
1716
}
1817

19-
private delegate nint GeneralResolveDelegate(nint drawObject, nint path, nint unk3, uint unk4);
20-
private delegate nint MPapResolveDelegate(nint drawObject, nint path, nint unk3, uint unk4, uint unk5);
21-
private delegate nint MaterialResolveDelegate(nint drawObject, nint path, nint unk3, uint unk4, ulong unk5);
22-
private delegate nint EidResolveDelegate(nint drawObject, nint path, nint unk3);
23-
24-
private readonly Hook<GeneralResolveDelegate> _resolveDecalPathHook;
25-
private readonly Hook<EidResolveDelegate> _resolveEidPathHook;
26-
private readonly Hook<GeneralResolveDelegate> _resolveImcPathHook;
27-
private readonly Hook<MPapResolveDelegate> _resolveMPapPathHook;
28-
private readonly Hook<GeneralResolveDelegate> _resolveMdlPathHook;
29-
private readonly Hook<MaterialResolveDelegate> _resolveMtrlPathHook;
30-
private readonly Hook<MaterialResolveDelegate> _resolvePapPathHook;
31-
private readonly Hook<GeneralResolveDelegate> _resolvePhybPathHook;
32-
private readonly Hook<GeneralResolveDelegate> _resolveSklbPathHook;
33-
private readonly Hook<GeneralResolveDelegate> _resolveSkpPathHook;
34-
private readonly Hook<EidResolveDelegate> _resolveTmbPathHook;
35-
private readonly Hook<MaterialResolveDelegate> _resolveVfxPathHook;
18+
private delegate nint MPapResolveDelegate(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex, uint sId);
19+
private delegate nint NamedResolveDelegate(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex, nint name);
20+
private delegate nint PerSlotResolveDelegate(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex);
21+
private delegate nint SingleResolveDelegate(nint drawObject, nint pathBuffer, nint pathBufferSize);
22+
private delegate nint TmbResolveDelegate(nint drawObject, nint pathBuffer, nint pathBufferSize, nint timelineName);
23+
// Kept separate from NamedResolveDelegate because the 5th parameter has out semantics here, instead of in.
24+
private delegate nint VfxResolveDelegate(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex, nint unkOutParam);
25+
26+
private readonly Hook<PerSlotResolveDelegate> _resolveDecalPathHook;
27+
private readonly Hook<SingleResolveDelegate> _resolveEidPathHook;
28+
private readonly Hook<PerSlotResolveDelegate> _resolveImcPathHook;
29+
private readonly Hook<MPapResolveDelegate> _resolveMPapPathHook;
30+
private readonly Hook<PerSlotResolveDelegate> _resolveMdlPathHook;
31+
private readonly Hook<NamedResolveDelegate> _resolveMtrlPathHook;
32+
private readonly Hook<NamedResolveDelegate> _resolvePapPathHook;
33+
private readonly Hook<PerSlotResolveDelegate> _resolvePhybPathHook;
34+
private readonly Hook<PerSlotResolveDelegate> _resolveSklbPathHook;
35+
private readonly Hook<PerSlotResolveDelegate> _resolveSkpPathHook;
36+
private readonly Hook<TmbResolveDelegate> _resolveTmbPathHook;
37+
private readonly Hook<VfxResolveDelegate> _resolveVfxPathHook;
3638

3739
private readonly PathState _parent;
3840

3941
public ResolvePathHooks(IGameInteropProvider interop, PathState parent, nint* vTable, Type type)
4042
{
4143
_parent = parent;
42-
_resolveDecalPathHook = Create<GeneralResolveDelegate>(interop, vTable[83], type, ResolveDecalWeapon, ResolveDecal);
43-
_resolveEidPathHook = Create<EidResolveDelegate>(interop, vTable[85], type, ResolveEidWeapon, ResolveEid);
44-
_resolveImcPathHook = Create<GeneralResolveDelegate>(interop, vTable[81], type, ResolveImcWeapon, ResolveImc);
45-
_resolveMPapPathHook = Create<MPapResolveDelegate>(interop, vTable[79], type, ResolveMPapWeapon, ResolveMPap);
46-
_resolveMdlPathHook = Create<GeneralResolveDelegate>(interop, vTable[73], type, ResolveMdlWeapon, ResolveMdl, ResolveMdlHuman);
47-
_resolveMtrlPathHook = Create<MaterialResolveDelegate>(interop, vTable[82], type, ResolveMtrlWeapon, ResolveMtrl);
48-
_resolvePapPathHook = Create<MaterialResolveDelegate>(interop, vTable[76], type, ResolvePapWeapon, ResolvePap, ResolvePapHuman);
49-
_resolvePhybPathHook = Create<GeneralResolveDelegate>(interop, vTable[75], type, ResolvePhybWeapon, ResolvePhyb, ResolvePhybHuman);
50-
_resolveSklbPathHook = Create<GeneralResolveDelegate>(interop, vTable[72], type, ResolveSklbWeapon, ResolveSklb, ResolveSklbHuman);
51-
_resolveSkpPathHook = Create<GeneralResolveDelegate>(interop, vTable[74], type, ResolveSkpWeapon, ResolveSkp, ResolveSkpHuman);
52-
_resolveTmbPathHook = Create<EidResolveDelegate>(interop, vTable[77], type, ResolveTmbWeapon, ResolveTmb);
53-
_resolveVfxPathHook = Create<MaterialResolveDelegate>(interop, vTable[84], type, ResolveVfxWeapon, ResolveVfx);
44+
_resolveDecalPathHook = Create<PerSlotResolveDelegate>(interop, vTable[83], ResolveDecal);
45+
_resolveEidPathHook = Create<SingleResolveDelegate>(interop, vTable[85], ResolveEid);
46+
_resolveImcPathHook = Create<PerSlotResolveDelegate>(interop, vTable[81], ResolveImc);
47+
_resolveMPapPathHook = Create<MPapResolveDelegate>(interop, vTable[79], ResolveMPap);
48+
_resolveMdlPathHook = Create<PerSlotResolveDelegate>(interop, vTable[73], type, ResolveMdl, ResolveMdlHuman);
49+
_resolveMtrlPathHook = Create<NamedResolveDelegate>(interop, vTable[82], ResolveMtrl);
50+
_resolvePapPathHook = Create<NamedResolveDelegate>(interop, vTable[76], type, ResolvePap, ResolvePapHuman);
51+
_resolvePhybPathHook = Create<PerSlotResolveDelegate>(interop, vTable[75], type, ResolvePhyb, ResolvePhybHuman);
52+
_resolveSklbPathHook = Create<PerSlotResolveDelegate>(interop, vTable[72], type, ResolveSklb, ResolveSklbHuman);
53+
_resolveSkpPathHook = Create<PerSlotResolveDelegate>(interop, vTable[74], type, ResolveSkp, ResolveSkpHuman);
54+
_resolveTmbPathHook = Create<TmbResolveDelegate>(interop, vTable[77], ResolveTmb);
55+
_resolveVfxPathHook = Create<VfxResolveDelegate>(interop, vTable[84], ResolveVfx);
5456
}
5557

5658
public void Enable()
@@ -101,74 +103,74 @@ public void Dispose()
101103
_resolveVfxPathHook.Dispose();
102104
}
103105

104-
private nint ResolveDecal(nint drawObject, nint path, nint unk3, uint unk4)
105-
=> ResolvePath(drawObject, _resolveDecalPathHook.Original(drawObject, path, unk3, unk4));
106+
private nint ResolveDecal(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex)
107+
=> ResolvePath(drawObject, _resolveDecalPathHook.Original(drawObject, pathBuffer, pathBufferSize, slotIndex));
106108

107-
private nint ResolveEid(nint drawObject, nint path, nint unk3)
108-
=> ResolvePath(drawObject, _resolveEidPathHook.Original(drawObject, path, unk3));
109+
private nint ResolveEid(nint drawObject, nint pathBuffer, nint pathBufferSize)
110+
=> ResolvePath(drawObject, _resolveEidPathHook.Original(drawObject, pathBuffer, pathBufferSize));
109111

110-
private nint ResolveImc(nint drawObject, nint path, nint unk3, uint unk4)
111-
=> ResolvePath(drawObject, _resolveImcPathHook.Original(drawObject, path, unk3, unk4));
112+
private nint ResolveImc(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex)
113+
=> ResolvePath(drawObject, _resolveImcPathHook.Original(drawObject, pathBuffer, pathBufferSize, slotIndex));
112114

113-
private nint ResolveMPap(nint drawObject, nint path, nint unk3, uint unk4, uint unk5)
114-
=> ResolvePath(drawObject, _resolveMPapPathHook.Original(drawObject, path, unk3, unk4, unk5));
115+
private nint ResolveMPap(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex, uint unkSId)
116+
=> ResolvePath(drawObject, _resolveMPapPathHook.Original(drawObject, pathBuffer, pathBufferSize, slotIndex, unkSId));
115117

116-
private nint ResolveMdl(nint drawObject, nint path, nint unk3, uint modelType)
117-
=> ResolvePath(drawObject, _resolveMdlPathHook.Original(drawObject, path, unk3, modelType));
118+
private nint ResolveMdl(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex)
119+
=> ResolvePath(drawObject, _resolveMdlPathHook.Original(drawObject, pathBuffer, pathBufferSize, slotIndex));
118120

119-
private nint ResolveMtrl(nint drawObject, nint path, nint unk3, uint unk4, ulong unk5)
120-
=> ResolvePath(drawObject, _resolveMtrlPathHook.Original(drawObject, path, unk3, unk4, unk5));
121+
private nint ResolveMtrl(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex, nint mtrlFileName)
122+
=> ResolvePath(drawObject, _resolveMtrlPathHook.Original(drawObject, pathBuffer, pathBufferSize, slotIndex, mtrlFileName));
121123

122-
private nint ResolvePap(nint drawObject, nint path, nint unk3, uint unk4, ulong unk5)
123-
=> ResolvePath(drawObject, _resolvePapPathHook.Original(drawObject, path, unk3, unk4, unk5));
124+
private nint ResolvePap(nint drawObject, nint pathBuffer, nint pathBufferSize, uint unkAnimationIndex, nint animationName)
125+
=> ResolvePath(drawObject, _resolvePapPathHook.Original(drawObject, pathBuffer, pathBufferSize, unkAnimationIndex, animationName));
124126

125-
private nint ResolvePhyb(nint drawObject, nint path, nint unk3, uint unk4)
126-
=> ResolvePath(drawObject, _resolvePhybPathHook.Original(drawObject, path, unk3, unk4));
127+
private nint ResolvePhyb(nint drawObject, nint pathBuffer, nint pathBufferSize, uint partialSkeletonIndex)
128+
=> ResolvePath(drawObject, _resolvePhybPathHook.Original(drawObject, pathBuffer, pathBufferSize, partialSkeletonIndex));
127129

128-
private nint ResolveSklb(nint drawObject, nint path, nint unk3, uint unk4)
129-
=> ResolvePath(drawObject, _resolveSklbPathHook.Original(drawObject, path, unk3, unk4));
130+
private nint ResolveSklb(nint drawObject, nint pathBuffer, nint pathBufferSize, uint partialSkeletonIndex)
131+
=> ResolvePath(drawObject, _resolveSklbPathHook.Original(drawObject, pathBuffer, pathBufferSize, partialSkeletonIndex));
130132

131-
private nint ResolveSkp(nint drawObject, nint path, nint unk3, uint unk4)
132-
=> ResolvePath(drawObject, _resolveSkpPathHook.Original(drawObject, path, unk3, unk4));
133+
private nint ResolveSkp(nint drawObject, nint pathBuffer, nint pathBufferSize, uint partialSkeletonIndex)
134+
=> ResolvePath(drawObject, _resolveSkpPathHook.Original(drawObject, pathBuffer, pathBufferSize, partialSkeletonIndex));
133135

134-
private nint ResolveTmb(nint drawObject, nint path, nint unk3)
135-
=> ResolvePath(drawObject, _resolveTmbPathHook.Original(drawObject, path, unk3));
136+
private nint ResolveTmb(nint drawObject, nint pathBuffer, nint pathBufferSize, nint timelineName)
137+
=> ResolvePath(drawObject, _resolveTmbPathHook.Original(drawObject, pathBuffer, pathBufferSize, timelineName));
136138

137-
private nint ResolveVfx(nint drawObject, nint path, nint unk3, uint unk4, ulong unk5)
138-
=> ResolvePath(drawObject, _resolveVfxPathHook.Original(drawObject, path, unk3, unk4, unk5));
139+
private nint ResolveVfx(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex, nint unkOutParam)
140+
=> ResolvePath(drawObject, _resolveVfxPathHook.Original(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam));
139141

140142

141-
private nint ResolveMdlHuman(nint drawObject, nint path, nint unk3, uint modelType)
143+
private nint ResolveMdlHuman(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex)
142144
{
143145
var data = _parent.CollectionResolver.IdentifyCollection((DrawObject*)drawObject, true);
144-
using var eqdp = modelType > 9
146+
using var eqdp = slotIndex > 9
145147
? DisposableContainer.Empty
146-
: _parent.MetaState.ResolveEqdpData(data.ModCollection, MetaState.GetHumanGenderRace(drawObject), modelType < 5, modelType > 4);
147-
return ResolvePath(data, _resolveMdlPathHook.Original(drawObject, path, unk3, modelType));
148+
: _parent.MetaState.ResolveEqdpData(data.ModCollection, MetaState.GetHumanGenderRace(drawObject), slotIndex < 5, slotIndex > 4);
149+
return ResolvePath(data, _resolveMdlPathHook.Original(drawObject, pathBuffer, pathBufferSize, slotIndex));
148150
}
149151

150-
private nint ResolvePapHuman(nint drawObject, nint path, nint unk3, uint unk4, ulong unk5)
152+
private nint ResolvePapHuman(nint drawObject, nint pathBuffer, nint pathBufferSize, uint unkAnimationIndex, nint animationName)
151153
{
152154
using var est = GetEstChanges(drawObject, out var data);
153-
return ResolvePath(data, _resolvePapPathHook.Original(drawObject, path, unk3, unk4, unk5));
155+
return ResolvePath(data, _resolvePapPathHook.Original(drawObject, pathBuffer, pathBufferSize, unkAnimationIndex, animationName));
154156
}
155157

156-
private nint ResolvePhybHuman(nint drawObject, nint path, nint unk3, uint unk4)
158+
private nint ResolvePhybHuman(nint drawObject, nint pathBuffer, nint pathBufferSize, uint partialSkeletonIndex)
157159
{
158160
using var est = GetEstChanges(drawObject, out var data);
159-
return ResolvePath(data, _resolvePhybPathHook.Original(drawObject, path, unk3, unk4));
161+
return ResolvePath(data, _resolvePhybPathHook.Original(drawObject, pathBuffer, pathBufferSize, partialSkeletonIndex));
160162
}
161163

162-
private nint ResolveSklbHuman(nint drawObject, nint path, nint unk3, uint unk4)
164+
private nint ResolveSklbHuman(nint drawObject, nint pathBuffer, nint pathBufferSize, uint partialSkeletonIndex)
163165
{
164166
using var est = GetEstChanges(drawObject, out var data);
165-
return ResolvePath(data, _resolveSklbPathHook.Original(drawObject, path, unk3, unk4));
167+
return ResolvePath(data, _resolveSklbPathHook.Original(drawObject, pathBuffer, pathBufferSize, partialSkeletonIndex));
166168
}
167169

168-
private nint ResolveSkpHuman(nint drawObject, nint path, nint unk3, uint unk4)
170+
private nint ResolveSkpHuman(nint drawObject, nint pathBuffer, nint pathBufferSize, uint partialSkeletonIndex)
169171
{
170172
using var est = GetEstChanges(drawObject, out var data);
171-
return ResolvePath(data, _resolveSkpPathHook.Original(drawObject, path, unk3, unk4));
173+
return ResolvePath(data, _resolveSkpPathHook.Original(drawObject, pathBuffer, pathBufferSize, partialSkeletonIndex));
172174
}
173175

174176
private DisposableContainer GetEstChanges(nint drawObject, out ResolveData data)
@@ -180,58 +182,21 @@ private DisposableContainer GetEstChanges(nint drawObject, out ResolveData data)
180182
data.ModCollection.TemporarilySetEstFile(_parent.CharacterUtility, EstManipulation.EstType.Head));
181183
}
182184

183-
private nint ResolveDecalWeapon(nint drawObject, nint path, nint unk3, uint unk4)
184-
=> ResolvePath(drawObject, _resolveDecalPathHook.Original(drawObject, path, unk3, unk4));
185-
186-
private nint ResolveEidWeapon(nint drawObject, nint path, nint unk3)
187-
=> ResolvePath(drawObject, _resolveEidPathHook.Original(drawObject, path, unk3));
188-
189-
private nint ResolveImcWeapon(nint drawObject, nint path, nint unk3, uint unk4)
190-
=> ResolvePath(drawObject, _resolveImcPathHook.Original(drawObject, path, unk3, unk4));
191-
192-
private nint ResolveMPapWeapon(nint drawObject, nint path, nint unk3, uint unk4, uint unk5)
193-
=> ResolvePath(drawObject, _resolveMPapPathHook.Original(drawObject, path, unk3, unk4, unk5));
194-
195-
private nint ResolveMdlWeapon(nint drawObject, nint path, nint unk3, uint modelType)
196-
=> ResolvePath(drawObject, _resolveMdlPathHook.Original(drawObject, path, unk3, modelType));
197-
198-
private nint ResolveMtrlWeapon(nint drawObject, nint path, nint unk3, uint unk4, ulong unk5)
199-
=> ResolvePath(drawObject, _resolveMtrlPathHook.Original(drawObject, path, unk3, unk4, unk5));
200-
201-
private nint ResolvePapWeapon(nint drawObject, nint path, nint unk3, uint unk4, ulong unk5)
202-
=> ResolvePath(drawObject, _resolvePapPathHook.Original(drawObject, path, unk3, unk4, unk5));
203-
204-
private nint ResolvePhybWeapon(nint drawObject, nint path, nint unk3, uint unk4)
205-
=> ResolvePath(drawObject, _resolvePhybPathHook.Original(drawObject, path, unk3, unk4));
206-
207-
private nint ResolveSklbWeapon(nint drawObject, nint path, nint unk3, uint unk4)
208-
=> ResolvePath(drawObject, _resolveSklbPathHook.Original(drawObject, path, unk3, unk4));
209-
210-
private nint ResolveSkpWeapon(nint drawObject, nint path, nint unk3, uint unk4)
211-
=> ResolvePath(drawObject, _resolveSkpPathHook.Original(drawObject, path, unk3, unk4));
212-
213-
private nint ResolveTmbWeapon(nint drawObject, nint path, nint unk3)
214-
=> ResolvePath(drawObject, _resolveTmbPathHook.Original(drawObject, path, unk3));
215-
216-
private nint ResolveVfxWeapon(nint drawObject, nint path, nint unk3, uint unk4, ulong unk5)
217-
=> ResolvePath(drawObject, _resolveVfxPathHook.Original(drawObject, path, unk3, unk4, unk5));
218-
219185

220186
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
221-
private static Hook<T> Create<T>(IGameInteropProvider interop, nint address, Type type, T weapon, T other, T human) where T : Delegate
187+
private static Hook<T> Create<T>(IGameInteropProvider interop, nint address, Type type, T other, T human) where T : Delegate
222188
{
223189
var del = type switch
224190
{
225191
Type.Human => human,
226-
Type.Weapon => weapon,
227192
_ => other,
228193
};
229194
return interop.HookFromAddress(address, del);
230195
}
231196

232197
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
233-
private static Hook<T> Create<T>(IGameInteropProvider interop, nint address, Type type, T weapon, T other) where T : Delegate
234-
=> Create(interop, address, type, weapon, other, other);
198+
private static Hook<T> Create<T>(IGameInteropProvider interop, nint address, T del) where T : Delegate
199+
=> interop.HookFromAddress(address, del);
235200

236201

237202
// Implementation

0 commit comments

Comments
 (0)