Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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);
        }