AnimationWindow.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using BansheeEngine;
  4. namespace BansheeEditor
  5. {
  6. /** @addtogroup Windows
  7. * @{
  8. */
  9. /// <summary>
  10. /// Displays animation curve editor window.
  11. /// </summary>
  12. internal class AnimationWindow : EditorWindow
  13. {
  14. private GUIGraphTime timeline;
  15. private GUICurveDrawing curveDrawing;
  16. private GUIGraphValues sidebar;
  17. private GUIFloatField lengthField;
  18. private GUIIntField fpsField;
  19. private GUIFloatField yRangeField;
  20. private GUILayout buttonLayout;
  21. /// <summary>
  22. /// Opens the animation window.
  23. /// </summary>
  24. [MenuItem("Windows/Animation", ButtonModifier.CtrlAlt, ButtonCode.A, 6000)]
  25. private static void OpenGameWindow()
  26. {
  27. OpenWindow<AnimationWindow>();
  28. }
  29. /// <inheritdoc/>
  30. protected override LocString GetDisplayName()
  31. {
  32. return new LocEdString("Animation");
  33. }
  34. private void OnInitialize()
  35. {
  36. lengthField = new GUIFloatField(new LocEdString("Length"), 50);
  37. fpsField = new GUIIntField(new LocEdString("FPS"), 50);
  38. yRangeField = new GUIFloatField(new LocEdString("Y range"), 50);
  39. lengthField.Value = 60.0f;
  40. fpsField.Value = 1;
  41. yRangeField.Value = 20.0f;
  42. lengthField.OnChanged += x =>
  43. {
  44. timeline.SetRange(lengthField.Value);
  45. curveDrawing.SetRange(lengthField.Value, yRangeField.Value);
  46. };
  47. fpsField.OnChanged += x =>
  48. {
  49. timeline.SetFPS(x);
  50. curveDrawing.SetFPS(x);
  51. };
  52. yRangeField.OnChanged += x =>
  53. {
  54. curveDrawing.SetRange(lengthField.Value, x);
  55. sidebar.SetRange(x * -0.5f, x * 0.5f);
  56. };
  57. GUILayout mainLayout = GUI.AddLayoutY();
  58. buttonLayout = mainLayout.AddLayoutX();
  59. buttonLayout.AddSpace(5);
  60. buttonLayout.AddElement(lengthField);
  61. buttonLayout.AddSpace(5);
  62. buttonLayout.AddElement(yRangeField);
  63. buttonLayout.AddSpace(5);
  64. buttonLayout.AddElement(fpsField);
  65. buttonLayout.AddSpace(5);
  66. timeline = new GUIGraphTime(mainLayout, Width, 20);
  67. EdAnimationCurve[] curves = CreateDummyCurves();
  68. curveDrawing = new GUICurveDrawing(mainLayout, Width, Height - 20, curves);
  69. curveDrawing.SetRange(60.0f, 20.0f);
  70. GUIPanel sidebarPanel = GUI.AddPanel(-10);
  71. sidebarPanel.SetPosition(0, 20 + buttonLayout.Bounds.height);
  72. sidebar = new GUIGraphValues(sidebarPanel, 30, Height - 20 - buttonLayout.Bounds.height);
  73. sidebar.SetRange(-10.0f, 10.0f);
  74. curveDrawing.SetSize(Width, Height - 20 - buttonLayout.Bounds.height);
  75. curveDrawing.Rebuild();
  76. Debug.Log("CURVE DRAWING HEIGHT + " + (Height - 20 - buttonLayout.Bounds.height));
  77. // TODO - Calculate min/max Y and range to set as default
  78. // - Also recalculate whenever curves change and increase as needed
  79. }
  80. private EdAnimationCurve[] CreateDummyCurves()
  81. {
  82. EdAnimationCurve[] curves = new EdAnimationCurve[1];
  83. curves[0] = new EdAnimationCurve();
  84. curves[0].AddKeyframe(0.0f, 1.0f);
  85. curves[0].AddKeyframe(10.0f, 5.0f);
  86. curves[0].AddKeyframe(15.0f, -2.0f);
  87. curves[0].AddKeyframe(20.0f, 3.0f, TangentMode.InStep);
  88. return curves;
  89. }
  90. protected override void WindowResized(int width, int height)
  91. {
  92. timeline.SetSize(width, 20);
  93. curveDrawing.SetSize(width, height - 20 - buttonLayout.Bounds.height);
  94. sidebar.SetSize(30, height - 20 - buttonLayout.Bounds.height);
  95. curveDrawing.Rebuild();
  96. }
  97. private void OnEditorUpdate()
  98. {
  99. if (Input.IsPointerButtonHeld(PointerButton.Left))
  100. {
  101. Vector2I windowPos = ScreenToWindowPos(Input.PointerPosition);
  102. Vector2 curveCoord;
  103. int curveIdx;
  104. int keyIdx;
  105. if (curveDrawing.GetCoordInfo(windowPos, out curveCoord, out curveIdx, out keyIdx))
  106. {
  107. if(keyIdx == -1)
  108. curveDrawing.ClearSelectedKeyframes();
  109. else
  110. curveDrawing.SelectKeyframe(curveIdx, keyIdx, true);
  111. curveDrawing.Rebuild();
  112. Debug.Log("Click coord: " + curveCoord + " - " + curveIdx + " - " + keyIdx);
  113. }
  114. else
  115. {
  116. int frameIdx = timeline.GetFrame(windowPos);
  117. timeline.SetMarkedFrame(frameIdx);
  118. curveDrawing.SetMarkedFrame(frameIdx);
  119. curveDrawing.Rebuild();
  120. }
  121. }
  122. }
  123. }
  124. /** @} */
  125. }