void LoadXml(XElement elt, VisualElementAsset parent, VisualTreeAsset vta, int orderInDocument) { VisualElementAsset vea = ResolveType(elt, vta); if (vea == null) { return; } int parentHash; if (parent == null) { vea.parentId = 0; parentHash = vta.contentHash; } else { vea.parentId = parent.id; parentHash = parent.id; } if (!EnsureValidUxmlObjectChild(elt, vea, vta)) { return; } // id includes the parent id, meaning it's dependent on the whole direct hierarchy vea.id = (vta.GetNextChildSerialNumber() + 585386304) * -1521134295 + parentHash; vea.orderInDocument = orderInDocument; bool startedRule = ParseAttributes(elt, vea, vta, parent); // each vea will creates 0 or 1 style rule, with one or more properties // they don't have selectors and are directly referenced by index // it's then applied during tree cloning vea.ruleIndex = startedRule ? m_Builder.EndRule() : -1; var templateAsset = vea as TemplateAsset; if (templateAsset != null) { vta.templateAssets.Add(templateAsset); } else if (vea is UxmlObjectAsset uxmlObjectAsset) { vta.RegisterUxmlObject(uxmlObjectAsset); } else { vta.visualElementAssets.Add(vea); } if (elt.HasElements) { foreach (XElement child in elt.Elements()) { if (child.Name.LocalName == k_TemplateNode) { LoadTemplateNode(vta, elt, child); } else if (child.Name.LocalName == k_StyleReferenceNode) { LoadStyleReferenceNode(vea, child, vta); } else if (templateAsset != null && child.Name.LocalName == k_AttributeOverridesNode) { LoadAttributeOverridesNode(templateAsset, child, vta); } else { ++orderInDocument; LoadXml(child, vea, vta, orderInDocument); } } } }