ColliderInspector.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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 common inspector elements for all <see cref="Collider"/> components.
  11. /// </summary>
  12. internal abstract class ColliderInspector : Inspector
  13. {
  14. private GUIToggleField isTriggerField = new GUIToggleField(new LocEdString("Is trigger"));
  15. private GUIFloatField massField = new GUIFloatField(new LocEdString("Mass"));
  16. private GUIResourceField materialField = new GUIResourceField(typeof (PhysicsMaterial),
  17. new LocEdString("Material"));
  18. private GUIFloatField contactOffsetField = new GUIFloatField(new LocEdString("Contact offset"));
  19. private GUIFloatField restOffsetField = new GUIFloatField(new LocEdString("Rest offset"));
  20. private GUIEnumField collisionReportModeField = new GUIEnumField(typeof (CollisionReportMode),
  21. new LocEdString("Collision report mode"));
  22. private GUIListBoxField layerField = new GUIListBoxField(Layers.Names, false, new LocEdString("Layer"));
  23. private ulong layersValue = 0;
  24. protected InspectableState modifyState;
  25. /// <summary>
  26. /// Updates all GUI elements from current values in the collider.
  27. /// </summary>
  28. /// <param name="collider">Collider to update the GUI from.</param>
  29. protected virtual void Refresh(Collider collider)
  30. {
  31. isTriggerField.Value = collider.Trigger;
  32. massField.Value = collider.Mass;
  33. materialField.Value = collider.Material;
  34. contactOffsetField.Value = collider.ContactOffset;
  35. restOffsetField.Value = collider.RestOffset;
  36. collisionReportModeField.Value = (ulong)collider.CollisionReportMode;
  37. if (layersValue != collider.Layer)
  38. {
  39. bool[] states = new bool[64];
  40. for (int i = 0; i < states.Length; i++)
  41. states[i] = (collider.Layer & Layers.Values[i]) == Layers.Values[i];
  42. layerField.States = states;
  43. layersValue = collider.Layer;
  44. }
  45. }
  46. /// <summary>
  47. /// Creates GUI elements for fields common to all colliders.
  48. /// </summary>
  49. protected virtual void BuildGUI(Collider collider)
  50. {
  51. isTriggerField.OnChanged += x => { collider.Trigger = x; MarkAsModified(); ConfirmModify(); };
  52. massField.OnChanged += x => { collider.Mass = x; MarkAsModified(); };
  53. massField.OnConfirmed += ConfirmModify;
  54. massField.OnFocusLost += ConfirmModify;
  55. materialField.OnChanged += x =>
  56. {
  57. PhysicsMaterial mesh = Resources.Load<PhysicsMaterial>(x);
  58. collider.Material = mesh;
  59. MarkAsModified();
  60. ConfirmModify();
  61. };
  62. contactOffsetField.OnChanged += x => { collider.ContactOffset = x; MarkAsModified(); };
  63. contactOffsetField.OnConfirmed += ConfirmModify;
  64. contactOffsetField.OnFocusLost += ConfirmModify;
  65. restOffsetField.OnChanged += x => { collider.RestOffset = x; MarkAsModified(); };
  66. restOffsetField.OnConfirmed += ConfirmModify;
  67. restOffsetField.OnFocusLost += ConfirmModify;
  68. collisionReportModeField.OnSelectionChanged += x =>
  69. {
  70. collider.CollisionReportMode = (CollisionReportMode)x;
  71. MarkAsModified();
  72. ConfirmModify();
  73. };
  74. layerField.OnSelectionChanged += x =>
  75. {
  76. ulong layer = 0;
  77. bool[] states = layerField.States;
  78. for (int i = 0; i < states.Length; i++)
  79. layer |= states[i] ? Layers.Values[i] : 0;
  80. layersValue = layer;
  81. collider.Layer = layer;
  82. MarkAsModified();
  83. ConfirmModify();
  84. };
  85. Layout.AddElement(isTriggerField);
  86. Layout.AddElement(massField);
  87. Layout.AddElement(materialField);
  88. Layout.AddElement(contactOffsetField);
  89. Layout.AddElement(restOffsetField);
  90. Layout.AddElement(collisionReportModeField);
  91. Layout.AddElement(layerField);
  92. }
  93. /// <summary>
  94. /// Marks the contents of the inspector as modified.
  95. /// </summary>
  96. protected void MarkAsModified()
  97. {
  98. modifyState |= InspectableState.ModifyInProgress;
  99. }
  100. /// <summary>
  101. /// Confirms any queued modifications.
  102. /// </summary>
  103. protected void ConfirmModify()
  104. {
  105. if (modifyState.HasFlag(InspectableState.ModifyInProgress))
  106. modifyState |= InspectableState.Modified;
  107. }
  108. }
  109. /** @} */
  110. }