public void Read(FileReader reader) { reader.ReadSignature(4, "GMX2"); reader.SetByteOrder(true); HeaderSize = reader.ReadUInt32(); while (reader.Position < reader.BaseStream.Length) { long pos = reader.Position; string Magic = reader.ReadString(4); uint SectionSize = reader.ReadUInt32(); reader.SeekBegin(pos); switch (Magic) { case "PADX": PADX padding = new PADX(); padding.Read(reader); break; case "INDX": INDX indexGrp = new INDX(); indexGrp.Read(reader, GetLastMesh()); GetLastMesh().IndexGroup = indexGrp; break; case "VMAP": VMAP vmap = new VMAP(); vmap.Read(reader); GetLastMesh().VMapGroup = vmap; break; case "MESH": MESH mesh = new MESH(); mesh.Read(reader); Meshes.Add(mesh); Console.WriteLine($"MESH {mesh.VertexCount} {mesh.FaceCount} {mesh.SkinningFlags} {mesh.VertexSize}"); break; case "VERT": VERT vert = new VERT(); vert.Read(reader, GetLastMesh()); GetLastMesh().VertexGroup = vert; break; case "ENDX": reader.ReadSignature(4, "ENDX"); uint EndSectionSize = reader.ReadUInt32(); break; default: throw new Exception("Unknown section! " + Magic); } reader.SeekBegin(pos + SectionSize); } Console.WriteLine("MESHES " + Meshes.Count); }
public void Write(FileWriter writer) { writer.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian; PADX padding = new PADX(); Console.WriteLine("Saving GMX"); writer.WriteSignature("GMX2"); writer.Write(HeaderSize); for (int i = 0; i < Meshes.Count; i++) { //Write mesh header padding.Write(writer, 32); Meshes[i].Write(writer); if (Meshes[i].VertexGroup != null) { //Write Vertices padding.Write(writer, 64); Meshes[i].VertexGroup.Write(writer, Meshes[i]); } if (Meshes[i].IndexGroup != null) { //Write Faces padding.Write(writer, 64); Meshes[i].IndexGroup.Write(writer); } if (Meshes[i].VMapGroup != null) { //Write VMAPS padding.Write(writer, 32); Meshes[i].VMapGroup.Write(writer); } } writer.WriteSignature("ENDX"); writer.Write(8); //Last section size writer.Close(); writer.Dispose(); }