void LoadXml(XElement elt, VisualElementAsset parent, VisualTreeAsset vta) { VisualElementAsset vea = ResolveType(elt, vta); if (vea == null) { return; } var parentId = (parent == null ? 0 : parent.id); // id includes the parent id, meaning it's dependent on the whole direct hierarchy int id = (parentId << 1) ^ vea.GetHashCode(); vea.parentId = parentId; vea.id = id; 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; if (vea is TemplateAsset) { vta.templateAssets.Add((TemplateAsset)vea); } else { vta.visualElementAssets.Add(vea); } if (elt.HasElements) { foreach (XElement child in elt.Elements()) { if (child.Name.LocalName == k_StyleReferenceNode) { LoadStyleReferenceNode(vea, child); } else { LoadXml(child, vea, vta); } } } }