public override void OnVersionChanged(VisualElement ve, VersionChangeType versionChangeType) { if ((versionChangeType & (VersionChangeType.Transform | VersionChangeType.Size | VersionChangeType.Overflow | VersionChangeType.Hierarchy | VersionChangeType.BorderWidth | VersionChangeType.EventCallbackCategories)) == 0) { return; } // According to the flags, what operations must be done? bool mustDirtyWorldTransform = (versionChangeType & VersionChangeType.Transform) != 0; bool mustDirtyWorldClip = (versionChangeType & (VersionChangeType.Transform | VersionChangeType.Size | VersionChangeType.Overflow | VersionChangeType.BorderWidth)) != 0; bool mustDirtyEventParentCategories = (versionChangeType & (VersionChangeType.Hierarchy | VersionChangeType.EventCallbackCategories)) != 0; VisualElementFlags mustDirtyFlags = (mustDirtyWorldTransform ? VisualElementFlags.WorldTransformDirty | VisualElementFlags.WorldBoundingBoxDirty : 0) | (mustDirtyWorldClip ? VisualElementFlags.WorldClipDirty : 0) | (mustDirtyEventParentCategories ? VisualElementFlags.EventCallbackParentCategoriesDirty : 0); var needDirtyFlags = mustDirtyFlags & ~ve.m_Flags; if (needDirtyFlags != 0) { DirtyHierarchy(ve, needDirtyFlags); } DirtyBoundingBoxHierarchy(ve); ++m_Version; }
static void DirtyHierarchy(VisualElement ve, VisualElementFlags mustDirtyFlags) { // We use VisualElementFlags to track changes across the hierarchy since all those values come from m_Flags. ve.m_Flags |= mustDirtyFlags; int count = ve.hierarchy.childCount; for (int i = 0; i < count; i++) { var child = ve.hierarchy[i]; // Are these operations already done? var needDirtyFlags = mustDirtyFlags & ~child.m_Flags; if (needDirtyFlags != 0) { DirtyHierarchy(child, needDirtyFlags); } } }