Beispiel #1
0
        public RenderedPosition GetRenderedPosition(Frame frame, FrameImage fimg)
        {
            // Apply transforms
            AnimationTransform transform = frame.ApplyBoneTransforms(fimg, Transforms[CurrentAnimation]);
            RenderedPosition   result    = new RenderedPosition();

            result.Positon   = Vector2.Zero;
            result.Positon.Y = Position.Y + (transform.Position.Y * (FlipY ? -1 : 1));
            result.Positon.X = Position.X + (transform.Position.X * (FlipX ? -1 : 1));

            bool flipX = FlipX;
            bool flipY = FlipY;

            result.Angle = transform.Angle;
            if (flipX != flipY)
            {
                result.Angle *= -1;
            }

            result.Pivot = fimg.Pivot;
            if (flipX)
            {
                result.Pivot.X = Data.Textures[fimg.TextureFolder][fimg.TextureFile].Texture.Width - result.Pivot.X;
            }
            if (flipY)
            {
                result.Pivot.Y = Data.Textures[fimg.TextureFolder][fimg.TextureFile].Texture.Height - result.Pivot.Y;
            }

            result.Scale = transform.Scale;
            if (result.Scale.X < 0)
            {
                result.Scale.X = -result.Scale.X;
                flipX          = !flipX;
            }
            if (result.Scale.Y < 0)
            {
                result.Scale.Y = -result.Scale.Y;
                flipY          = !flipY;
            }

            result.Effects = SpriteEffects.None;
            if (flipX)
            {
                result.Effects |= SpriteEffects.FlipHorizontally;
            }
            if (flipY)
            {
                result.Effects |= SpriteEffects.FlipVertically;
            }

            return(result);
        }
Beispiel #2
0
        public AnimationTransform ApplyTransform(AnimationTransform baseTransform, Vector2 scale, float angle,
                                                 Vector2 position)
        {
            Matrix m = Matrix.CreateScale(baseTransform.Scale.X, baseTransform.Scale.Y, 0) *
                       Matrix.CreateRotationZ(baseTransform.Angle) *
                       Matrix.CreateTranslation(baseTransform.Position.X, baseTransform.Position.Y, 0);

            AnimationTransform result = new AnimationTransform();

            result.Scale    = baseTransform.Scale * scale;
            result.Angle    = baseTransform.Angle + angle;
            result.Position = Vector2.Transform(position, m);
            return(result);
        }
Beispiel #3
0
        public AnimationTransform ApplyBoneTransforms(Bone bone, IList <RuntimeTransform> transforms)
        {
            AnimationTransform baseTransform = (bone.Parent != -1)
                                                   ? ApplyBoneTransforms(Bones[bone.Parent], transforms)
                                                   : new AnimationTransform(0, Vector2.Zero, Vector2.One);

            if (baseTransform.Hidden)
            {
                AnimationTransform hide = new AnimationTransform();
                hide.Hidden = true;
                return(hide);
            }

            // Apply runtime transforms
            float   runtimeAngle    = 0;
            Vector2 runtimeScale    = Vector2.One;
            Vector2 runtimePosition = Vector2.Zero;

            for (int i = 0; i < transforms.Count; i++)
            {
                if ((transforms[i].TimelineId.HasValue && transforms[i].TimelineId.Value == bone.TimelineId) ||
                    (!String.IsNullOrEmpty(transforms[i].BoneName) && transforms[i].BoneName == bone.Name))
                {
                    runtimeAngle    += transforms[i].Angle;
                    runtimeScale    *= transforms[i].Scale;
                    runtimePosition += transforms[i].Position;
                    if (transforms[i].Hidden)
                    {
                        AnimationTransform hide = new AnimationTransform();
                        hide.Hidden = true;
                        return(hide);
                    }
                }
            }

            // Apply transforms from self and/or parent
            return(ApplyTransform(baseTransform, bone.Scale * runtimeScale, bone.Angle + runtimeAngle, bone.Position + runtimePosition));
        }
Beispiel #4
0
        public AnimationTransform ApplyBoneTransforms(FrameImage fimg, IList <RuntimeTransform> transforms)
        {
            // Apply transforms from self and/or parent
            AnimationTransform baseTransform = (fimg.Parent != -1)
                                                   ? ApplyBoneTransforms(Bones[fimg.Parent], transforms)
                                                   : new AnimationTransform(0, Vector2.Zero, Vector2.One);

            // Skip if hidden
            if (baseTransform.Hidden)
            {
                AnimationTransform hide = new AnimationTransform();
                hide.Hidden = true;
                return(hide);
            }

            AnimationTransform result = ApplyTransform(baseTransform, fimg.Scale, fimg.Angle, fimg.Position);

            // Apply runtime transforms
            for (int i = 0; i < transforms.Count; i++)
            {
                if (transforms[i].TimelineId.HasValue && transforms[i].TimelineId.Value == fimg.TimelineId)
                {
                    result.Angle    += transforms[i].Angle;
                    result.Scale    *= transforms[i].Scale;
                    result.Position += transforms[i].Position;
                    if (transforms[i].Hidden)
                    {
                        AnimationTransform hide = new AnimationTransform();
                        hide.Hidden = true;
                        return(hide);
                    }
                }
            }

            return(result);
        }