1 | using System;
|
---|
2 | using System.Collections.Generic;
|
---|
3 | using System.IO;
|
---|
4 | using System.Xml;
|
---|
5 |
|
---|
6 | namespace Oni.Level
|
---|
7 | {
|
---|
8 | internal partial class LevelImporter : Importer
|
---|
9 | {
|
---|
10 | private readonly TextWriter info;
|
---|
11 | private readonly TextWriter error;
|
---|
12 | private bool debug;
|
---|
13 | private string outputDirPath;
|
---|
14 | private LevelDatWriter.DatLevel level;
|
---|
15 | private string sharedPath;
|
---|
16 | private InstanceFileManager sharedManager;
|
---|
17 | private Dictionary<string, InstanceDescriptor> sharedCache;
|
---|
18 | private Dictionary<string, Dae.Scene> sceneCache;
|
---|
19 |
|
---|
20 | public LevelImporter()
|
---|
21 | {
|
---|
22 | info = Console.Out;
|
---|
23 | error = Console.Error;
|
---|
24 | }
|
---|
25 |
|
---|
26 | public bool Debug
|
---|
27 | {
|
---|
28 | get { return debug; }
|
---|
29 | set { debug = value; }
|
---|
30 | }
|
---|
31 |
|
---|
32 | public override void Import(string filePath, string outputDirPath)
|
---|
33 | {
|
---|
34 | this.outputDirPath = outputDirPath;
|
---|
35 | this.textureImporter = new Motoko.TextureImporter3(outputDirPath);
|
---|
36 |
|
---|
37 | Read(filePath);
|
---|
38 |
|
---|
39 | WriteLevel();
|
---|
40 | WriteObjects();
|
---|
41 | }
|
---|
42 |
|
---|
43 | private void Read(string filePath)
|
---|
44 | {
|
---|
45 | level = new LevelDatWriter.DatLevel();
|
---|
46 | level.name = Path.GetFileNameWithoutExtension(filePath);
|
---|
47 |
|
---|
48 | string basePath = Path.GetDirectoryName(filePath);
|
---|
49 |
|
---|
50 | var settings = new XmlReaderSettings {
|
---|
51 | IgnoreWhitespace = true,
|
---|
52 | IgnoreProcessingInstructions = true,
|
---|
53 | IgnoreComments = true
|
---|
54 | };
|
---|
55 |
|
---|
56 | using (var xml = XmlReader.Create(filePath, settings))
|
---|
57 | {
|
---|
58 | xml.ReadStartElement("Oni");
|
---|
59 | ReadLevel(xml, basePath);
|
---|
60 | xml.ReadEndElement();
|
---|
61 | }
|
---|
62 |
|
---|
63 | ImportModel(basePath);
|
---|
64 | }
|
---|
65 |
|
---|
66 | private void ReadLevel(XmlReader xml, string basePath)
|
---|
67 | {
|
---|
68 | string path = xml.GetAttribute("SharedPath");
|
---|
69 |
|
---|
70 | if (!string.IsNullOrEmpty(path))
|
---|
71 | sharedPath = Path.GetFullPath(Path.Combine(basePath, path));
|
---|
72 | else
|
---|
73 | sharedPath = Path.GetFullPath(Path.Combine(basePath, "classes"));
|
---|
74 |
|
---|
75 | sharedManager = new InstanceFileManager();
|
---|
76 | sharedManager.AddSearchPath(sharedPath);
|
---|
77 |
|
---|
78 | string name = xml.GetAttribute("Name");
|
---|
79 |
|
---|
80 | if (!string.IsNullOrEmpty(name))
|
---|
81 | level.name = name;
|
---|
82 |
|
---|
83 | xml.ReadStartElement("Level");
|
---|
84 |
|
---|
85 | ReadModel(xml, basePath);
|
---|
86 | ReadSky(xml, basePath);
|
---|
87 | ReadObjects(xml, basePath);
|
---|
88 | ReadFilms(xml, basePath);
|
---|
89 | ReadCameras(xml, basePath);
|
---|
90 |
|
---|
91 | xml.ReadEndElement();
|
---|
92 | }
|
---|
93 |
|
---|
94 | private void WriteLevel()
|
---|
95 | {
|
---|
96 | BeginImport();
|
---|
97 | LevelDatWriter.Write(this, level);
|
---|
98 | Write(outputDirPath);
|
---|
99 | textureImporter.Write();
|
---|
100 | }
|
---|
101 |
|
---|
102 | private Dae.Scene LoadScene(string filePath)
|
---|
103 | {
|
---|
104 | if (sceneCache == null)
|
---|
105 | {
|
---|
106 | sceneCache = new Dictionary<string, Dae.Scene>(StringComparer.OrdinalIgnoreCase);
|
---|
107 | }
|
---|
108 |
|
---|
109 | filePath = Path.GetFullPath(filePath);
|
---|
110 | Dae.Scene scene;
|
---|
111 |
|
---|
112 | if (!sceneCache.TryGetValue(filePath, out scene))
|
---|
113 | {
|
---|
114 | scene = Dae.Reader.ReadFile(filePath);
|
---|
115 | sceneCache.Add(filePath, scene);
|
---|
116 | }
|
---|
117 |
|
---|
118 | return scene;
|
---|
119 | }
|
---|
120 |
|
---|
121 | private InstanceDescriptor FindSharedInstance(TemplateTag tag, string name)
|
---|
122 | {
|
---|
123 | if (sharedCache == null)
|
---|
124 | sharedCache = new Dictionary<string, InstanceDescriptor>(StringComparer.Ordinal);
|
---|
125 |
|
---|
126 | string fullName = tag.ToString() + name;
|
---|
127 | InstanceDescriptor descriptor;
|
---|
128 |
|
---|
129 | if (!sharedCache.TryGetValue(fullName, out descriptor))
|
---|
130 | {
|
---|
131 | var file = sharedManager.FindInstance(fullName);
|
---|
132 |
|
---|
133 | if (file == null)
|
---|
134 | error.WriteLine("Could not find {0} instance {1}", tag, name);
|
---|
135 | else if (file.Descriptors[0].Template.Tag != tag)
|
---|
136 | error.WriteLine("Found '{0}' but its type {1} doesn't match the expected type {2}", name, file.Descriptors[0].Template.Tag, tag);
|
---|
137 | else
|
---|
138 | descriptor = file.Descriptors[0];
|
---|
139 |
|
---|
140 | sharedCache.Add(fullName, descriptor);
|
---|
141 | }
|
---|
142 |
|
---|
143 | return descriptor;
|
---|
144 | }
|
---|
145 | }
|
---|
146 | }
|
---|