CapsuleColliderInspector.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 Inspectors
  7. * @{
  8. */
  9. /// <summary>
  10. /// Renders an inspector for the <see cref="CapsuleCollider"/> component.
  11. /// </summary>
  12. [CustomInspector(typeof(CapsuleCollider))]
  13. internal class CapsuleColliderInspector : ColliderInspector
  14. {
  15. private GUIVector3Field centerField = new GUIVector3Field(new LocEdString("Center"));
  16. private GUIVector3Field orientationField = new GUIVector3Field(new LocEdString("Orientation"));
  17. private GUIFloatField radiusField = new GUIFloatField(new LocEdString("Radius"));
  18. private GUIFloatField halfHeightField = new GUIFloatField(new LocEdString("Half height"));
  19. private Vector3 orientation;
  20. /// <inheritdoc/>
  21. protected internal override void Initialize()
  22. {
  23. CapsuleCollider collider = InspectedObject as CapsuleCollider;
  24. if (collider != null)
  25. BuildGUI(collider);
  26. }
  27. /// <inheritdoc/>
  28. protected internal override InspectableState Refresh()
  29. {
  30. CapsuleCollider collider = InspectedObject as CapsuleCollider;
  31. if (collider == null)
  32. return InspectableState.NotModified;
  33. Refresh(collider);
  34. InspectableState oldState = modifyState;
  35. if (modifyState.HasFlag(InspectableState.Modified))
  36. modifyState = InspectableState.NotModified;
  37. return oldState;
  38. }
  39. /// <summary>
  40. /// Creates GUI elements for fields specific to the capsule collider.
  41. /// </summary>
  42. protected void BuildGUI(CapsuleCollider collider)
  43. {
  44. centerField.OnChanged += x => { collider.Center = x; MarkAsModified(); };
  45. centerField.OnFocusLost += ConfirmModify;
  46. centerField.OnConfirmed += ConfirmModify;
  47. orientationField.OnChanged += x =>
  48. {
  49. orientation = x;
  50. Quaternion rotation = Quaternion.FromEuler(x);
  51. collider.Normal = rotation.Rotate(Vector3.YAxis);
  52. MarkAsModified();
  53. };
  54. orientationField.OnFocusLost += ConfirmModify;
  55. orientationField.OnConfirmed += ConfirmModify;
  56. radiusField.OnChanged += x => { collider.Radius = x; MarkAsModified(); };
  57. radiusField.OnFocusLost += ConfirmModify;
  58. radiusField.OnConfirmed += ConfirmModify;
  59. halfHeightField.OnChanged += x => { collider.HalfHeight = x; MarkAsModified(); };
  60. halfHeightField.OnFocusLost += ConfirmModify;
  61. halfHeightField.OnConfirmed += ConfirmModify;
  62. Layout.AddElement(centerField);
  63. Layout.AddElement(orientationField);
  64. Layout.AddElement(radiusField);
  65. Layout.AddElement(halfHeightField);
  66. orientation = Quaternion.FromToRotation(Vector3.YAxis, collider.Normal).ToEuler();
  67. base.BuildGUI(collider);
  68. }
  69. /// <summary>
  70. /// Updates all GUI elements from current values in the collider.
  71. /// </summary>
  72. /// <param name="collider">Collider to update the GUI from.</param>
  73. protected void Refresh(CapsuleCollider collider)
  74. {
  75. if (!centerField.HasInputFocus)
  76. centerField.Value = collider.Center;
  77. if (!orientationField.HasInputFocus)
  78. orientationField.Value = orientation;
  79. if (!radiusField.HasInputFocus)
  80. radiusField.Value = collider.Radius;
  81. if (!halfHeightField.HasInputFocus)
  82. halfHeightField.Value = collider.HalfHeight;
  83. base.Refresh(collider);
  84. }
  85. }
  86. /** @} */
  87. }