예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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;
        }