Esempio n. 1
0
            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);
            }
Esempio n. 2
0
            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));
            }