-
Notifications
You must be signed in to change notification settings - Fork 0
/
SGAFile.cs
45 lines (44 loc) · 1.61 KB
/
SGAFile.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using ThemModdingHerds.IO.Binary;
using ThemModdingHerds.Levels.SGA;
namespace ThemModdingHerds.Levels;
public class SGAFile
{
public const string VERSION = "3.0";
public string Version {get; set;} = VERSION;
// TODO: dafuq is this?
public uint Unknown {get; set;}
public float AnimationLengthInSeconds {get; set;}
public List<Bone> Bones {get; set;} = [];
public List<UVTrack> UVTracks {get; set;} = [];
}
public static class SGAFileExt
{
public static SGAFile ReadSGAFile(this Reader reader)
{
reader.Endianness = IO.Endianness.Big;
SGAFile file = new()
{
Version = reader.ReadPascal64String(),
Unknown = reader.ReadUInt()
};
if(file.Version != SGAFile.VERSION)
throw new Exception($"SGI version mismatch: got '{file.Version}', expected '{SGAFile.VERSION}'");
ulong bones = reader.ReadULong();
ulong tracks = reader.ReadULong();
file.AnimationLengthInSeconds = reader.ReadFloat();
file.Bones.AddRange(reader.ReadSGABones(bones));
file.UVTracks.AddRange(reader.ReadSGAUVTracks(tracks));
return file;
}
public static void Write(this Writer writer,SGAFile file)
{
writer.Endianness = IO.Endianness.Big;
writer.WritePascal64String(file.Version);
writer.Write(file.Unknown);
writer.Write(file.AnimationLengthInSeconds);
writer.Write((ulong)file.Bones.Count);
writer.Write((ulong)file.UVTracks.Count);
writer.Write(file.Bones);
writer.Write(file.UVTracks);
}
}