From ec8a3c82a30320a098765b1a856bb8ded99b361c Mon Sep 17 00:00:00 2001 From: MattNL Date: Sat, 4 Mar 2023 01:54:21 -0500 Subject: [PATCH] Created MaterialsFile IO methods --- .../Classes/IO/Materials/MaterialsReader.cs | 42 +++++++++++++++++++ .../Classes/IO/Materials/MaterialsWriter.cs | 39 +++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 PCK-Studio/Classes/IO/Materials/MaterialsReader.cs create mode 100644 PCK-Studio/Classes/IO/Materials/MaterialsWriter.cs diff --git a/PCK-Studio/Classes/IO/Materials/MaterialsReader.cs b/PCK-Studio/Classes/IO/Materials/MaterialsReader.cs new file mode 100644 index 00000000..39049108 --- /dev/null +++ b/PCK-Studio/Classes/IO/Materials/MaterialsReader.cs @@ -0,0 +1,42 @@ +using PckStudio.Classes.FileTypes; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PckStudio.Classes.IO.Materials +{ + public class MaterialsReader : StreamDataReader + { + public static MaterialsFile Read(Stream stream) + { + return new MaterialsReader().ReadFromStream(stream); + } + + protected MaterialsReader() : base(false) // Doesn't seem that Behaviours uses little endian + { + } + + protected override MaterialsFile ReadFromStream(Stream stream) + { + MaterialsFile materialsFile = new MaterialsFile(); + _ = ReadInt(stream); + int entryCount = ReadInt(stream); + for (int i = 0; i < entryCount; i++) + { + string name = ReadString(stream); + string material_type = ReadString(stream); + materialsFile.entries.Add(new MaterialsFile.MaterialEntry(name, material_type)); + } + return materialsFile; + } + + private string ReadString(Stream stream) + { + short length = ReadShort(stream); + return ReadString(stream, length, Encoding.ASCII); + } + } +} diff --git a/PCK-Studio/Classes/IO/Materials/MaterialsWriter.cs b/PCK-Studio/Classes/IO/Materials/MaterialsWriter.cs new file mode 100644 index 00000000..d3a367a4 --- /dev/null +++ b/PCK-Studio/Classes/IO/Materials/MaterialsWriter.cs @@ -0,0 +1,39 @@ +using PckStudio.Classes.FileTypes; +using System; +using System.IO; +using System.Text; + +namespace PckStudio.Classes.IO.Materials +{ + internal class MaterialsWriter : StreamDataWriter + { + private MaterialsFile materialsFile; + + public static void Write(Stream stream, MaterialsFile file) + { + new MaterialsWriter(file).WriteToStream(stream); + } + + public MaterialsWriter(MaterialsFile file) : base(false) + { + materialsFile = file; + } + + protected override void WriteToStream(Stream stream) + { + WriteInt(stream, 0); + WriteInt(stream, materialsFile.entries.Count); + foreach (var entry in materialsFile.entries) + { + WriteString(stream, entry.name); + WriteString(stream, entry.material_type); + } + } + + private void WriteString(Stream stream, string s) + { + WriteShort(stream, (short)s.Length); + WriteString(stream, s, Encoding.ASCII); + } + } +} \ No newline at end of file