Exemple #1
0
        public void Init(BakedGPUAnimation animation, GPURendererRes res)
        {
            _bakedAnimation = animation;
            _rendererRes    = res;
            _skinningData   = animation.skinningData;
            _pixelPerFrame  = _skinningData.boneInfos.Length * 3;

            GameObject go = animation.gameObject;
            Transform  t  = go.transform;

            t.localPosition = Vector3.zero;
            t.localRotation = Quaternion.identity;

            _meshRenderer = go.GetOrAddComponent <MeshRenderer>();
            _meshFilter   = go.GetOrAddComponent <MeshFilter>();

            _meshFilter.sharedMesh = res.mesh;
            _rendererParamDirty    = true;

            _runningBakedAnimData = new RunningBakedAnimData();

            _meshRenderer.additionalVertexStreams = _rendererRes.additionalMesh;
            _meshRenderer.sharedMaterial          = _rendererRes.bakedGPUMaterial;

            _AnimParamId = Shader.PropertyToID("_AnimParam");

            _mbp = new MaterialPropertyBlock();
            _meshRenderer.SetPropertyBlock(_mbp);
        }
        public VirtualBoneTransform[] GetOrCreateVBTs(SkinningData skinningData)
        {
            VirtualBoneTransform[] ret;
            if (_dic.TryGetValue(skinningData, out ret))
            {
                return(ret);
            }

            ret = BuildBoneHierarchy(skinningData);
            return(ret);
        }
Exemple #3
0
 public GPUAnimationState(SkinningData skinningData, string clipName)
 {
     _skinningData = skinningData;
     foreach (var clip in _skinningData.clipInfos)
     {
         if (clip.name == clipName)
         {
             _clipInfo = clip;
             break;
         }
     }
     Init();
 }
Exemple #4
0
        /// <summary>
        /// 获取或者创建 Res
        /// </summary>
        /// <param name="smr"></param>
        /// <param name="skinningData"></param>
        /// <returns></returns>
        public GPURendererRes GetOrCreateRes(SkinnedMeshRenderer smr, SkinningData skinningData)
        {
            int            id  = smr.sharedMesh.GetInstanceID();
            GPURendererRes ret = null;

            if (_dic.TryGetValue(id, out ret))
            {
                return(ret);
            }

            ret = new GPURendererRes();
            ret.skinningData = skinningData;
            ret.mesh         = smr.sharedMesh;
            CreateSkinMesh(smr, ret);
            CreateBakedTexture2D(ret);
            CreateMaterial(smr, ret);

            _dic.Add(id, ret);

            return(ret);
        }
        private VirtualBoneTransform[] BuildBoneHierarchy(SkinningData skinningData)
        {
            BoneInfo[]             boneInfos = skinningData.boneInfos;
            VirtualBoneTransform[] ret       = new VirtualBoneTransform[skinningData.boneInfos.Length];
            for (int i = 0; i < ret.Length; i++)
            {
                ret[i]      = new VirtualBoneTransform();
                ret[i].name = boneInfos[i].name;
            }
            for (int i = 0; i < ret.Length; i++)
            {
                int parentIdx = boneInfos[i].parentIdx;
                if (parentIdx != -1)
                {
                    ret[i].parent = ret[parentIdx];
                    ret[parentIdx].children.Add(ret[i]);
                }
            }

            //Debug.Assert(_jointTrans != null);
            return(ret);
        }
        /// <summary>
        /// 计算 smr 中 bone 的索引顺序与 Bake 后的 SkinningData 中记录的 bone 的索引之间的映射关系,
        /// 因为 smr 中并不包含所有的 bone,并且顺序也不一定与 SkinningData 一致
        /// 返回值的结构:index: original bone index, value: baked bone index
        /// </summary>
        /// <param name="smr"></param>
        /// <param name="skinningData"></param>
        /// <returns></returns>
        public static int[] CalcBoneIdxMap(SkinnedMeshRenderer smr, SkinningData skinningData)
        {
            Transform[] bones            = smr.bones;
            int         boneCount        = bones.Length;
            int         skinnedBoneCount = skinningData.boneInfos.Length;

            int[] boneIdxMap = new int[boneCount];

            for (int i = 0; i < boneCount; i++)
            {
#if UNITY_EDITOR
                bool found = false;
#endif
                string boneName = bones[i].name;
                for (int j = 0; j < skinnedBoneCount; j++)
                {
                    if (skinningData.boneInfos[j].name == boneName)
                    {
                        boneIdxMap[i] = j;
#if UNITY_EDITOR
                        found = true;
#endif
                        break;
                    }
                }

#if UNITY_EDITOR
                if (found == false)
                {
                    Debug.LogErrorFormat("can not find bone {0}", boneName);
                }
#endif
            }

            return(boneIdxMap);
        }
Exemple #7
0
        private Vector4[]                   _matrixPalette; // _boneIdxMap.Length * 3

        public VirtualBoneTransformController(SkinningData skinningData)
        {
            _skinningData   = skinningData;
            _boneTransforms = VirtualBoneTransformCache.Instance.GetOrCreateVBTs(skinningData);
        }
 private void Start()
 {
     _skinningData  = GetComponent <GPUAnimationPlayer>().skinningData;
     _vbtController = new VirtualBoneTransformController(_skinningData);
 }
Exemple #9
0
 public GPUAnimationState(SkinningData skinningData, int clipIdx)
 {
     _skinningData = skinningData;
     _clipInfo     = _skinningData.clipInfos[clipIdx];
     Init();
 }