Skip to content

Commit 3c599a7

Browse files
committed
wire up acl fix dll
1 parent ee7eb33 commit 3c599a7

4 files changed

Lines changed: 123 additions & 10 deletions

File tree

AnimeStudio.Utility/ACL/ACL.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,50 @@ public static class DBACL
9292
{
9393
private const string DLL_NAME = "AnimeStudio.ACL.DB";
9494
private const string DLL_NAME_ZZZ = "AnimeStudio.ACL.ZZZ";
95+
private const string DLL_NAME_ZZZ_V2 = "AnimeStudio.ACL.ZZZV2";
9596
static DBACL()
9697
{
9798
// x64 only, so they live in the application directory rather than in x86/x64.
9899
DllLoader.PreloadDll(DLL_NAME, archSpecific: false);
99100
DllLoader.PreloadDll(DLL_NAME_ZZZ, archSpecific: false);
100101
}
102+
private static IntPtr AlignAndCopyData(byte[] data, out IntPtr base_ptr)
103+
{
104+
base_ptr = IntPtr.Zero;
105+
if (data == null)
106+
{
107+
return IntPtr.Zero;
108+
}
109+
base_ptr = Marshal.AllocHGlobal(data.Length + 8);
110+
var dataAligned = new IntPtr(16 * (((long)base_ptr + 15) / 16));
111+
Marshal.Copy(data, 0, dataAligned, data.Length);
112+
return dataAligned;
113+
}
114+
115+
public static void DecompressTracksV2(byte[] transform_data, byte[] scalar_data, byte[] db, byte[] db_bulk_data, out float[] values, out float[] times)
116+
{
117+
var decompressedClip = new DecompressedClip();
118+
119+
var transform_data_ptr = AlignAndCopyData(transform_data, out var transform_data_base_ptr);
120+
var scalar_data_ptr = AlignAndCopyData(scalar_data, out var scalar_data_base_ptr);
121+
var db_ptr = AlignAndCopyData(db, out var db_base_ptr);
122+
var db_bulk_data_ptr = AlignAndCopyData(db_bulk_data, out var db_bulk_data_base_ptr);
123+
124+
DecompressTracksZZZV2(transform_data_ptr, scalar_data_ptr, db_ptr, db_bulk_data_ptr, ref decompressedClip);
125+
126+
Marshal.FreeHGlobal(transform_data_base_ptr);
127+
Marshal.FreeHGlobal(scalar_data_base_ptr);
128+
Marshal.FreeHGlobal(db_base_ptr);
129+
Marshal.FreeHGlobal(db_bulk_data_base_ptr);
130+
131+
values = new float[decompressedClip.ValuesCount];
132+
Marshal.Copy(decompressedClip.Values, values, 0, decompressedClip.ValuesCount);
133+
134+
times = new float[decompressedClip.TimesCount];
135+
Marshal.Copy(decompressedClip.Times, times, 0, decompressedClip.TimesCount);
136+
137+
DisposeZZZV2(ref decompressedClip);
138+
}
101139
public static void DecompressTracks(byte[] data, byte[] db, out float[] values, out float[] times, bool isZZZ = false)
102140
{
103141
var decompressedClip = new DecompressedClip();
@@ -156,6 +194,11 @@ public static void DecompressTracks(byte[] data, byte[] db, out float[] values,
156194
[DllImport(DLL_NAME_ZZZ, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Dispose")]
157195
private static extern void DisposeZZZ(ref DecompressedClip decompressedClip);
158196

197+
[DllImport(DLL_NAME_ZZZ_V2, CallingConvention = CallingConvention.Cdecl, EntryPoint = "DecompressTracksZZZ")]
198+
private static extern void DecompressTracksZZZV2(nint transform_tracks, nint scalar_tracks, nint database, nint bulk_data, ref DecompressedClip decompressedClip);
199+
[DllImport(DLL_NAME_ZZZ, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Dispose")]
200+
private static extern void DisposeZZZV2(ref DecompressedClip decompressedClip);
201+
159202
#endregion
160203
}
161204
}

AnimeStudio.Utility/ACL/ACLExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ public static void Process(this ACLClip m_ACLClip, Game game, out float[] values
2929
ACL.DecompressClip(mhyaclClip.m_ClipData, out values, out times);
3030
}
3131

32+
break;
33+
case ZZZACLClip zzzaclClip:
34+
DBACL.DecompressTracksV2(zzzaclClip.m_TransformData, zzzaclClip.m_ScalarData, zzzaclClip.m_databaseData, zzzaclClip.m_DatabaseData, out values, out times);
3235
break;
3336
default:
3437
values = Array.Empty<float>();

AnimeStudio.Utility/AnimeStudio.Utility.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@
4848
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
4949
<TargetPath>AnimeStudio.ACL.MHY.dll</TargetPath>
5050
</ContentWithTargetPath>
51+
<ContentWithTargetPath Include="..\AnimeStudio.Libraries\AnimeStudio.ACL.ZZZV2.dll">
52+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
53+
<TargetPath>AnimeStudio.ACL.ZZZV2.dll</TargetPath>
54+
</ContentWithTargetPath>
5155
</ItemGroup>
5256

5357
</Project>

AnimeStudio/Classes/AnimationClip.cs

Lines changed: 73 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
namespace AnimeStudio
77
{
8+
public static class USE_ZZZ_ACL_V2
9+
{
10+
public static bool enabled = false; // switch to use the acl fix dll
11+
}
812
public class Keyframe<T> : IYAMLExportable where T : IYAMLExportable
913
{
1014
public float time;
@@ -908,6 +912,14 @@ public override void Read(ObjectReader reader)
908912
if (reader.Game.Type.IsZZZ())
909913
{
910914
m_databaseData = reader.ReadUInt8Array();
915+
if (m_databaseData.Length > 0)
916+
{
917+
var database_header_sz = BitConverter.ToUInt32(m_databaseData);
918+
if (m_databaseData.Length != (int)database_header_sz)
919+
{
920+
Logger.Warning($"m_databaseData buffer/header size mismatch: {m_databaseData.Length} != {database_header_sz}");
921+
}
922+
}
911923
}
912924
}
913925
}
@@ -1023,6 +1035,42 @@ public override void Read(ObjectReader reader)
10231035
}
10241036
}
10251037

1038+
public class ZZZACLClip : MHYACLClip
1039+
{
1040+
public byte[] m_DatabaseData;
1041+
1042+
public byte[] m_TransformData
1043+
{
1044+
get
1045+
{
1046+
var transform_data_size = (int)BitConverter.ToUInt32(m_ClipData, 0);
1047+
return (new ArraySegment<byte>(m_ClipData, 0, transform_data_size)).ToArray();
1048+
}
1049+
}
1050+
1051+
public byte[] m_ScalarData
1052+
{
1053+
get
1054+
{
1055+
var transform_data_size = (int)BitConverter.ToUInt32(m_ClipData, 0);
1056+
if (m_ClipData.Length > transform_data_size)
1057+
{
1058+
var scalar_data_offset = 16 * ((transform_data_size + 15) / 16);
1059+
1060+
if (m_ClipData.Length == scalar_data_offset)
1061+
{
1062+
Logger.Warning($"ZZZACLClip lacks scalar tracks. Proceeding without...");
1063+
return null;
1064+
}
1065+
1066+
var scalar_data_size = (int)BitConverter.ToUInt32(m_ClipData, scalar_data_offset);
1067+
return (new ArraySegment<byte>(m_ClipData, scalar_data_offset, scalar_data_size)).ToArray();
1068+
}
1069+
return null;
1070+
}
1071+
}
1072+
}
1073+
10261074
public class StreamedClip
10271075
{
10281076
public uint[] data;
@@ -1410,8 +1458,15 @@ public Clip(ObjectReader reader)
14101458
}
14111459
if (reader.Game.Type.IsGIGroup() || reader.Game.Type.IsBH3Group() || reader.Game.Type.IsZZZCB1() || reader.Game.Type.IsZZZ())
14121460
{
1413-
m_ACLClip = new MHYACLClip();
1414-
m_ACLClip.Read(reader);
1461+
if (reader.Game.Type.IsZZZ() && USE_ZZZ_ACL_V2.enabled)
1462+
{
1463+
m_ACLClip = new ZZZACLClip();
1464+
m_ACLClip.Read(reader);
1465+
} else
1466+
{
1467+
m_ACLClip = new MHYACLClip();
1468+
m_ACLClip.Read(reader);
1469+
}
14151470
}
14161471
if (reader.Game.Type.IsLoveAndDeepspace())
14171472
{
@@ -2204,21 +2259,29 @@ public AnimationClip(ObjectReader reader) : base(reader)
22042259
{
22052260
reader.AlignStream();
22062261
}
2207-
if (hasStreamingInfo)
2262+
if (hasStreamingInfo || reader.Game.Type.IsZZZ())
22082263
{
22092264
m_StreamData = new StreamingInfo(reader);
22102265
if (!string.IsNullOrEmpty(m_StreamData?.path))
22112266
{
2212-
var aclClip = m_MuscleClip.m_Clip.m_ACLClip as GIACLClip;
2267+
if (reader.Game.Type.IsGI())
2268+
{
2269+
var aclClip = m_MuscleClip.m_Clip.m_ACLClip as GIACLClip;
22132270

2214-
var resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, m_StreamData.size);
2215-
using var ms = new MemoryStream();
2216-
ms.Write(aclClip.m_DatabaseData);
2271+
var resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, m_StreamData.size);
2272+
using var ms = new MemoryStream();
2273+
ms.Write(aclClip.m_DatabaseData);
22172274

2218-
ms.Write(resourceReader.GetData());
2219-
ms.AlignStream();
2275+
ms.Write(resourceReader.GetData());
2276+
ms.AlignStream();
22202277

2221-
aclClip.m_DatabaseData = ms.ToArray();
2278+
aclClip.m_DatabaseData = ms.ToArray();
2279+
} else if (reader.Game.Type.IsZZZ() && USE_ZZZ_ACL_V2.enabled)
2280+
{
2281+
var aclClip = m_MuscleClip.m_Clip.m_ACLClip as ZZZACLClip;
2282+
var resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, m_StreamData.size);
2283+
aclClip.m_DatabaseData = resourceReader.GetData();
2284+
}
22222285
}
22232286
}
22242287
}

0 commit comments

Comments
 (0)