public void LerpKeyFrameWith(CompositeKeyFrame nextFrame, float currentLife)
        {
            float amount = MathHelper.Clamp(currentLife / this._duration, 0, 1);

            //Console.WriteLine("--- Lerping frame with amount: " + amount);
            if (Parent.Parent.RootBone != null)
            {
                // call the LerpBone on the root, and it will spread to all child bones using Recursivity
                CompositeBoneTransform boneTransform = GetBoneTransformFromKeyFrame(this, Parent.Parent.RootBone.Name);
                LerpBone(boneTransform, nextFrame, amount);
            }
        }
        private void AddBoneTransformFromBone(CompositeBone bone)
        {
            CompositeBoneTransform newBoneTrans = new CompositeBoneTransform("");

            newBoneTrans.Parent        = this;
            newBoneTrans.BoneReference = bone.Name;
            _boneTransforms.Add(newBoneTrans);
            for (int i = 0; i < bone.ChildBones.Count; i++)
            {
                AddBoneTransformFromBone(bone.ChildBones[i]);
            }
        }
Beispiel #3
0
 public void CopyValuesTo(CompositeBoneTransform target, CompositeKeyFrame newParent)
 {
     target.Parent            = newParent;
     target.SceneItem         = this.SceneItem;
     target.SubItem           = this.SubItem;
     target.Position          = this.Position;
     target.Scale             = this.Scale;
     target.Rotation          = this.Rotation;
     target.Opacity           = this.Opacity;
     target.FlipHorizontal    = this.FlipHorizontal;
     target.FlipVertical      = this.FlipVertical;
     target.IsVisible         = this.IsVisible;
     target.BoneReference     = this.BoneReference;
     target.InheritPosition   = this.InheritPosition;
     target.InheritRotation   = this.InheritRotation;
     target.InheritScale      = this.InheritScale;
     target.InheritVisibility = this.InheritVisibility;
 }
        public void LerpBone(CompositeBoneTransform boneTransform, CompositeKeyFrame nextFrame, float amount)
        {
            CompositeBoneTransform nextTransform;

            if (boneTransform.Bone.Interpolate == true)
            {
                nextTransform = GetBoneTransformFromKeyFrame(nextFrame, boneTransform.BoneReference);
            }
            else
            {
                nextTransform = GetBoneTransformFromKeyFrame(
                    this.Parent.Parent.Animations[0].KeyFrames[0], boneTransform.BoneReference);
            }
            boneTransform.LerpSceneItemWith(nextTransform, amount, !boneTransform.Bone.Interpolate);
            foreach (CompositeBone bone in boneTransform.Bone.ChildBones)
            {
                CompositeBoneTransform childBoneTransform = GetBoneTransformFromKeyFrame(this, bone.Name);
                LerpBone(childBoneTransform, nextFrame, amount);
            }
        }
Beispiel #5
0
 public bool GetVisibilityState(CompositeBoneTransform parentTransform)
 {
     if (this.Bone.MasterVisibility.HasValue == true)
     {
         return(this.Bone.MasterVisibility.Value);
     }
     if (parentTransform != null && this.InheritVisibility.HasValue == false && this.Bone.InheritVisibility == true ||
         this.InheritVisibility.HasValue == true && this.InheritVisibility == true)
     {
         if (parentTransform.Bone.MasterVisibility.HasValue == true)
         {
             return(parentTransform.Bone.MasterVisibility.Value);
         }
         else if (parentTransform.CurrentVisibility == false)
         {
             return(false);
         }
     }
     return(_isVisible);
 }
        /// <summary>
        /// Insert a children bone at specific index
        /// </summary>
        public void InsertChildBone(int index, CompositeBone childBone)
        {
            index = SquidMath.Clamp(index, 0, _childBones.Count);
            _childBones.Insert(index, childBone);
            childBone.ParentBone = this;
            childBone.Parent     = this.Parent;
            CompositeBone precedingBone;

            if (index == 0)
            {
                precedingBone = this;
            }
            else
            {
                precedingBone = this.ChildBones[index - 1];
            }
            // sync transforms
            for (int i = 0; i < Parent.Animations.Count; i++)
            {
                // loop through every keyframe to sync them
                for (int j = 0; j < Parent.Animations[i].KeyFrames.Count; j++)
                {
                    CompositeKeyFrame keyframe = Parent.Animations[i].KeyFrames[j];
                    // loop to find the previous bone
                    for (int k = 0; k < keyframe.BoneTransforms.Count; k++)
                    {
                        CompositeBoneTransform transform = keyframe.BoneTransforms[k];
                        if (transform.Bone.Equals(precedingBone))
                        {
                            CompositeBoneTransform newTransform = new CompositeBoneTransform();
                            newTransform.Parent        = keyframe;
                            newTransform.BoneReference = childBone.Name;
                            // insert the new bone just after the preceding bone
                            keyframe.BoneTransforms.Insert(k + 1, newTransform);
                        }
                    }
                }
            }
        }
 public void AddCompositeBoneTransform(CompositeBoneTransform compositeBoneTransform)
 {
     BoneTransforms.Add(compositeBoneTransform);
     compositeBoneTransform.Parent = this;
 }
