예제 #1
0
        private void DeoptimizeTransformHierarchy()
        {
            if (avatar == null)
            {
                return;
            }
            // 1. Figure out the skeletonPaths from the unstripped avatar
            var skeletonPaths = new List <string>();

            foreach (var id in avatar.m_Avatar.m_AvatarSkeleton.m_ID)
            {
                var path = avatar.FindBonePath(id);
                skeletonPaths.Add(path);
            }
            // 2. Restore the original transform hierarchy
            // Prerequisite: skeletonPaths follow pre-order traversal
            var rootFrame = FrameList[0];

            rootFrame.ClearChild();
            for (var i = 1; i < skeletonPaths.Count; i++) // start from 1, skip the root transform because it will always be there.
            {
                var           path = skeletonPaths[i];
                var           strs = path.Split('/');
                string        transformName;
                ImportedFrame parentFrame;
                if (strs.Length == 1)
                {
                    transformName = path;
                    parentFrame   = rootFrame;
                }
                else
                {
                    transformName = strs.Last();
                    var parentFrameName = strs[strs.Length - 2];
                    parentFrame = ImportedHelpers.FindFrame(parentFrameName, rootFrame);
                }

                var skeletonPose = avatar.m_Avatar.m_DefaultPose;
                var xform        = skeletonPose.m_X[i];
                if (!(xform.t is Vector3 t))
                {
                    var v4 = (Vector4)xform.t;
                    t = (Vector3)v4;
                }
                if (!(xform.s is Vector3 s))
                {
                    var v4 = (Vector4)xform.s;
                    s = (Vector3)v4;
                }
                var curTransform = new Transform(t, xform.q, s);
                var frame        = ConvertFrame(curTransform, transformName);
                parentFrame.AddChild(frame);
            }
        }
예제 #2
0
        private void DeoptimizeTransformHierarchy()
        {
            if (avatar == null)
            {
                throw new Exception("Transform hierarchy has been optimized, but can't find Avatar to deoptimize.");
            }
            // 1. Figure out the skeletonPaths from the unstripped avatar
            var skeletonPaths = new List <string>();

            foreach (var id in avatar.m_Avatar.m_AvatarSkeleton.m_ID)
            {
                var path = avatar.FindBonePath(id);
                skeletonPaths.Add(path);
            }
            // 2. Restore the original transform hierarchy
            // Prerequisite: skeletonPaths follow pre-order traversal
            for (var i = 1; i < skeletonPaths.Count; i++) // start from 1, skip the root transform because it will always be there.
            {
                var           path = skeletonPaths[i];
                var           strs = path.Split('/');
                string        transformName;
                ImportedFrame parentFrame;
                if (strs.Length == 1)
                {
                    transformName = path;
                    parentFrame   = RootFrame;
                }
                else
                {
                    transformName = strs.Last();
                    var parentFrameName = strs[strs.Length - 2];
                    parentFrame = RootFrame.FindChild(parentFrameName);
                    //var parentFramePath = path.Substring(0, path.LastIndexOf('/'));
                    //parentFrame = RootFrame.FindFrameByPath(parentFramePath);
                }

                var skeletonPose = avatar.m_Avatar.m_DefaultPose;
                var xform        = skeletonPose.m_X[i];

                var frame = RootFrame.FindChild(transformName);
                if (frame != null)
                {
                    SetFrame(frame, xform.t, xform.q, xform.s);
                    parentFrame.AddChild(frame);
                }
                else
                {
                    frame = CreateFrame(transformName, xform.t, xform.q, xform.s);
                    parentFrame.AddChild(frame);
                }
            }
        }
예제 #3
0
 private string GetPathFromHash(uint hash)
 {
     bonePathHash.TryGetValue(hash, out var boneName);
     if (string.IsNullOrEmpty(boneName))
     {
         boneName = avatar?.FindBonePath(hash);
     }
     if (string.IsNullOrEmpty(boneName))
     {
         boneName = "unknown " + hash;
     }
     return(boneName);
 }