private static void CloneHierarchy(BoneManager manager, RigResource.RigResource.Bone bone, RigResource.RigResource.Bone dest) { List <RigResource.RigResource.Bone> descendants = manager.GetDescendants(bone).ToList(); var clones = new List <RigResource.RigResource.Bone>(); var map = new Dictionary <RigResource.RigResource.Bone, RigResource.RigResource.Bone>(); var root = new RigResource.RigResource.Bone(0, null, bone); map[bone] = root; manager.AddBone(root, dest); foreach (RigResource.RigResource.Bone descendant in descendants) { var clone = new RigResource.RigResource.Bone(0, null, descendant); map[descendant] = clone; clones.Add(clone); manager.AddBone(clone, manager.GetParent(descendant)); } foreach (RigResource.RigResource.Bone c in clones) { RigResource.RigResource.Bone parent = manager.GetParent(c); if (map.ContainsKey(parent)) { manager.SetParent(c, map[parent]); } } }