PageRenderTime 58ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/XSpriter/Frame.cs

https://bitbucket.org/dylanwolf/xspriter
C# | 104 lines | 86 code | 13 blank | 5 comment | 16 complexity | 8951188bae6af47dfb9e204dc76e876f MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.Xna.Framework;
  6. namespace FuncWorks.XNA.XSpriter
  7. {
  8. public struct Frame
  9. {
  10. public Bone[] Bones;
  11. public FrameImage[] Objects;
  12. public AnimationTransform ApplyTransform(AnimationTransform baseTransform, Vector2 scale, float angle,
  13. Vector2 position)
  14. {
  15. Matrix m = Matrix.CreateScale(baseTransform.Scale.X, baseTransform.Scale.Y, 0) *
  16. Matrix.CreateRotationZ(baseTransform.Angle) *
  17. Matrix.CreateTranslation(baseTransform.Position.X, baseTransform.Position.Y, 0);
  18. AnimationTransform result = new AnimationTransform();
  19. result.Scale = baseTransform.Scale*scale;
  20. result.Angle = baseTransform.Angle + angle;
  21. result.Position = Vector2.Transform(position, m);
  22. return result;
  23. }
  24. public AnimationTransform ApplyBoneTransforms(FrameImage fimg, IList<RuntimeTransform> transforms)
  25. {
  26. // Apply transforms from self and/or parent
  27. AnimationTransform baseTransform = (fimg.Parent != -1)
  28. ? ApplyBoneTransforms(Bones[fimg.Parent], transforms)
  29. : new AnimationTransform(0, Vector2.Zero, Vector2.One);
  30. // Skip if hidden
  31. if (baseTransform.Hidden)
  32. {
  33. AnimationTransform hide = new AnimationTransform();
  34. hide.Hidden = true;
  35. return hide;
  36. }
  37. AnimationTransform result = ApplyTransform(baseTransform, fimg.Scale, fimg.Angle, fimg.Position);
  38. // Apply runtime transforms
  39. for (int i = 0; i < transforms.Count; i++)
  40. {
  41. if (transforms[i].TimelineId.HasValue && transforms[i].TimelineId.Value == fimg.TimelineId)
  42. {
  43. result.Angle += transforms[i].Angle;
  44. result.Scale *= transforms[i].Scale;
  45. result.Position += transforms[i].Position;
  46. if (transforms[i].Hidden)
  47. {
  48. AnimationTransform hide = new AnimationTransform();
  49. hide.Hidden = true;
  50. return hide;
  51. }
  52. }
  53. }
  54. return result;
  55. }
  56. public AnimationTransform ApplyBoneTransforms(Bone bone, IList<RuntimeTransform> transforms)
  57. {
  58. AnimationTransform baseTransform = (bone.Parent != -1)
  59. ? ApplyBoneTransforms(Bones[bone.Parent], transforms)
  60. : new AnimationTransform(0, Vector2.Zero, Vector2.One);
  61. if (baseTransform.Hidden)
  62. {
  63. AnimationTransform hide = new AnimationTransform();
  64. hide.Hidden = true;
  65. return hide;
  66. }
  67. // Apply runtime transforms
  68. float runtimeAngle = 0;
  69. Vector2 runtimeScale = Vector2.One;
  70. Vector2 runtimePosition = Vector2.Zero;
  71. for (int i = 0; i < transforms.Count; i++)
  72. {
  73. if ((transforms[i].TimelineId.HasValue && transforms[i].TimelineId.Value == bone.TimelineId) ||
  74. (!String.IsNullOrEmpty(transforms[i].BoneName) && transforms[i].BoneName == bone.Name))
  75. {
  76. runtimeAngle += transforms[i].Angle;
  77. runtimeScale *= transforms[i].Scale;
  78. runtimePosition += transforms[i].Position;
  79. if (transforms[i].Hidden)
  80. {
  81. AnimationTransform hide = new AnimationTransform();
  82. hide.Hidden = true;
  83. return hide;
  84. }
  85. }
  86. }
  87. // Apply transforms from self and/or parent
  88. return ApplyTransform(baseTransform, bone.Scale*runtimeScale, bone.Angle+runtimeAngle, bone.Position+runtimePosition);
  89. }
  90. }
  91. }