void Transform2D::UpdateHierarchy() { m_bDirty = false; Matrix localMatrix; // Rebuild your local Matrix RebuildTransform(localMatrix); // Factor in the parent transform Transform2D* parent = m_node.GetParent(); if (parent) { m_worldMatrix = parent->GetWorldTransform(); m_worldMatrix.SelfMultiply(localMatrix); } else { m_worldMatrix = localMatrix; } // Rebuild the bounds RebuildBounds(m_worldBounds, m_dimensions); // Rebuild the preserved bounds, if there are any if (HasPreservedAspect()) RebuildBounds(m_worldBoundsPreserved, m_dimensionsPreserved); // Inform your children of these updates Transform2D* childTransform = m_node.GetChild(); while (childTransform) { childTransform->UpdateHierarchy(); childTransform = childTransform->m_node.GetSibling(); } }
STATIC void Transform2D::ValidateTransforms(Transform2D* root) { Transform2D* curTransform = root; while (curTransform != NULL) { Hierarchy<Transform2D>& curNode = curTransform->m_node; // If this transform is dirty, then update the rest of it's hierarchy if (curTransform->GetIsDirty()) { // We've got dirt on this transform; we know it's number... Update the transforms on downwards curTransform->UpdateHierarchy(); // Traverse upward to continue our traversal while (nullptr != curTransform) { Hierarchy<Transform2D>& upwardNode = curTransform->m_node; // Check if there's a sibling of this node if (nullptr != upwardNode.GetSibling()) { curTransform = upwardNode.GetSibling(); break; } else { // If this is the root node, then it's time to leave if (root == curTransform) { curTransform = nullptr; break; } curTransform = upwardNode.GetParent(); } } } else { curTransform = curNode.Next(); } } }