LightInspector.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using System.Collections.Generic;
  4. using BansheeEngine;
  5. namespace BansheeEditor
  6. {
  7. /** @addtogroup Inspectors
  8. * @{
  9. */
  10. /// <summary>
  11. /// Renders an inspector for the <see cref="Light"/> component.
  12. /// </summary>
  13. [CustomInspector(typeof(Light))]
  14. internal class LightInspector : Inspector
  15. {
  16. private GUIEnumField lightTypeField = new GUIEnumField(typeof(LightType), new LocEdString("Light type"));
  17. private GUIColorField colorField = new GUIColorField(new LocEdString("Color"));
  18. private GUIFloatField rangeField = new GUIFloatField(new LocEdString("Range"));
  19. private GUIFloatField intensityField = new GUIFloatField(new LocEdString("Intensity"));
  20. private GUISliderField spotAngleField = new GUISliderField(1, 180, new LocEdString("Spot angle"));
  21. private GUISliderField spotFalloffAngleField = new GUISliderField(1, 180, new LocEdString("Spot falloff angle"));
  22. private GUIToggleField physBasedAttenField = new GUIToggleField(new LocEdString("Physically based attenuation"));
  23. private GUIToggleField castShadowField = new GUIToggleField(new LocEdString("Cast shadow"));
  24. private InspectableState modifyState;
  25. /// <inheritdoc/>
  26. protected internal override void Initialize()
  27. {
  28. if (InspectedObject != null)
  29. {
  30. Light light = (Light)InspectedObject;
  31. lightTypeField.OnSelectionChanged += x =>
  32. {
  33. light.Type = (LightType)x;
  34. ToggleTypeSpecificFields((LightType) x, light.PhysicallyBasedAttenuation);
  35. };
  36. colorField.OnChanged += x =>
  37. {
  38. light.Color = x;
  39. MarkAsModified();
  40. ConfirmModify();
  41. };
  42. rangeField.OnChanged += x => { light.Range = x; MarkAsModified(); };
  43. rangeField.OnConfirmed += ConfirmModify;
  44. rangeField.OnFocusLost += ConfirmModify;
  45. intensityField.OnChanged += x => { light.Intensity = x; MarkAsModified(); };
  46. intensityField.OnConfirmed += ConfirmModify;
  47. intensityField.OnFocusLost += ConfirmModify;
  48. spotAngleField.OnChanged += x => { light.SpotAngle = (Degree)x; MarkAsModified(); };
  49. spotAngleField.OnFocusLost += ConfirmModify;
  50. spotFalloffAngleField.OnChanged += x => { light.SpotFalloffAngle = (Degree)x; MarkAsModified(); };
  51. spotFalloffAngleField.OnFocusLost += ConfirmModify;
  52. castShadowField.OnChanged += x =>
  53. {
  54. light.CastsShadow = x;
  55. MarkAsModified();
  56. ConfirmModify();
  57. };
  58. physBasedAttenField.OnChanged += x =>
  59. {
  60. light.PhysicallyBasedAttenuation = x;
  61. ToggleTypeSpecificFields(light.Type, x);
  62. MarkAsModified();
  63. ConfirmModify();
  64. };
  65. Layout.AddElement(lightTypeField);
  66. Layout.AddElement(colorField);
  67. Layout.AddElement(intensityField);
  68. Layout.AddElement(rangeField);
  69. Layout.AddElement(spotAngleField);
  70. Layout.AddElement(spotFalloffAngleField);
  71. Layout.AddElement(physBasedAttenField);
  72. Layout.AddElement(castShadowField);
  73. ToggleTypeSpecificFields(light.Type, light.PhysicallyBasedAttenuation);
  74. }
  75. }
  76. /// <inheritdoc/>
  77. protected internal override InspectableState Refresh()
  78. {
  79. Light light = InspectedObject as Light;
  80. if (light == null)
  81. return InspectableState.NotModified;
  82. LightType lightType = light.Type;
  83. if (lightTypeField.Value != (ulong)lightType || physBasedAttenField.Value != light.PhysicallyBasedAttenuation)
  84. ToggleTypeSpecificFields(lightType, light.PhysicallyBasedAttenuation);
  85. lightTypeField.Value = (ulong)lightType;
  86. colorField.Value = light.Color;
  87. intensityField.Value = light.Intensity;
  88. rangeField.Value = light.Range;
  89. spotAngleField.Value = light.SpotAngle.Degrees;
  90. spotFalloffAngleField.Value = light.SpotFalloffAngle.Degrees;
  91. physBasedAttenField.Value = light.PhysicallyBasedAttenuation;
  92. castShadowField.Value = light.CastsShadow;
  93. InspectableState oldState = modifyState;
  94. if (modifyState.HasFlag(InspectableState.Modified))
  95. modifyState = InspectableState.NotModified;
  96. return oldState;
  97. }
  98. /// <summary>
  99. /// Enables or disables different GUI elements depending on the light type.
  100. /// </summary>
  101. /// <param name="type">Light type to show GUI elements for.</param>
  102. /// <param name="physBasedAttenuation">Determines is physically based attenuation enabled.</param>
  103. private void ToggleTypeSpecificFields(LightType type, bool physBasedAttenuation)
  104. {
  105. if (type == LightType.Directional)
  106. {
  107. rangeField.Active = false;
  108. spotAngleField.Active = false;
  109. spotFalloffAngleField.Active = false;
  110. physBasedAttenField.Active = false;
  111. }
  112. else if (type == LightType.Point)
  113. {
  114. rangeField.Active = !physBasedAttenuation;
  115. spotAngleField.Active = false;
  116. spotFalloffAngleField.Active = false;
  117. physBasedAttenField.Active = true;
  118. }
  119. else
  120. {
  121. rangeField.Active = !physBasedAttenuation;
  122. spotAngleField.Active = true;
  123. spotFalloffAngleField.Active = true;
  124. physBasedAttenField.Active = true;
  125. }
  126. }
  127. /// <summary>
  128. /// Marks the contents of the inspector as modified.
  129. /// </summary>
  130. protected void MarkAsModified()
  131. {
  132. modifyState |= InspectableState.ModifyInProgress;
  133. }
  134. /// <summary>
  135. /// Confirms any queued modifications.
  136. /// </summary>
  137. protected void ConfirmModify()
  138. {
  139. if (modifyState.HasFlag(InspectableState.ModifyInProgress))
  140. modifyState |= InspectableState.Modified;
  141. }
  142. }
  143. /** @} */
  144. }