public void BlendAnimation(MafiaAnimation anim, int startFrame = 0, int endFrame = 0, float blendDuration = 0.25f)
        {
            if (anim == null)
            {
                return;
            }

            if (mafiaAnimation == anim)
            {
                return;
            }

            anim.Reset();

            if (mafiaAnimation == null)
            {
                mafiaAnimation            = anim;
                mafiaAnimation.startFrame = startFrame;
                mafiaAnimation.endFrame   = endFrame;
                return;
            }

            pairAnimation = anim;
            pairAnimation.blendDuration = blendDuration;
            pairAnimation.startFrame    = startFrame;
            pairAnimation.endFrame      = endFrame;
        }
        public MafiaAnimation LoadAnimation(string animName)
        {
            var animation = new MafiaAnimation();

            animation.animationSequences = new List <AnimationSequence>();

            Stream fs;

            try
            {
                fs = GameManager.instance.fileSystem.GetStreamFromPath(animName);
            }
            catch
            {
                return(null);
            }

            using (var reader = new BinaryReader(fs))
            {
                MafiaFormats.Loader5DS animLoader = new MafiaFormats.Loader5DS();
                animLoader.load(reader);

                foreach (var seq in animLoader.sequences)
                {
                    var newAnimationSequence = new AnimationSequence();
                    newAnimationSequence.loaderSequence = seq;
                    animation.animationSequences.Add(newAnimationSequence);
                }
            }

            return(animation);
        }
        public MafiaAnimation LoadAnimation(string animName, int startFrame = 0, int endFrame = 0, float blendDuration = 0.25f)
        {
            var animation = new MafiaAnimation(startFrame, endFrame, blendDuration);

            animation.animationSequences = new List <AnimationSequence>();

            Stream fs;

            try
            {
                fs = GameAPI.instance.fileSystem.GetStreamFromPath(animName);
            }
            catch
            {
                return(null);
            }

            using (var reader = new BinaryReader(fs))
            {
                MafiaFormats.Loader5DS animLoader = new MafiaFormats.Loader5DS();
                animLoader.load(reader);

                foreach (var seq in animLoader.sequences)
                {
                    var newAnimationSequence = new AnimationSequence();
                    newAnimationSequence.loaderSequence = seq;
                    newAnimationSequence.rootAnimation  = animation;
                    animation.animationSequences.Add(newAnimationSequence);
                }
            }

            return(animation);
        }
        public void SetAnimation(MafiaAnimation anim)
        {
            if (mafiaAnimation == anim)
            {
                return;
            }

            mafiaAnimation = anim;
        }
        public void BlendAnimation(MafiaAnimation anim)
        {
            if (anim == null || mafiaAnimation == null)
            {
                return;
            }

            pairAnimation = anim;
        }
        public MafiaAnimation LoadAnimation(string animName, int startFrame = 0, int endFrame = 0, float blendDuration = 0.25f)
        {
            var animation = new MafiaAnimation(startFrame, endFrame, blendDuration);

            animation.animationSequences = new List <AnimationSequence>();
            animation.positionOffsets    = new List <Vector3>();

            //Stream tckfs;

            //try
            //{
            //    Regex rgx = new Regex("5ds");
            //    string tckFileName = animName.Replace("5ds", "tck");
            //    tckfs = GameAPI.instance.fileSystem.GetStreamFromPath(tckFileName);
            //    // if .tck exists, load it
            //    MafiaFormats.TckLoader tckFile = new MafiaFormats.TckLoader();
            //    using (var reader = new BinaryReader(tckfs))
            //    {
            //        tckFile.load(reader);
            //        foreach (var chunk in tckFile.transforms)
            //        {
            //            animation.positionOffsets.Prepend(chunk.position);
            //        }
            //    }
            //}
            //catch
            //{}

            Stream fs;

            try
            {
                fs = GameAPI.instance.fileSystem.GetStreamFromPath(animName);
            }
            catch
            {
                return(null);
            }

            using (var reader = new BinaryReader(fs))
            {
                MafiaFormats.Loader5DS animLoader = new MafiaFormats.Loader5DS();
                animLoader.load(reader);

                foreach (var seq in animLoader.sequences)
                {
                    var newAnimationSequence = new AnimationSequence();
                    newAnimationSequence.loaderSequence = seq;
                    newAnimationSequence.rootAnimation  = animation;
                    animation.animationSequences.Add(newAnimationSequence);
                }
            }

            return(animation);
        }
        public void SetAnimation(MafiaAnimation anim, int startFrame = 0, int endFrame = 0)
        {
            if (mafiaAnimation == anim)
            {
                return;
            }

            if (anim != null)
            {
                anim.Reset();
            }

            mafiaAnimation            = anim;
            mafiaAnimation.startFrame = startFrame;
            mafiaAnimation.endFrame   = endFrame;
        }
        public void SetAnimation(MafiaAnimation anim, int startFrame = 0, int endFrame = 0)
        {
            if (mafiaAnimation == anim)
            {
                return;
            }

            if (anim != null)
            {
                anim.Reset();
            }

            mafiaAnimation            = anim;
            mafiaAnimation.startFrame = startFrame;
            mafiaAnimation.endFrame   = endFrame;

            // save the positon of object at the beggining of animation
            this.objectInitialPosition = gameObject.transform.parent.position;
        }
        private Vector3 objectInitialPosition;      // starting GameObject position, applies when .tck is used

        public MafiaAnimation LoadAndSetAnimation(string animName, int startFrame = 0, int endFrame = 0)
        {
            mafiaAnimation = LoadAnimation(animName, startFrame, endFrame);
            return(mafiaAnimation);
        }
        void FixedUpdate()
        {
            if (GameAPI.instance.isPaused)
            {
                return;
            }

            if (!isPlaying)
            {
                return;
            }

            if (mafiaAnimation == null || mafiaAnimation.animationSequences == null)
            {
                return;
            }

            if (pairAnimation != null && pairAnimation.blendDuration > 0f && mafiaAnimation != pairAnimation && blendTime == 0f)
            {
                blendTime = pairAnimation.blendDuration;
            }

            if (blendTime > 0f && pairAnimation != null && pairAnimation.blendDuration > 0f)
            {
                foreach (var seq in pairAnimation.animationSequences)
                {
                    var bone = seq.FetchBoneTransform(transform);

                    if (bone == null)
                    {
                        continue;
                    }

                    var primarySeq = mafiaAnimation.animationSequences.Find(x => x.loaderSequence.objectName == seq.loaderSequence.objectName);

                    if (primarySeq == null)
                    {
                        continue;
                    }

                    seq.Reset();

                    var primaryTr   = primarySeq.GetCurrentMotion();
                    var secondaryTr = seq.GetCurrentMotion();

                    float blendDelta = 1f - blendTime / pairAnimation.blendDuration;

                    if (seq.loaderSequence.hasMovement())
                    {
                        bone.localPosition = Vector3.Lerp(primaryTr.currentPosition, secondaryTr.currentPosition, blendDelta);
                    }

                    if (seq.loaderSequence.hasRotation())
                    {
                        bone.localRotation = Quaternion.Slerp(primaryTr.currentRotation, secondaryTr.currentRotation, blendDelta);
                    }

                    if (seq.loaderSequence.hasScale())
                    {
                        bone.localScale = Vector3.Lerp(primaryTr.currentScale, secondaryTr.currentScale, blendDelta);
                    }
                }

                blendTime -= Time.deltaTime;

                if (blendTime <= 0f)
                {
                    blendTime      = 0f;
                    mafiaAnimation = pairAnimation;
                    pairAnimation  = null;
                    AnimReset();
                }
                else
                {
                    return;
                }
            }

            if (IsFinished())
            {
                FinishAnimation();

                if (playbackMode == AnimationPlaybackMode.Once)
                {
                    return;
                }
            }

            float frameDelta = frameTime / frameStep;

            foreach (var animationSeq in mafiaAnimation.animationSequences)
            {
                if (animationSeq == null)
                {
                    return;
                }

                animationSeq.Update(frameDelta, transform);

                if (frameTime > frameStep)
                {
                    animationSeq.NextFrame();
                }
            }

            if (frameTime > frameStep)
            {
                frameTime = 0f;
            }

            frameTime += Time.deltaTime;

            var currentFrameId = mafiaAnimation.animationSequences.Max(x => Mathf.Max(x.positionKeyFrameId, x.rotationKeyFrameId, x.scaleKeyFrameId));
            var lastFrameId    = mafiaAnimation.animationSequences.Max(x => Mathf.Max(x.loaderSequence.positionFrames.Count, x.loaderSequence.rotationFrames.Count, x.loaderSequence.scaleFrames.Count));

            playbackCompletion = currentFrameId / (float)lastFrameId;
        }
 public MafiaAnimation LoadAndSetAnimation(string animName)
 {
     mafiaAnimation = LoadAnimation(animName);
     return(mafiaAnimation);
 }