CharacterControllerInspector.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. /// <summary>
  7. /// Renders an inspector for the <see cref="CharacterController"/> component.
  8. /// </summary>
  9. [CustomInspector(typeof(CharacterController))]
  10. internal class CharacterControllerInspector : Inspector
  11. {
  12. private GUIFloatField radiusField = new GUIFloatField(new LocEdString("Radius"));
  13. private GUIFloatField heightField = new GUIFloatField(new LocEdString("Height"));
  14. private GUIVector3Field upField = new GUIVector3Field(new LocEdString("Up"));
  15. private GUIFloatField contactOffsetField = new GUIFloatField(new LocEdString("Contact offset"));
  16. private GUIFloatField minMoveDistanceField = new GUIFloatField(new LocEdString("Min. move distance"));
  17. private GUIEnumField climbingModeField = new GUIEnumField(typeof (CharacterClimbingMode),
  18. new LocEdString("Climbing mode"));
  19. private GUIFloatField stepOffsetField = new GUIFloatField(new LocEdString("Step offset"));
  20. private GUIEnumField nonWalkableModeField = new GUIEnumField(typeof (CharacterNonWalkableMode),
  21. new LocEdString("Non-walkable mode"));
  22. private GUISliderField slopeLimitField = new GUISliderField(0, 180, new LocEdString("Slope limit"));
  23. private GUIListBoxField layerField = new GUIListBoxField(Layers.Names, false, new LocEdString("Layer"));
  24. private ulong layersValue = 0;
  25. private InspectableState modifyState;
  26. /// <inheritdoc/>
  27. protected internal override void Initialize()
  28. {
  29. BuildGUI();
  30. }
  31. /// <inheritdoc/>
  32. protected internal override InspectableState Refresh()
  33. {
  34. CharacterController controller = InspectedObject as CharacterController;
  35. if (controller == null)
  36. return InspectableState.NotModified;
  37. radiusField.Value = controller.Radius;
  38. heightField.Value = controller.Height;
  39. upField.Value = controller.Up;
  40. contactOffsetField.Value = controller.ContactOffset;
  41. minMoveDistanceField.Value = controller.MinMoveDistance;
  42. climbingModeField.Value = (ulong)controller.ClimbingMode;
  43. stepOffsetField.Value = controller.StepOffset;
  44. nonWalkableModeField.Value = (ulong)controller.NonWalkableMode;
  45. slopeLimitField.Value = controller.SlopeLimit.Degrees;
  46. if (layersValue != controller.Layer)
  47. {
  48. bool[] states = new bool[64];
  49. for (int i = 0; i < states.Length; i++)
  50. states[i] = (controller.Layer & Layers.Values[i]) == Layers.Values[i];
  51. layerField.States = states;
  52. layersValue = controller.Layer;
  53. }
  54. InspectableState oldState = modifyState;
  55. if (modifyState.HasFlag(InspectableState.Modified))
  56. modifyState = InspectableState.NotModified;
  57. return oldState;
  58. }
  59. /// <summary>
  60. /// Recreates all the GUI elements used by this inspector.
  61. /// </summary>
  62. private void BuildGUI()
  63. {
  64. CharacterController controller = InspectedObject as CharacterController;
  65. if (controller == null)
  66. return;
  67. radiusField.OnChanged += x => { controller.Radius = x; MarkAsModified(); };
  68. radiusField.OnConfirmed += ConfirmModify;
  69. radiusField.OnFocusLost += ConfirmModify;
  70. heightField.OnChanged += x => { controller.Height = x; MarkAsModified(); };
  71. heightField.OnConfirmed += ConfirmModify;
  72. heightField.OnFocusLost += ConfirmModify;
  73. upField.OnChanged += x => { controller.Up = x; MarkAsModified(); };
  74. upField.OnConfirmed += ConfirmModify;
  75. upField.OnFocusLost += ConfirmModify;
  76. contactOffsetField.OnChanged += x => { controller.ContactOffset = x; MarkAsModified(); };
  77. contactOffsetField.OnConfirmed += ConfirmModify;
  78. contactOffsetField.OnFocusLost += ConfirmModify;
  79. minMoveDistanceField.OnChanged += x => { controller.MinMoveDistance = x; MarkAsModified(); };
  80. minMoveDistanceField.OnConfirmed += ConfirmModify;
  81. minMoveDistanceField.OnFocusLost += ConfirmModify;
  82. climbingModeField.OnSelectionChanged += x =>
  83. {
  84. controller.ClimbingMode = (CharacterClimbingMode)x;
  85. MarkAsModified();
  86. ConfirmModify();
  87. };
  88. stepOffsetField.OnChanged += x => { controller.StepOffset = x; MarkAsModified(); };
  89. stepOffsetField.OnConfirmed += ConfirmModify;
  90. stepOffsetField.OnFocusLost += ConfirmModify;
  91. nonWalkableModeField.OnSelectionChanged += x =>
  92. {
  93. controller.NonWalkableMode = (CharacterNonWalkableMode)x;
  94. MarkAsModified();
  95. ConfirmModify();
  96. };
  97. slopeLimitField.OnChanged += x => { controller.SlopeLimit = new Degree(x); MarkAsModified(); };
  98. slopeLimitField.OnFocusLost += ConfirmModify;
  99. layerField.OnSelectionChanged += x =>
  100. {
  101. ulong layer = 0;
  102. bool[] states = layerField.States;
  103. for (int i = 0; i < states.Length; i++)
  104. layer |= states[i] ? Layers.Values[i] : 0;
  105. layersValue = layer;
  106. controller.Layer = layer;
  107. MarkAsModified();
  108. ConfirmModify();
  109. };
  110. Layout.AddElement(radiusField);
  111. Layout.AddElement(heightField);
  112. Layout.AddElement(upField);
  113. Layout.AddElement(contactOffsetField);
  114. Layout.AddElement(minMoveDistanceField);
  115. Layout.AddElement(climbingModeField);
  116. Layout.AddElement(stepOffsetField);
  117. Layout.AddElement(nonWalkableModeField);
  118. Layout.AddElement(slopeLimitField);
  119. Layout.AddElement(layerField);
  120. }
  121. /// <summary>
  122. /// Marks the contents of the inspector as modified.
  123. /// </summary>
  124. protected void MarkAsModified()
  125. {
  126. modifyState |= InspectableState.ModifyInProgress;
  127. }
  128. /// <summary>
  129. /// Confirms any queued modifications.
  130. /// </summary>
  131. protected void ConfirmModify()
  132. {
  133. if (modifyState.HasFlag(InspectableState.ModifyInProgress))
  134. modifyState |= InspectableState.Modified;
  135. }
  136. }
  137. }