ColliderInspector.cs 4.9 KB

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