public AvatarWrapper([NotNull] Avatar avatar) { Name = avatar.m_Name; AvatarSkeleton = new PrettySkeleton(avatar.m_Avatar.m_AvatarSkeleton); AvatarSkeletonPose = new PrettySkeletonPose(avatar.m_Avatar.m_AvatarSkeletonPose); { var map = new Dictionary <uint, string>(); var tos = avatar.m_TOS; foreach (var kv in tos) { map.Add(kv.Key, kv.Value); } BoneNamesMap = map; } }
private static PrettySkeleton CombineSkeletons([NotNull, ItemNotNull] IEnumerable <PrettySkeleton> skeletons) { var nodeIDList = new List <uint>(); var nodeList = new List <SkeletonNode>(); var nodeStart = 0; var counter = 0; foreach (var skeleton in skeletons) { Debug.Assert(skeleton.NodeIDs.Length == skeleton.Nodes.Length); var nodeCount = skeleton.NodeIDs.Length; foreach (var id in skeleton.NodeIDs) { if (id == 0) { if (nodeIDList.Count == 0) { nodeIDList.Add(id); } } else { nodeIDList.Add(id); } } var isFirstNode = true; foreach (var node in skeleton.Nodes) { if (isFirstNode) { if (nodeList.Count > 0) { isFirstNode = false; continue; } } int parentIndex; if (counter == 0) { parentIndex = node.ParentIndex; } else { if (node.ParentIndex <= 0) { parentIndex = node.ParentIndex; } else { parentIndex = node.ParentIndex + nodeStart - 1; } } var n = new SkeletonNode(parentIndex, node.AxisIndex); nodeList.Add(n); isFirstNode = false; } if (counter == 0) { nodeStart += nodeCount; } else { // From the second time, "" (empty name) bone is filtered out because it will duplicate. nodeStart += nodeCount - 1; } ++counter; } var result = new PrettySkeleton(nodeList.ToArray(), nodeIDList.ToArray()); return(result); }