| 1 | using System; | 
 
 
 
 
 | 2 | using System.IO; | 
 
 
 
 
 | 3 | using System.Xml; | 
 
 
 
 
 | 4 | using Oni.Metadata; | 
 
 
 
 
 | 5 |  | 
 
 
 
 
 | 6 | namespace Oni.Xml | 
 
 
 
 
 | 7 | { | 
 
 
 
 
 | 8 | internal class FilmToXmlConverter : RawXmlExporter | 
 
 
 
 
 | 9 | { | 
 
 
 
 
 | 10 | public FilmToXmlConverter(BinaryReader reader, XmlWriter writer) | 
 
 
 
 
 | 11 | : base(reader, writer) | 
 
 
 
 
 | 12 | { | 
 
 
 
 
 | 13 | } | 
 
 
 
 
 | 14 |  | 
 
 
 
 
 | 15 | private static readonly MetaType filmHeader = new MetaStruct("FilmHeader", | 
 
 
 
 
 | 16 | new Field(MetaType.Vector3, "Position"), | 
 
 
 
 
 | 17 | new Field(MetaType.Float, "Facing"), | 
 
 
 
 
 | 18 | new Field(MetaType.Float, "DesiredFacing"), | 
 
 
 
 
 | 19 | new Field(MetaType.Float, "HeadFacing"), | 
 
 
 
 
 | 20 | new Field(MetaType.Float, "HeadPitch"), | 
 
 
 
 
 | 21 | new Field(MetaType.Int32, "FrameCount"), | 
 
 
 
 
 | 22 | new Field(MetaType.Padding(28))); | 
 
 
 
 
 | 23 |  | 
 
 
 
 
 | 24 | private static readonly MetaType filmAnimations = new MetaStruct("FilmAnimations", | 
 
 
 
 
 | 25 | new Field(MetaType.Array(2, MetaType.String128), "Animations")); | 
 
 
 
 
 | 26 |  | 
 
 
 
 
 | 27 | private static readonly MetaType filmFrames = new MetaStruct("FilmFrames", | 
 
 
 
 
 | 28 | new Field(MetaType.VarArray(new MetaStruct("Frame", | 
 
 
 
 
 | 29 | new Field(MetaType.Vector2, "MouseDelta"), | 
 
 
 
 
 | 30 | new Field(MetaType.Enum<InstanceMetadata.FILMKeys>(), "Keys"), | 
 
 
 
 
 | 31 | new Field(MetaType.Int32, "Frame"), | 
 
 
 
 
 | 32 | new Field(MetaType.Padding(4)) | 
 
 
 
 
 | 33 | )), "Frames") | 
 
 
 
 
 | 34 | ); | 
 
 
 
 
 | 35 |  | 
 
 
 
 
 | 36 | public static void Convert(string filePath, string outputDirPath) | 
 
 
 
 
 | 37 | { | 
 
 
 
 
 | 38 | using (var reader = new BinaryReader(filePath, true)) | 
 
 
 
 
 | 39 | using (var writer = CreateXmlWriter(Path.Combine(outputDirPath, Path.GetFileNameWithoutExtension(filePath) + ".xml"))) | 
 
 
 
 
 | 40 | { | 
 
 
 
 
 | 41 | writer.WriteStartElement("Instance"); | 
 
 
 
 
 | 42 | writer.WriteAttributeString("id", "0"); | 
 
 
 
 
 | 43 | writer.WriteAttributeString("type", "FILM"); | 
 
 
 
 
 | 44 |  | 
 
 
 
 
 | 45 | var converter = new FilmToXmlConverter(reader, writer); | 
 
 
 
 
 | 46 |  | 
 
 
 
 
 | 47 | reader.Position = filmAnimations.Size; | 
 
 
 
 
 | 48 | filmHeader.Accept(converter); | 
 
 
 
 
 | 49 |  | 
 
 
 
 
 | 50 | reader.Position = 0; | 
 
 
 
 
 | 51 | filmAnimations.Accept(converter); | 
 
 
 
 
 | 52 |  | 
 
 
 
 
 | 53 | reader.Position = filmAnimations.Size + filmHeader.Size; | 
 
 
 
 
 | 54 | filmFrames.Accept(converter); | 
 
 
 
 
 | 55 |  | 
 
 
 
 
 | 56 | writer.WriteEndElement(); | 
 
 
 
 
 | 57 | } | 
 
 
 
 
 | 58 | } | 
 
 
 
 
 | 59 |  | 
 
 
 
 
 | 60 | private static XmlWriter CreateXmlWriter(string filePath) | 
 
 
 
 
 | 61 | { | 
 
 
 
 
 | 62 | var settings = new XmlWriterSettings | 
 
 
 
 
 | 63 | { | 
 
 
 
 
 | 64 | CloseOutput = true, | 
 
 
 
 
 | 65 | Indent = true, | 
 
 
 
 
 | 66 | IndentChars = "    " | 
 
 
 
 
 | 67 | }; | 
 
 
 
 
 | 68 |  | 
 
 
 
 
 | 69 | var stream = File.Create(filePath); | 
 
 
 
 
 | 70 | var writer = XmlWriter.Create(stream, settings); | 
 
 
 
 
 | 71 |  | 
 
 
 
 
 | 72 | try | 
 
 
 
 
 | 73 | { | 
 
 
 
 
 | 74 | writer.WriteStartElement("Oni"); | 
 
 
 
 
 | 75 | } | 
 
 
 
 
 | 76 | catch | 
 
 
 
 
 | 77 | { | 
 
 
 
 
 | 78 | #if NETCORE | 
 
 
 
 
 | 79 | writer.Dispose(); | 
 
 
 
 
 | 80 | #else | 
 
 
 
 
 | 81 | writer.Close(); | 
 
 
 
 
 | 82 | #endif | 
 
 
 
 
 | 83 | throw; | 
 
 
 
 
 | 84 | } | 
 
 
 
 
 | 85 |  | 
 
 
 
 
 | 86 | return writer; | 
 
 
 
 
 | 87 | } | 
 
 
 
 
 | 88 | } | 
 
 
 
 
 | 89 | } |