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); }
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); }
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)); }
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); }