2
0

LightInspector.cs 6.5 KB

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