public override void Read(EndianBinaryReader reader, ISection section = null) { uint signature = reader.ReadUInt32(); if (signature != 0x5062500 && signature != 0x5062501) { throw new InvalidDataException("Invalid signature (expected 0x5062500 or 0x5062501)"); } int meshCount = reader.ReadInt32(); int globalBoneCount = reader.ReadInt32(); long meshesOffset = reader.ReadOffset(); long meshSkinningsOffset = reader.ReadOffset(); long meshNamesOffset = reader.ReadOffset(); long meshIdsOffset = reader.ReadOffset(); long textureIdsOffset = reader.ReadOffset(); int textureIdCount = reader.ReadInt32(); reader.ReadAtOffsetIf(section == null, meshesOffset, () => { Meshes.Capacity = meshCount; for (int i = 0; i < meshCount; i++) { reader.ReadOffset(() => { reader.PushBaseOffset(); { var mesh = new Mesh(); mesh.Read(reader); Meshes.Add(mesh); } reader.PopBaseOffset(); }); } }); reader.ReadAtOffsetIf(section == null, meshSkinningsOffset, () => { foreach (var mesh in Meshes) { reader.ReadOffset(() => { mesh.Skin = new Skin(); mesh.Skin.Read(reader); }); } }); reader.ReadAtOffset(meshNamesOffset, () => { foreach (var mesh in Meshes) { mesh.Name = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); } }); reader.ReadAtOffset(meshIdsOffset, () => { foreach (var mesh in Meshes) { mesh.Id = reader.ReadInt32(); } }); reader.ReadAtOffset(textureIdsOffset, () => { TextureIds.Capacity = textureIdCount; for (int i = 0; i < textureIdCount; i++) { TextureIds.Add(reader.ReadInt32()); } }); }
public override void Read(EndianBinaryReader reader, ISection section = null) { uint signature = reader.ReadUInt32(); if (signature != 0x5062500 && signature != 0x5062501) { throw new InvalidDataException("Invalid signature (expected 0x5062500 or 0x5062501)"); } int meshCount = reader.ReadInt32(); int globalBoneCount = reader.ReadInt32(); long meshesOffset = reader.ReadOffset(); long meshSkinningsOffset = reader.ReadOffset(); long meshNamesOffset = reader.ReadOffset(); long meshIDsOffset = reader.ReadOffset(); long textureIDsOffset = reader.ReadOffset(); int textureIDCount = reader.ReadInt32(); // We are reading only if there's no section provided. // The MeshSection class already parses the meshes. // For classic formats, this won't be done, so we will be parsing them ourselves. reader.ReadAtOffsetIf(section == null, meshesOffset, () => { Meshes.Capacity = meshCount; for (int i = 0; i < meshCount; i++) { reader.ReadOffset(() => { reader.PushBaseOffset(); { var mesh = new Mesh(); mesh.Read(reader); Meshes.Add(mesh); } reader.PopBaseOffset(); }); } }); reader.ReadAtOffsetIf(section == null, meshSkinningsOffset, () => { foreach (var mesh in Meshes) { reader.ReadOffset(() => { mesh.Skin = new MeshSkin(); mesh.Skin.Read(reader); }); } }); reader.ReadAtOffset(meshNamesOffset, () => { foreach (var mesh in Meshes) { mesh.Name = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); } }); reader.ReadAtOffset(meshIDsOffset, () => { foreach (var mesh in Meshes) { mesh.ID = reader.ReadInt32(); } }); reader.ReadAtOffset(textureIDsOffset, () => { TextureIDs.Capacity = textureIDCount; for (int i = 0; i < textureIDCount; i++) { TextureIDs.Add(reader.ReadInt32()); } }); }