CharacterControllerInspector.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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 orientationField = new GUIVector3Field(new LocEdString("Orientation"));
  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. private Vector3 orientation;
  27. /// <inheritdoc/>
  28. protected internal override void Initialize()
  29. {
  30. BuildGUI();
  31. }
  32. /// <inheritdoc/>
  33. protected internal override InspectableState Refresh()
  34. {
  35. CharacterController controller = InspectedObject as CharacterController;
  36. if (controller == null)
  37. return InspectableState.NotModified;
  38. radiusField.Value = controller.Radius;
  39. heightField.Value = controller.Height;
  40. orientationField.Value = orientation;
  41. contactOffsetField.Value = controller.ContactOffset;
  42. minMoveDistanceField.Value = controller.MinMoveDistance;
  43. climbingModeField.Value = (ulong)controller.ClimbingMode;
  44. stepOffsetField.Value = controller.StepOffset;
  45. nonWalkableModeField.Value = (ulong)controller.NonWalkableMode;
  46. slopeLimitField.Value = controller.SlopeLimit.Degrees;
  47. if (layersValue != controller.Layer)
  48. {
  49. bool[] states = new bool[64];
  50. for (int i = 0; i < states.Length; i++)
  51. states[i] = (controller.Layer & Layers.Values[i]) == Layers.Values[i];
  52. layerField.States = states;
  53. layersValue = controller.Layer;
  54. }
  55. InspectableState oldState = modifyState;
  56. if (modifyState.HasFlag(InspectableState.Modified))
  57. modifyState = InspectableState.NotModified;
  58. return oldState;
  59. }
  60. /// <summary>
  61. /// Recreates all the GUI elements used by this inspector.
  62. /// </summary>
  63. private void BuildGUI()
  64. {
  65. CharacterController controller = InspectedObject as CharacterController;
  66. if (controller == null)
  67. return;
  68. radiusField.OnChanged += x => { controller.Radius = x; MarkAsModified(); };
  69. radiusField.OnConfirmed += ConfirmModify;
  70. radiusField.OnFocusLost += ConfirmModify;
  71. heightField.OnChanged += x => { controller.Height = x; MarkAsModified(); };
  72. heightField.OnConfirmed += ConfirmModify;
  73. heightField.OnFocusLost += ConfirmModify;
  74. orientationField.OnChanged += x =>
  75. {
  76. orientation = x;
  77. Quaternion rotation = Quaternion.FromEuler(x);
  78. controller.Up = rotation.Rotate(Vector3.YAxis);
  79. MarkAsModified();
  80. };
  81. orientationField.OnConfirmed += ConfirmModify;
  82. orientationField.OnFocusLost += ConfirmModify;
  83. contactOffsetField.OnChanged += x => { controller.ContactOffset = x; MarkAsModified(); };
  84. contactOffsetField.OnConfirmed += ConfirmModify;
  85. contactOffsetField.OnFocusLost += ConfirmModify;
  86. minMoveDistanceField.OnChanged += x => { controller.MinMoveDistance = x; MarkAsModified(); };
  87. minMoveDistanceField.OnConfirmed += ConfirmModify;
  88. minMoveDistanceField.OnFocusLost += ConfirmModify;
  89. climbingModeField.OnSelectionChanged += x =>
  90. {
  91. controller.ClimbingMode = (CharacterClimbingMode)x;
  92. MarkAsModified();
  93. ConfirmModify();
  94. };
  95. stepOffsetField.OnChanged += x => { controller.StepOffset = x; MarkAsModified(); };
  96. stepOffsetField.OnConfirmed += ConfirmModify;
  97. stepOffsetField.OnFocusLost += ConfirmModify;
  98. nonWalkableModeField.OnSelectionChanged += x =>
  99. {
  100. controller.NonWalkableMode = (CharacterNonWalkableMode)x;
  101. MarkAsModified();
  102. ConfirmModify();
  103. };
  104. slopeLimitField.OnChanged += x => { controller.SlopeLimit = new Degree(x); MarkAsModified(); };
  105. slopeLimitField.OnFocusLost += ConfirmModify;
  106. layerField.OnSelectionChanged += x =>
  107. {
  108. ulong layer = 0;
  109. bool[] states = layerField.States;
  110. for (int i = 0; i < states.Length; i++)
  111. layer |= states[i] ? Layers.Values[i] : 0;
  112. layersValue = layer;
  113. controller.Layer = layer;
  114. MarkAsModified();
  115. ConfirmModify();
  116. };
  117. Layout.AddElement(radiusField);
  118. Layout.AddElement(heightField);
  119. Layout.AddElement(orientationField);
  120. Layout.AddElement(contactOffsetField);
  121. Layout.AddElement(minMoveDistanceField);
  122. Layout.AddElement(climbingModeField);
  123. Layout.AddElement(stepOffsetField);
  124. Layout.AddElement(nonWalkableModeField);
  125. Layout.AddElement(slopeLimitField);
  126. Layout.AddElement(layerField);
  127. orientation = Quaternion.FromToRotation(Vector3.YAxis, controller.Up).ToEuler();
  128. }
  129. /// <summary>
  130. /// Marks the contents of the inspector as modified.
  131. /// </summary>
  132. protected void MarkAsModified()
  133. {
  134. modifyState |= InspectableState.ModifyInProgress;
  135. }
  136. /// <summary>
  137. /// Confirms any queued modifications.
  138. /// </summary>
  139. protected void ConfirmModify()
  140. {
  141. if (modifyState.HasFlag(InspectableState.ModifyInProgress))
  142. modifyState |= InspectableState.Modified;
  143. }
  144. }
  145. }