示例#1
0
        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());
                }
            });
        }
示例#2
0
        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());
                }
            });
        }