internal Mesh(BinaryReaderEx br, NGPVersion version) { Unk00 = br.ReadInt32(); br.ReadInt32(); // Length of this mesh (including child structs) Unk08 = br.ReadInt32(); if (version == NGPVersion.Scholar) { br.AssertInt32(0); } BoundingBoxMin = br.ReadVector3(); BoundingBoxMax = br.ReadVector3(); int vertexCount = br.ReadInt32(); short faceCount = br.ReadInt16(); short count30 = br.ReadInt16(); Unk30 = br.ReadInt16(); Unk32 = br.ReadInt16(); br.AssertByte(1); br.AssertByte(0); br.AssertByte(0); br.AssertByte(0); if (version == NGPVersion.Scholar) { br.AssertInt64(0); } long verticesOffset = br.ReadVarint(); long offset48 = br.ReadVarint(); long facesOffset = br.ReadVarint(); long offset58 = br.ReadVarint(); long offset60 = br.ReadVarint(); long offset68 = br.ReadVarint(); br.Position = verticesOffset; Vertices = new List <Vector3>(vertexCount); for (int i = 0; i < vertexCount; i++) { Vertices.Add(br.ReadVector3()); } br.Position = offset48; Struct2s = new List <int>(br.ReadInt32s(faceCount)); br.Position = facesOffset; Faces = new List <Face>(faceCount); for (int i = 0; i < faceCount; i++) { Faces.Add(new Face(br)); } br.Position = offset58; Struct4s = new List <Struct4>(count30); for (int i = 0; i < count30; i++) { Struct4s.Add(new Struct4(br)); } br.Position = offset60; Struct5Root = new Struct5(br, offset60, offset68); }
internal void Write(BinaryWriterEx bw, NGPVersion version) { long start = bw.Position; bw.WriteInt32(Unk00); bw.ReserveInt32("MeshLength"); bw.WriteInt32(Unk08); if (version == NGPVersion.Scholar) { bw.WriteInt32(0); } bw.WriteVector3(BoundingBoxMin); bw.WriteVector3(BoundingBoxMax); bw.WriteInt32(Vertices.Count); bw.WriteInt16((short)Faces.Count); bw.WriteInt16((short)Struct4s.Count); bw.WriteInt16(Unk30); bw.WriteInt16(Unk32); bw.WriteByte(1); bw.WriteByte(0); bw.WriteByte(0); bw.WriteByte(0); if (version == NGPVersion.Scholar) { bw.WriteInt64(0); } bw.ReserveVarint("VerticesOffset"); bw.ReserveVarint("Struct2sOffset"); bw.ReserveVarint("FacesOffset"); bw.ReserveVarint("Struct4sOffset"); bw.ReserveVarint("Struct5sOffset"); bw.ReserveVarint("Struct6sOffset"); bw.FillVarint("VerticesOffset", bw.Position); foreach (Vector3 vertex in Vertices) { bw.WriteVector3(vertex); } bw.Pad(bw.VarintSize); bw.FillVarint("Struct2sOffset", bw.Position); foreach (int struct2 in Struct2s) { bw.WriteInt32(struct2); } bw.Pad(bw.VarintSize); bw.FillVarint("FacesOffset", bw.Position); foreach (Face face in Faces) { face.Write(bw); } bw.Pad(bw.VarintSize); bw.FillVarint("Struct4sOffset", bw.Position); foreach (Struct4 struct4 in Struct4s) { struct4.Write(bw); } bw.Pad(bw.VarintSize); bw.FillVarint("Struct5sOffset", bw.Position); short index = 0; Struct5Root.Write(bw, ref index); bw.Pad(bw.VarintSize); bw.FillVarint("Struct6sOffset", bw.Position); index = 0; int faceIndexIndex = 0; Struct5Root.WriteFaceIndices(bw, ref index, ref faceIndexIndex); bw.Pad(bw.VarintSize); bw.FillInt32("MeshLength", (int)(bw.Position - start)); }