RigidbodyInspector.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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="Rigidbody"/> component.
  11. /// </summary>
  12. [CustomInspector(typeof(Rigidbody))]
  13. internal class RigidbodyInspector : Inspector
  14. {
  15. private GUIToggleField kinematicField = new GUIToggleField(new LocEdString("Kinematic"));
  16. private GUIToggleField applyGravityField = new GUIToggleField(new LocEdString("Apply gravity"));
  17. private GUIToggleField automaticMassField = new GUIToggleField(new LocEdString("Calculate mass"));
  18. private GUIFloatField massField = new GUIFloatField(new LocEdString("Mass"));
  19. private GUIFloatField linearDragField = new GUIFloatField(new LocEdString("Linear drag"));
  20. private GUIFloatField angularDragField = new GUIFloatField(new LocEdString("Angular drag"));
  21. private GUIEnumField reportModeField = new GUIEnumField(typeof (CollisionReportMode),
  22. new LocEdString("Collision report mode"));
  23. private GUIToggleField ccdField = new GUIToggleField(new LocEdString("Continous"));
  24. private InspectableState modifyState;
  25. /// <inheritdoc/>
  26. protected internal override void Initialize()
  27. {
  28. BuildGUI();
  29. }
  30. /// <inheritdoc/>
  31. protected internal override InspectableState Refresh()
  32. {
  33. Rigidbody body = InspectedObject as Rigidbody;
  34. if (body == null)
  35. return InspectableState.NotModified;
  36. kinematicField.Value = body.IsKinematic;
  37. applyGravityField.Value = body.UseGravity;
  38. automaticMassField.Value = (body.Flags & RigidbodyFlag.AutoMass) != 0;
  39. massField.Value = body.Mass;
  40. linearDragField.Value = body.Drag;
  41. angularDragField.Value = body.AngularDrag;
  42. reportModeField.Value = (ulong) body.CollisionReportMode;
  43. ccdField.Value = (body.Flags & RigidbodyFlag.CCD) != 0;
  44. massField.Active = (body.Flags & RigidbodyFlag.AutoMass) == 0;
  45. InspectableState oldState = modifyState;
  46. if (modifyState.HasFlag(InspectableState.Modified))
  47. modifyState = InspectableState.NotModified;
  48. return oldState;
  49. }
  50. /// <summary>
  51. /// Recreates all the GUI elements used by this inspector.
  52. /// </summary>
  53. private void BuildGUI()
  54. {
  55. Rigidbody body = InspectedObject as Rigidbody;
  56. if (body == null)
  57. return;
  58. kinematicField.OnChanged += x => { body.IsKinematic = x; MarkAsModified(); ConfirmModify(); };
  59. applyGravityField.OnChanged += x => { body.UseGravity = x; MarkAsModified(); ConfirmModify(); };
  60. automaticMassField.OnChanged += x =>
  61. {
  62. if (x)
  63. body.Flags |= RigidbodyFlag.AutoMass;
  64. else
  65. body.Flags &= ~RigidbodyFlag.AutoMass;
  66. massField.Active = !x;
  67. MarkAsModified();
  68. ConfirmModify();
  69. };
  70. massField.OnChanged += x => { body.Mass = x; MarkAsModified(); };
  71. massField.OnConfirmed += ConfirmModify;
  72. massField.OnFocusLost += ConfirmModify;
  73. linearDragField.OnChanged += x => { body.Drag = x; MarkAsModified(); };
  74. linearDragField.OnConfirmed += ConfirmModify;
  75. linearDragField.OnFocusLost += ConfirmModify;
  76. angularDragField.OnChanged += x => { body.AngularDrag = x; MarkAsModified(); };
  77. angularDragField.OnConfirmed += ConfirmModify;
  78. angularDragField.OnFocusLost += ConfirmModify;
  79. reportModeField.OnSelectionChanged += x =>
  80. {
  81. body.CollisionReportMode = (CollisionReportMode) x;
  82. MarkAsModified();
  83. ConfirmModify();
  84. };
  85. ccdField.OnChanged += x =>
  86. {
  87. if (x)
  88. body.Flags |= RigidbodyFlag.CCD;
  89. else
  90. body.Flags &= ~RigidbodyFlag.CCD;
  91. MarkAsModified();
  92. ConfirmModify();
  93. };
  94. massField.Active = (body.Flags & RigidbodyFlag.AutoMass) == 0;
  95. Layout.AddElement(kinematicField);
  96. Layout.AddElement(applyGravityField);
  97. Layout.AddElement(automaticMassField);
  98. Layout.AddElement(massField);
  99. Layout.AddElement(linearDragField);
  100. Layout.AddElement(angularDragField);
  101. Layout.AddElement(reportModeField);
  102. Layout.AddElement(ccdField);
  103. }
  104. /// <summary>
  105. /// Marks the contents of the inspector as modified.
  106. /// </summary>
  107. protected void MarkAsModified()
  108. {
  109. modifyState |= InspectableState.ModifyInProgress;
  110. }
  111. /// <summary>
  112. /// Confirms any queued modifications.
  113. /// </summary>
  114. protected void ConfirmModify()
  115. {
  116. if (modifyState.HasFlag(InspectableState.ModifyInProgress))
  117. modifyState |= InspectableState.Modified;
  118. }
  119. }
  120. /** @} */
  121. }