HingeJointInspector.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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="HingeJoint"/> component.
  11. /// </summary>
  12. [CustomInspector(typeof(HingeJoint))]
  13. internal class HingeJointInspector : JointInspector
  14. {
  15. private GUIToggleField enableLimitField = new GUIToggleField(new LocEdString("Enable limit"));
  16. private LimitAngularRangeGUI limitGUI;
  17. private GUIToggleField enableDriveField = new GUIToggleField(new LocEdString("Enable drive"));
  18. private GUIFloatField speedField = new GUIFloatField(new LocEdString("Speed"));
  19. private GUIFloatField forceLimitField = new GUIFloatField(new LocEdString("Force limit"));
  20. private GUIFloatField gearRatioField = new GUIFloatField(new LocEdString("Gear ratio"));
  21. private GUIToggleField freeSpinField = new GUIToggleField(new LocEdString("Free spin"));
  22. private GUILayoutX limitLayout;
  23. private GUILayoutX driveLayout;
  24. /// <inheritdoc/>
  25. protected internal override void Initialize()
  26. {
  27. HingeJoint joint = InspectedObject as HingeJoint;
  28. if (joint != null)
  29. BuildGUI(joint);
  30. }
  31. /// <inheritdoc/>
  32. protected internal override InspectableState Refresh()
  33. {
  34. HingeJoint joint = InspectedObject as HingeJoint;
  35. if (joint == null)
  36. return InspectableState.NotModified;
  37. Refresh(joint);
  38. InspectableState oldState = modifyState;
  39. if (modifyState.HasFlag(InspectableState.Modified))
  40. modifyState = InspectableState.NotModified;
  41. return oldState;
  42. }
  43. /// <summary>
  44. /// Creates GUI elements for fields specific to the hinge joint.
  45. /// </summary>
  46. protected void BuildGUI(HingeJoint joint)
  47. {
  48. enableLimitField.OnChanged += x =>
  49. {
  50. joint.EnableLimit = x;
  51. MarkAsModified();
  52. ConfirmModify();
  53. ToggleLimitFields(x);
  54. };
  55. enableDriveField.OnChanged += x =>
  56. {
  57. joint.EnableDrive = x;
  58. MarkAsModified();
  59. ConfirmModify();
  60. ToggleDriveFields(x);
  61. };
  62. speedField.OnChanged += x =>
  63. {
  64. HingeJointDriveData driveData = joint.Drive.Data;
  65. driveData.speed = x;
  66. joint.Drive = new HingeJointDrive(driveData);
  67. MarkAsModified();
  68. };
  69. speedField.OnFocusLost += ConfirmModify;
  70. speedField.OnConfirmed += ConfirmModify;
  71. forceLimitField.OnChanged += x =>
  72. {
  73. HingeJointDriveData driveData = joint.Drive.Data;
  74. driveData.forceLimit = x;
  75. joint.Drive = new HingeJointDrive(driveData);
  76. MarkAsModified();
  77. };
  78. forceLimitField.OnFocusLost += ConfirmModify;
  79. forceLimitField.OnConfirmed += ConfirmModify;
  80. gearRatioField.OnChanged += x =>
  81. {
  82. HingeJointDriveData driveData = joint.Drive.Data;
  83. driveData.gearRatio = x;
  84. joint.Drive = new HingeJointDrive(driveData);
  85. MarkAsModified();
  86. };
  87. gearRatioField.OnFocusLost += ConfirmModify;
  88. gearRatioField.OnConfirmed += ConfirmModify;
  89. freeSpinField.OnChanged += x =>
  90. {
  91. HingeJointDriveData driveData = joint.Drive.Data;
  92. driveData.freeSpin = x;
  93. joint.Drive = new HingeJointDrive(driveData);
  94. MarkAsModified();
  95. ConfirmModify();
  96. };
  97. Layout.AddElement(enableLimitField);
  98. limitLayout = Layout.AddLayoutX();
  99. {
  100. limitLayout.AddSpace(10);
  101. GUILayoutY limitContentsLayout = limitLayout.AddLayoutY();
  102. limitGUI = new LimitAngularRangeGUI(joint.Limit, limitContentsLayout, Persistent);
  103. limitGUI.OnChanged += (x, y) =>
  104. {
  105. joint.Limit = new LimitAngularRange(x, y);
  106. MarkAsModified();
  107. };
  108. limitGUI.OnConfirmed += ConfirmModify;
  109. }
  110. Layout.AddElement(enableDriveField);
  111. driveLayout = Layout.AddLayoutX();
  112. {
  113. driveLayout.AddSpace(10);
  114. GUILayoutY driveContentsLayout = driveLayout.AddLayoutY();
  115. driveContentsLayout.AddElement(speedField);
  116. driveContentsLayout.AddElement(forceLimitField);
  117. driveContentsLayout.AddElement(gearRatioField);
  118. driveContentsLayout.AddElement(freeSpinField);
  119. }
  120. ToggleLimitFields(joint.EnableLimit);
  121. ToggleDriveFields(joint.EnableDrive);
  122. base.BuildGUI(joint, true);
  123. }
  124. /// <summary>
  125. /// Updates all GUI elements from current values in the joint.
  126. /// </summary>
  127. /// <param name="joint">Joint to update the GUI from.</param>
  128. protected void Refresh(HingeJoint joint)
  129. {
  130. if (enableLimitField.Value != joint.EnableLimit)
  131. {
  132. enableLimitField.Value = joint.EnableLimit;
  133. ToggleLimitFields(joint.EnableLimit);
  134. }
  135. limitGUI.Limit = joint.Limit;
  136. if (enableDriveField.Value != joint.EnableDrive)
  137. {
  138. enableDriveField.Value = joint.EnableDrive;
  139. ToggleDriveFields(joint.EnableDrive);
  140. }
  141. speedField.Value = joint.Drive.Speed;
  142. forceLimitField.Value = joint.Drive.ForceLimit;
  143. gearRatioField.Value = joint.Drive.GearRatio;
  144. freeSpinField.Value = joint.Drive.FreeSpin;
  145. base.Refresh(joint);
  146. }
  147. /// <summary>
  148. /// Hides or shows limit property GUI elements.
  149. /// </summary>
  150. /// <param name="enable">True to show, false to hide.</param>
  151. private void ToggleLimitFields(bool enable)
  152. {
  153. limitLayout.Active = enable;
  154. }
  155. /// <summary>
  156. /// Hides or shows drive property GUI elements.
  157. /// </summary>
  158. /// <param name="enable">True to show, false to hide.</param>
  159. private void ToggleDriveFields(bool enable)
  160. {
  161. driveLayout.Active = enable;
  162. }
  163. }
  164. /** @} */
  165. }