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 | }
|
---|