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 }; } }
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; } }