Exemple #1
0
        private void LoadFromXml(XDocument document)
        {
            var rootElem = document.Root;

            if (rootElem.Name != "LEGOPrimitive")
            {
                throw new InvalidDataException();
            }

            rootElem.TryGetIntAttribute("versionMajor", out int vMaj);
            rootElem.TryGetIntAttribute("versionMinor", out int vMin);
            FileVersion = new VersionInfo(vMaj, vMin);

            ExtraElements.Clear();
            foreach (var element in rootElem.Elements())
            {
                try { ReadPrimitiveSection(element); }
                catch (Exception ex)
                {
                    throw new Exception($"Error while reading {element.Name.LocalName}", ex);
                }
            }

            if (PhysicsAttributes == null)
            {
                PhysicsAttributes = new PhysicsAttributes();
            }

            if (ID == 0 && Aliases.Any())
            {
                ID = Aliases.First();
            }

            Comments = document.Nodes().OfType <XComment>().FirstOrDefault()?.Value ?? string.Empty;
        }
        public void EndInit()
        {
            if (ExtraElements == null)
            {
                return;
            }

            const string oldIntrumentFieldName = "instrument";

            if (ExtraElements.TryGetValue(oldIntrumentFieldName, out var instrument))
            {
                ExtraElements.Remove(oldIntrumentFieldName);
                this.Instruments = new[] { (Instrument)instrument };
            }
        }
Exemple #3
0
        private void ReadPrimitiveSection(XElement element)
        {
            switch (element.Name.LocalName)
            {
            case SECTION_ANNOTATIONS:

                foreach (var annotationElem in element.Elements("Annotation"))
                {
                    try { ReadAnnotation(annotationElem); }
                    catch { }
                }
                break;

            case SECTION_COLLISION:
                foreach (var colElem in element.Elements())
                {
                    Collisions.Add(Collision.DeserializeCollision(colElem));
                }
                break;

            case SECTION_CONNECTIVITY:
                foreach (var conElem in element.Elements())
                {
                    Connectors.Add(Connector.DeserializeConnector(conElem));
                }
                break;

            case SECTION_PHYSICSATTRIBUTES:
                PhysicsAttributes = XmlHelper.DefaultDeserialize <PhysicsAttributes>(element);
                break;

            case "Bounding":
                Bounding = new BoundingBox();
                Bounding.LoadFromXml(element.Element("AABB"));

                break;

            case "GeometryBounding":
                GeometryBounding = new BoundingBox();
                GeometryBounding.LoadFromXml(element.Element("AABB"));
                break;

            case "Decoration":

                if (FileVersion.Major == 1 && element.HasAttribute("faces"))
                {
                    try
                    {
                        int surfaceCount = element.ReadAttribute <int>("faces");
                        SubMaterials = new int[surfaceCount];
                        var values = element.ReadAttribute <string>("subMaterialRedirectLookupTable").Split(',');
                        for (int i = 0; i < surfaceCount; i++)
                        {
                            SubMaterials[i] = int.Parse(values[i]);
                        }
                    }
                    catch
                    {
                        Console.WriteLine("invalid primitive version");
                    }
                }

                break;

            case "Flex":
                foreach (var boneElement in element.Elements())
                {
                    FlexBones.Add(XmlHelper.DefaultDeserialize <FlexBone>(boneElement));
                }
                break;

            case "DefaultOrientation":
                DefaultOrientation = Transform.FromElementAttributes(element);
                break;

            case "DefaultCamera":
                DefaultCamera = XmlHelper.DefaultDeserialize <Camera>(element);
                break;

            //case "Paths":
            //    break;

            default:
                //if (ExtraElements == null)
                //    ExtraElements = new List<XElement>();
                var clonedElem = XElement.Parse(element.ToString());
                ExtraElements.Add(clonedElem);
                break;
            }
        }