Beispiel #8
0
        public void LerpSceneItemWith(CompositeBoneTransform nextState, float amount, bool nextStateOverride)
        {
            // original is only used when bone.Interpolate is set to false, and refer to the 1st KF of the 1st anim
            SceneItem item    = GetSceneItem();
            String    subItem = GetSubItem();

            if (String.IsNullOrEmpty(subItem) == false && item is ISubItemCollection)
            {
                ((ISubItemCollection)item).SetCurrentSubItem(subItem);
            }
            if (item != null)
            {
                item.Update(1 / 60f);
                amount = MathHelper.Clamp(amount, 0, 1);
                CompositeEntity        parentEntity    = Parent.Parent.Parent;
                CompositeBoneTransform parentTransform = this.ParentBoneTransform;
                _currentVisibleState = GetVisibilityState(parentTransform);
                if (_currentVisibleState == false)
                {
                    return;
                }
                bool nextStateVisibility = nextState.GetVisibilityState(nextState.ParentBoneTransform);
                // no lerping if the next state isnt visible
                if (nextStateVisibility == false)
                {
                    nextState = this;
                }
                if (nextStateOverride == true)
                {
                    _position = nextState.Position;
                    _scale    = nextState.Scale;
                    _rotation = nextState.Rotation;
                }
                else
                {
                    _position = Vector2.Lerp(this.Position, nextState.Position, amount);
                    _scale    = Vector2.Lerp(this.Scale, nextState.Scale, amount);
                    _rotation = MathHelper.Lerp(this.Rotation, nextState.Rotation, amount);
                }
                if (this.Opacity.HasValue == true || nextState.Opacity.HasValue == true)
                {
                    if (this.Opacity.HasValue == true && nextState.Opacity.HasValue == false)
                    {
                        _opacity = this.Opacity.Value;
                    }
                    else if (this.Opacity.HasValue == false && nextState.Opacity.HasValue == true)
                    {
                        _opacity = nextState.Opacity.Value;
                    }
                    else
                    {
                        _opacity = SquidMath.Lerp(this.Opacity.Value, nextState.Opacity.Value, amount);
                    }
                }
                else
                {
                    _opacity = null;
                }
                _transformPivot     = item.GetAbsolutePivot(false);
                item.FlipHorizontal = parentEntity.FlipHorizontal ^ this.FlipHorizontal;
                item.FlipVertical   = parentEntity.FlipVertical ^ this.FlipVertical;
                if (parentEntity.FlipHorizontal == true)
                {
                    _position.X       = -_position.X;
                    _transformPivot.X = item.BoundingRectSize.X - _transformPivot.X;
                    _rotation         = -_rotation;
                }
                if (parentEntity.FlipVertical == true)
                {
                    _position.Y       = -_position.Y;
                    _transformPivot.Y = item.BoundingRectSize.Y - _transformPivot.Y;
                    _rotation         = -_rotation;
                }
                if (parentEntity.Scale != Vector2.One)
                {
                    _position *= parentEntity.Scale;
                }
                if (parentEntity.Rotation != 0)
                {
                    Vector2 offset = _position;
                    float   length = offset.Length();
                    double  angle  = Math.Atan2((float)offset.Y, (float)offset.X) + parentEntity.Rotation;
                    offset.X  = (float)(length * Math.Cos(angle));
                    offset.Y  = (float)(length * Math.Sin(angle));
                    _position = offset;
                }
                if (parentTransform != null)
                {
                    if (this.InheritRotation.HasValue == false && this.Bone.InheritRotation == true ||
                        this.InheritRotation.HasValue == true && this.InheritRotation == true)
                    {
                        _rotation += parentTransform.CurrentRotation;
                    }
                    if (this.InheritScale.HasValue == false && this.Bone.InheritScale == true ||
                        this.InheritScale.HasValue == true && this.InheritScale == true)
                    {
                        _scale *= parentTransform.CurrentScale;
                    }
                    if (this.InheritPosition.HasValue == false && this.Bone.InheritPosition == true ||
                        this.InheritPosition.HasValue == true && this.InheritPosition == true)
                    {
                        Vector2 offset = _position;
                        float   length = offset.Length();
                        double  angle  = Math.Atan2((float)offset.Y, (float)offset.X) + parentTransform._rotation;
                        offset.X  = (float)(length * Math.Cos(angle));
                        offset.Y  = (float)(length * Math.Sin(angle));
                        _position = parentTransform.CurrentPosition + offset;
                    }
                }
            }
        }