public static MqDocument Parse(string text) { var rt = new MqDocument(); var tokenizer = new MqTokenizer(text); var header = new[] { "Metasequoia", "Document", "\n", "Format", "Text", "Ver" }; if (!tokenizer.Take(header.Length).Select(_ => _.Text).SequenceEqual(header)) { throw new InvalidOperationException("invalid format"); } rt.Version = float.Parse(tokenizer.MoveNext().EnsureKind(MqTokenizer.DigitTokenKind).Text); if (rt.Version >= 2) { throw new NotSupportedException("specified format version not supported"); } foreach (var i in tokenizer) { if (i.Kind == MqTokenizer.IdentifierTokenKind) { var chunk = MqChunk.Parse(tokenizer); switch (chunk.Name.ToLower()) { case "includexml": rt.IncludeXml = chunk.Arguments.First().Trim('"'); break; case "scene": rt.Scene = MqScene.Parse(chunk); break; case "material": rt.Materials = chunk.Children.Select(MqMaterial.Parse).ToList(); break; case "object": rt.Objects.Add(MqObject.Parse(chunk)); break; case "eof": break; default: rt.CustomChunks.Add(chunk); break; } } } return(rt); }
public static MqObject Parse(MqChunk chunk) { var rt = new MqObject { Name = chunk.Arguments.First().Trim('"'), }; foreach (var i in chunk.Children) { switch (i.Name.ToLower()) { case "depth": rt.Depth = int.Parse(i.Arguments.First()); break; case "folding": rt.Folding = i.Arguments.First() == "1"; break; case "scale": rt.Scale = i.Arguments.Select(float.Parse).ToArray(); break; case "rotation": rt.Rotation = i.Arguments.Select(float.Parse).ToArray(); break; case "translation": rt.Translation = i.Arguments.Select(float.Parse).ToArray(); break; case "patch": rt.Patch = (MqPatchType)int.Parse(i.Arguments.First()); break; case "segment": rt.Segment = int.Parse(i.Arguments.First()); break; case "visible": rt.Visible = i.Arguments.First() == "15"; break; case "locking": rt.Locking = i.Arguments.First() == "1"; break; case "shading": rt.Shading = (MqShading)int.Parse(i.Arguments.First()); break; case "facet": rt.Facet = float.Parse(i.Arguments.First()); break; case "color": rt.Color = i.Arguments.Select(float.Parse).ToArray(); break; case "color_type": rt.ColorType = i.Arguments.First() == "1"; break; case "mirror": rt.Mirror = (MqMirrorType)int.Parse(i.Arguments.First()); break; case "mirror_axis": rt.MirrorAxis = (MqMirrorAxis)int.Parse(i.Arguments.First()); break; case "mirror_dis": rt.MirrorDistance = float.Parse(i.Arguments.First()); break; case "lathe": rt.Lathe = (MqLatheType)int.Parse(i.Arguments.First()); break; case "lathe_axis": rt.LatheAxis = (MqLatheAxis)int.Parse(i.Arguments.First()); break; case "lathe_seg": rt.LatheSegments = int.Parse(i.Arguments.First()); break; case "vertex": rt.Vertex = i.Children.Select(_ => _.Arguments.Select(float.Parse).ToArray()).ToList(); break; case "vertexattr": var children = i.Children.ToDictionary(_ => _.Name); if (children.ContainsKey("weit")) { foreach (var j in children["weit"].Children) { rt.Weight.Add(int.Parse(j.Arguments.First()), float.Parse(j.Arguments[1])); } } break; case "face": rt.Faces = i.Children.Select(MqFace.Parse).ToList(); break; } } return(rt); }
public static MqObject Parse(MqChunk chunk) { var rt = new MqObject { Name = chunk.Arguments.First().Trim('"'), }; foreach (var i in chunk.Children) switch (i.Name.ToLower()) { case "depth": rt.Depth = int.Parse(i.Arguments.First()); break; case "folding": rt.Folding = i.Arguments.First() == "1"; break; case "scale": rt.Scale = i.Arguments.Select(float.Parse).ToArray(); break; case "rotation": rt.Rotation = i.Arguments.Select(float.Parse).ToArray(); break; case "translation": rt.Translation = i.Arguments.Select(float.Parse).ToArray(); break; case "patch": rt.Patch = (MqPatchType)int.Parse(i.Arguments.First()); break; case "segment": rt.Segment = int.Parse(i.Arguments.First()); break; case "visible": rt.Visible = i.Arguments.First() == "15"; break; case "locking": rt.Locking = i.Arguments.First() == "1"; break; case "shading": rt.Shading = (MqShading)int.Parse(i.Arguments.First()); break; case "facet": rt.Facet = float.Parse(i.Arguments.First()); break; case "color": rt.Color = i.Arguments.Select(float.Parse).ToArray(); break; case "color_type": rt.ColorType = i.Arguments.First() == "1"; break; case "mirror": rt.Mirror = (MqMirrorType)int.Parse(i.Arguments.First()); break; case "mirror_axis": rt.MirrorAxis = (MqMirrorAxis)int.Parse(i.Arguments.First()); break; case "mirror_dis": rt.MirrorDistance = float.Parse(i.Arguments.First()); break; case "lathe": rt.Lathe = (MqLatheType)int.Parse(i.Arguments.First()); break; case "lathe_axis": rt.LatheAxis = (MqLatheAxis)int.Parse(i.Arguments.First()); break; case "lathe_seg": rt.LatheSegments = int.Parse(i.Arguments.First()); break; case "vertex": rt.Vertex = i.Children.Select(_ => _.Arguments.Select(float.Parse).ToArray()).ToList(); break; case "vertexattr": var children = i.Children.ToDictionary(_ => _.Name); if (children.ContainsKey("weit")) foreach (var j in children["weit"].Children) rt.Weight.Add(int.Parse(j.Arguments.First()), float.Parse(j.Arguments[1])); break; case "face": rt.Faces = i.Children.Select(MqFace.Parse).ToList(); break; } return rt; }