2 using System.Collections.Generic;
\r
5 using System.Text.RegularExpressions;
\r
11 private delegate bool SectionHandler(string[] tokens);
\r
13 public static char[] delimiters = new char[]{' ', '\t'};
\r
14 public static char[] delimiters2 = new char[]{' ', '\t', '(', ')'};
\r
16 private string file;
\r
17 private StreamReader sr;
\r
18 private MqoScene scene;
\r
19 private List<MqoMaterial> materials;
\r
20 private List<MqoObject> objects = new List<MqoObject>();
\r
21 private MqoObject current;
\r
23 public MqoScene Scene { get { return scene; } }
\r
24 public List<MqoMaterial> Materials { get { return materials; } }
\r
25 public List<MqoObject> Objects { get { return objects; } }
\r
27 public void Load(string file)
\r
29 using(FileStream fs= File.OpenRead(file))
\r
32 sr = new StreamReader(fs, Encoding.Default);
\r
39 System.Diagnostics.Debug.WriteLine(file);
\r
40 System.Diagnostics.Debug.WriteLine(scene);
\r
42 foreach(MqoMaterial i in materials)
\r
43 System.Diagnostics.Debug.WriteLine(i);
\r
45 foreach(MqoObject i in objects)
\r
46 System.Diagnostics.Debug.WriteLine(i);
\r
49 public void ReadAll()
\r
51 DoRead(SectionRoot);
\r
54 private static string[] SplitString(string s)
\r
56 List<string> tokens = new List<string>();
\r
57 StringBuilder sb = new StringBuilder(s.Length);
\r
59 bool escape = false;
\r
60 bool bracket= false;
\r
61 s = s.Trim(' ', '\t', '\r', '\n');
\r
63 foreach(char i in s)
\r
76 if(str) sb.Append(i);
\r
81 if(bracket) {sb.Append(i); }
\r
82 else if(str) {sb.Append(i); }
\r
83 else if(sb.Length > 0) {tokens.Add(sb.ToString()); sb.Length= 0; }
\r
106 tokens.Add(sb.ToString());
\r
108 return tokens.ToArray();
\r
111 private void DoRead(SectionHandler h)
\r
113 for(int no= 1;; ++no)
\r
115 string line= sr.ReadLine();
\r
120 line = line.Trim();
\r
121 string[] tokens = SplitString(line);
\r
125 if(tokens.Length == 0)
\r
130 } catch(Exception e)
\r
132 string msg = string.Format("File format error: {0} \"{1}\"", no, line);
\r
133 throw new Exception(msg, e);
\r
138 public void Error(string[] tokens)
\r
140 throw new Exception("File Format Error: \"" + string.Concat(tokens) + "\"");
\r
143 private bool SectionRoot(string[] tokens)
\r
145 switch(tokens[0].ToLower())
\r
147 case "metasequoia": ParseMetasequoia(tokens); return true;
\r
148 case "format": ParseFormat (tokens); return true;
\r
149 case "scene": ParseScene (tokens); return true;
\r
150 case "material": ParseMaterial (tokens); return true;
\r
151 case "object": ParseObject (tokens); return true;
\r
152 case "eof": return false;
\r
153 //default: Error(tokens); return false;
\r
154 default: return true;
\r
158 private bool SectionScene(string[] tokens)
\r
160 scene = new MqoScene();
\r
162 switch(tokens[0].ToLower())
\r
164 case "pos": scene.pos = Point3.Parse(tokens, 1); return true;
\r
165 case "lookat": scene.lookat = Point3.Parse(tokens, 1); return true;
\r
166 case "head": scene.head = float .Parse(tokens[1]); return true;
\r
167 case "pich": scene.pich = float .Parse(tokens[1]); return true;
\r
168 case "ortho": scene.ortho = float .Parse(tokens[1]); return true;
\r
169 case "zoom2": scene.zoom2 = float .Parse(tokens[1]); return true;
\r
170 case "amb": scene.amb = Color3.Parse(tokens, 1); return true;
\r
171 case "}": return false;
\r
172 //default: Error(tokens); return false;
\r
173 default: return true;
\r
177 private static string[] SplitParam(string s)
\r
179 return s.Split(delimiters2, StringSplitOptions.RemoveEmptyEntries);
\r
182 private bool SectionMaterial(string[] tokens)
\r
184 if(tokens[0] == "}")
\r
187 StringBuilder sb = new StringBuilder();
\r
189 foreach(string i in tokens)
\r
190 sb.Append(' ').Append(i);
\r
192 string line= sb.ToString().Trim();
\r
193 MqoMaterial m = new MqoMaterial(tokens[0].Trim('"'));
\r
194 tokens = SplitString(line);
\r
197 for(int i= 1 ; i < tokens.Length; ++i)
\r
199 string t = tokens[i];
\r
200 string t2 = t.ToLower();
\r
202 if(t2.StartsWith("shader(")) m.shader = int .Parse(SplitParam(t)[1]);
\r
203 else if(t2.StartsWith("col(")) m.col = Color3.Parse(SplitParam(t), 1);
\r
204 else if(t2.StartsWith("dif(")) m.dif = float .Parse(SplitParam(t)[1]);
\r
205 else if(t2.StartsWith("amb(")) m.amb = float .Parse(SplitParam(t)[1]);
\r
206 else if(t2.StartsWith("emi(")) m.emi = float .Parse(SplitParam(t)[1]);
\r
207 else if(t2.StartsWith("spc(")) m.spc = float .Parse(SplitParam(t)[1]);
\r
208 else if(t2.StartsWith("power(")) m.power = float .Parse(SplitParam(t)[1]);
\r
209 else if(t2.StartsWith("tex(")) m.tex = t.Substring(3).Trim('(', ')', '"');
\r
215 private bool SectionObject(string[] tokens)
\r
217 switch(tokens[0].ToLower())
\r
219 case "visible": current.visible = int .Parse(tokens[1]); return true;
\r
220 case "locking": current.locking = int .Parse(tokens[1]); return true;
\r
221 case "shading": current.shading = int .Parse(tokens[1]); return true;
\r
222 case "facet": current.facet = float .Parse(tokens[1]); return true;
\r
223 case "color": current.color = Color3.Parse(tokens, 1); return true;
\r
224 case "color_type": current.color_type = int .Parse(tokens[1]); return true;
\r
225 case "vertex": ParseVertex(tokens); return true;
\r
226 case "face": ParseFace(tokens); return true;
\r
227 case "}": return false;
\r
228 //default: Error(tokens); return false;
\r
229 default: return true;
\r
233 private bool SectionVertex(string[] tokens)
\r
235 if (tokens[0] == "}")
\r
238 current.vertices.Add(Point3.Parse(tokens, 0));
\r
243 private bool SectionFace(string[] tokens)
\r
245 if (tokens[0] == "}")
\r
248 int nface = int.Parse(tokens[0]);
\r
250 StringBuilder sb = new StringBuilder();
\r
251 foreach (string i in tokens)
\r
252 sb.Append(' ').Append(i);
\r
253 string line = sb.ToString().Trim();
\r
254 tokens = SplitString(line);
\r
260 MqoFace f = new MqoFace();
\r
262 for (int i = 1; i < tokens.Length; ++i)
\r
264 string t = tokens[i];
\r
265 string t2 = t.ToLower();
\r
267 if (t2.StartsWith("v("))
\r
269 string[] t3 = SplitParam(t);
\r
270 f.a = ushort.Parse(t3[1]);
\r
271 f.b = ushort.Parse(t3[2]);
\r
272 f.c = ushort.Parse(t3[3]);
\r
275 if (t2.StartsWith("m("))
\r
277 string[] t3 = SplitParam(t);
\r
278 f.mtl = ushort.Parse(t3[1]);
\r
281 if (t2.StartsWith("uv("))
\r
283 string[] t3 = SplitParam(t);
\r
284 f.ta = Point2.Parse(t3, 1);
\r
285 f.tb = Point2.Parse(t3, 3);
\r
286 f.tc = Point2.Parse(t3, 5);
\r
289 current.faces.Add(f);
\r
294 MqoFace f = new MqoFace();
\r
295 MqoFace f2 = new MqoFace();
\r
297 for (int i = 1; i < tokens.Length; ++i)
\r
299 string t = tokens[i];
\r
300 string t2 = t.ToLower();
\r
302 if (t2.StartsWith("v("))
\r
304 string[] t3 = SplitParam(t);
\r
305 f.a = ushort.Parse(t3[1]);
\r
306 f.b = ushort.Parse(t3[2]);
\r
307 f.c = ushort.Parse(t3[3]);
\r
310 f2.c = ushort.Parse(t3[4]);
\r
313 if (t2.StartsWith("m("))
\r
315 string[] t3 = SplitParam(t);
\r
316 f.mtl = ushort.Parse(t3[1]);
\r
320 if (t2.StartsWith("uv("))
\r
322 string[] t3 = SplitParam(t);
\r
323 f.ta = Point2.Parse(t3, 1);
\r
324 f.tb = Point2.Parse(t3, 3);
\r
325 f.tc = Point2.Parse(t3, 5);
\r
328 f2.tc = Point2.Parse(t3, 7);
\r
331 current.faces.Add(f);
\r
332 current.faces.Add(f2);
\r
339 //----- Root elements ----------------------------------------------
\r
340 private void ParseMetasequoia(string[] tokens)
\r
342 if(tokens[1].ToLower() != "document") Error(tokens);
\r
345 private void ParseFormat(string[] tokens)
\r
347 if(tokens[1].ToLower() != "text") Error(tokens);
\r
348 if(tokens[2].ToLower() != "ver") Error(tokens);
\r
349 if(tokens[3].ToLower() != "1.0") Error(tokens);
\r
352 private void ParseScene(string[] tokens)
\r
354 if(tokens[1].ToLower() != "{") Error(tokens);
\r
356 DoRead(SectionScene);
\r
359 private void ParseMaterial(string[] tokens)
\r
361 if(tokens[2].ToLower() != "{") Error(tokens);
\r
363 materials = new List<MqoMaterial>(int.Parse(tokens[1]));
\r
364 DoRead(SectionMaterial);
\r
367 private void ParseObject(string[] tokens)
\r
369 if(tokens[2].ToLower() != "{") Error(tokens);
\r
371 current = new MqoObject(tokens[1].Trim('"'));
\r
372 objects.Add(current);
\r
373 DoRead(SectionObject);
\r
376 private void ParseVertex(string[] tokens)
\r
378 if(tokens[2].ToLower() != "{") Error(tokens);
\r
380 current.vertices = new List<Point3>(int.Parse(tokens[1]));
\r
381 DoRead(SectionVertex);
\r
384 private void ParseFace(string[] tokens)
\r
386 if(tokens[2].ToLower() != "{") Error(tokens);
\r
388 current.faces = new List<MqoFace>(int.Parse(tokens[1]));
\r
389 DoRead(SectionFace);
\r
393 public class MqoScene
\r
396 public Point3 lookat;
\r
399 public float ortho;
\r
400 public float zoom2;
\r
403 public override string ToString()
\r
405 return (new StringBuilder(256))
\r
406 .Append(" pos: ") .Append(pos)
\r
407 .Append(" lookat: ").Append(lookat)
\r
408 .Append(" head: ") .Append(head)
\r
409 .Append(" pich: ") .Append(pich)
\r
410 .Append(" ortho: ") .Append(ortho)
\r
411 .Append(" zoom2: ") .Append(zoom2)
\r
412 .Append(" amb: ") .Append(amb)
\r
417 public class MqoMaterial
\r
419 public string name;
\r
426 public float power;
\r
429 public MqoMaterial() { }
\r
430 public MqoMaterial(string n) { name= n; }
\r
432 public override string ToString()
\r
434 return (new StringBuilder(256))
\r
435 .Append(" shader: ").Append(shader)
\r
436 .Append(" col: ") .Append(col)
\r
437 .Append(" dif: ") .Append(dif)
\r
438 .Append(" amb: ") .Append(amb)
\r
439 .Append(" emi: ") .Append(emi)
\r
440 .Append(" spc: ") .Append(spc)
\r
441 .Append(" power: ") .Append(power)
\r
442 .Append(" tex: ") .Append(tex)
\r
443 .Append(" name: ") .Append(name)
\r
448 public class MqoObject
\r
450 public string name;
\r
451 public int visible;
\r
452 public int locking;
\r
453 public int shading;
\r
454 public float facet;
\r
455 public Color3 color;
\r
456 public int color_type;
\r
457 public List<Point3> vertices;
\r
458 public List<MqoFace> faces;
\r
460 public MqoObject() { }
\r
461 public MqoObject(string n) { name= n; }
\r
463 public override string ToString()
\r
465 return (new StringBuilder(256))
\r
466 .Append(" visible: ") .Append(visible)
\r
467 .Append(" locking: ") .Append(locking)
\r
468 .Append(" shading: ") .Append(shading)
\r
469 .Append(" facet: ") .Append(facet)
\r
470 .Append(" color: ") .Append(color)
\r
471 .Append(" color_type: ").Append(color_type)
\r
472 .Append(" vertices: ") .Append(vertices.Count)
\r
473 .Append(" faces: ") .Append(faces.Count)
\r
474 .Append(" name: ") .Append(name)
\r
479 public class MqoFace
\r
481 public ushort a, b, c, mtl;
\r
482 public Point2 ta, tb, tc;
\r
488 public MqoFace(ushort a, ushort b, ushort c, ushort mtl, Point2 ta, Point2 tb, Point2 tc)
\r
499 public override string ToString()
\r
501 return (new StringBuilder(256))
\r
502 .Append("v: ") .Append(a).Append(" ").Append(b).Append(" ").Append(c)
\r
503 .Append(" mtl: ").Append(mtl)
\r
504 .Append(" uv: ") .Append(ta).Append(" ").Append(tb).Append(" ").Append(tc)
\r