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); }
public GPUAnimationState(SkinningData skinningData, string clipName) { _skinningData = skinningData; foreach (var clip in _skinningData.clipInfos) { if (clip.name == clipName) { _clipInfo = clip; break; } } Init(); }
/// <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); }
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); }
public GPUAnimationState(SkinningData skinningData, int clipIdx) { _skinningData = skinningData; _clipInfo = _skinningData.clipInfos[clipIdx]; Init(); }