public void PlayerAssign(CraHandle player, Transform root, CraMask?mask = null) { Debug.Assert(root != null); if (CraSettings.BoneHashFunction == null) { throw new Exception("CraSettings.BoneHashFunction is not assigned! You need to assign a custom hash function!"); } List <int> assignedBones = PlayerAssignedBones[player.Handle]; if (assignedBones.Count > 0) { Debug.LogWarning($"Player {player.Handle} already has bones assigned!"); return; } (CraPlayerData data, int subIdex) = PlayerGet(player); int clipIdx = data.ClipIndex[subIdex]; if (clipIdx < 0) { Debug.LogError($"Cannot assign Transform '{root.name}' to CraPlayer! No clip(s) set!"); return; } CraClip clip = KnownClips[clipIdx]; PlayerAssignInternal(assignedBones, clip, clipIdx, root, mask); data.Transition[subIdex] = 1f; PlayerSet(player, ref data); PlayerCaptureBones(player); }
public void PlayerSetClip(CraHandle player, CraClip clip) { Debug.Assert(clip != null); (CraPlayerData data, int subIdex) = PlayerGet(player); int clipIdx = data.ClipIndex[subIdex]; if (clipIdx >= 0) { Debug.LogWarning($"Player {player.Handle} already has clip {clipIdx} assigned!"); return; } if (!KnownClipIndices.TryGetValue(clip, out clipIdx)) { clipIdx = CopyClip(clip); if (clipIdx < 0) { Debug.LogError($"Setting clip {clip.Name} to Player {player.Handle} failed!"); return; } } data.ClipIndex[subIdex] = clipIdx; data.Duration[subIdex] = clip.FrameCount / clip.Fps; data.Transition[subIdex] = 1f; PlayerSet(player, ref data); }
public static CraClip Import(string bankName, uint animNameCRC, string clipNaming = null) { CraClip clip; uint animID = HashUtils.GetCRC(bankName) * animNameCRC; if (ClipDB.TryGetValue(animID, out clip)) { return(clip); } AnimationBank bank = Con.Get <AnimationBank>(bankName); if (bank == null) { Debug.LogError($"Cannot find AnimationBank '{bankName}'!"); return(null); } if (!bank.GetAnimationMetadata(animNameCRC, out int numFrames, out int numBones)) { //Debug.LogError($"Cannot find Animation '{animNameCRC}' in AnimationBank '{bankName}'!"); return(null); } clip = new CraClip(); clip.Name = string.IsNullOrEmpty(clipNaming) ? animNameCRC.ToString() : clipNaming; uint dummyroot = HashUtils.GetCRC("dummyroot"); uint[] boneCRCs = bank.GetBoneCRCs(); List <CraBone> bones = new List <CraBone>(); for (int i = 0; i < boneCRCs.Length; ++i) { // no root motion if (boneCRCs[i] == dummyroot) { continue; } CraBone bone = new CraBone(); bone.BoneHash = (int)boneCRCs[i]; bone.Curve = new CraTransformCurve(); for (uint j = 0; j < 7; ++j) { if (!bank.GetCurve(animNameCRC, boneCRCs[i], j, out ushort[] indices, out float[] values))
void PlayerAssignInternal(List <int> assignedBones, CraClip clip, int clipIdx, Transform current, CraMask?mask = null, bool maskedChild = false) { void AddBone(int clipBoneIdx) { int allocIdx; if (!KnownBoneIndices.TryGetValue(current, out allocIdx)) { allocIdx = BoneData.Alloc(); KnownBoneIndices.Add(current, allocIdx); BonePlayerClipIndices.Add(new Dictionary <int, int>()); Bones.Add(current); Debug.Assert(KnownBoneIndices.Count == BoneData.GetNumAllocated()); Debug.Assert(BonePlayerClipIndices.Count == BoneData.GetNumAllocated()); Debug.Assert(Bones.length == BoneData.GetNumAllocated()); } BonePlayerClipIndices[allocIdx].Add(clipIdx, clipBoneIdx); assignedBones.Add(allocIdx); } int boneHash = CraSettings.BoneHashFunction(current.name); bool isMasked = false; if (clip.BoneHashToIdx.TryGetValue(boneHash, out int clipBoneIdx)) { if (mask.HasValue) { if (maskedChild || mask.Value.BoneHashes.Contains(boneHash)) { AddBone(clipBoneIdx); isMasked = mask.Value.MaskChildren; } } else { AddBone(clipBoneIdx); } } for (int i = 0; i < current.childCount; ++i) { PlayerAssignInternal(assignedBones, clip, clipIdx, current.GetChild(i), mask, isMasked); } }
public void SetClip(CraClip clip) { Debug.Assert(IsValid()); CraPlaybackManager.Instance.PlayerSetClip(Handle, clip); }