|
5 | 5 |
|
6 | 6 | namespace AnimeStudio |
7 | 7 | { |
| 8 | + public static class USE_ZZZ_ACL_V2 |
| 9 | + { |
| 10 | + public static bool enabled = false; // switch to use the acl fix dll |
| 11 | + } |
8 | 12 | public class Keyframe<T> : IYAMLExportable where T : IYAMLExportable |
9 | 13 | { |
10 | 14 | public float time; |
@@ -908,6 +912,14 @@ public override void Read(ObjectReader reader) |
908 | 912 | if (reader.Game.Type.IsZZZ()) |
909 | 913 | { |
910 | 914 | 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 | + } |
911 | 923 | } |
912 | 924 | } |
913 | 925 | } |
@@ -1023,6 +1035,42 @@ public override void Read(ObjectReader reader) |
1023 | 1035 | } |
1024 | 1036 | } |
1025 | 1037 |
|
| 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 | + |
1026 | 1074 | public class StreamedClip |
1027 | 1075 | { |
1028 | 1076 | public uint[] data; |
@@ -1410,8 +1458,15 @@ public Clip(ObjectReader reader) |
1410 | 1458 | } |
1411 | 1459 | if (reader.Game.Type.IsGIGroup() || reader.Game.Type.IsBH3Group() || reader.Game.Type.IsZZZCB1() || reader.Game.Type.IsZZZ()) |
1412 | 1460 | { |
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 | + } |
1415 | 1470 | } |
1416 | 1471 | if (reader.Game.Type.IsLoveAndDeepspace()) |
1417 | 1472 | { |
@@ -2204,21 +2259,29 @@ public AnimationClip(ObjectReader reader) : base(reader) |
2204 | 2259 | { |
2205 | 2260 | reader.AlignStream(); |
2206 | 2261 | } |
2207 | | - if (hasStreamingInfo) |
| 2262 | + if (hasStreamingInfo || reader.Game.Type.IsZZZ()) |
2208 | 2263 | { |
2209 | 2264 | m_StreamData = new StreamingInfo(reader); |
2210 | 2265 | if (!string.IsNullOrEmpty(m_StreamData?.path)) |
2211 | 2266 | { |
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; |
2213 | 2270 |
|
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); |
2217 | 2274 |
|
2218 | | - ms.Write(resourceReader.GetData()); |
2219 | | - ms.AlignStream(); |
| 2275 | + ms.Write(resourceReader.GetData()); |
| 2276 | + ms.AlignStream(); |
2220 | 2277 |
|
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 | + } |
2222 | 2285 | } |
2223 | 2286 | } |
2224 | 2287 | } |
|
0 commit comments