Пример #1
0
    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);
    }
Пример #2
0
    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);
    }
Пример #3
0
    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))
Пример #4
0
    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);
        }
    }
Пример #5
0
 public void SetClip(CraClip clip)
 {
     Debug.Assert(IsValid());
     CraPlaybackManager.Instance.PlayerSetClip(Handle, clip);
 }