LightInspector.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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 bool isInitialized;
  12. private GUIEnumField lightTypeField = new GUIEnumField(typeof(LightType), new LocEdString("Light type"));
  13. private GUIColorField colorField = new GUIColorField(new LocEdString("Color"));
  14. private GUIFloatField rangeField = new GUIFloatField(new LocEdString("Range"));
  15. private GUIFloatField intensityField = new GUIFloatField(new LocEdString("Intensity"));
  16. private GUISliderField spotAngleField = new GUISliderField(1, 180, new LocEdString("Spot angle"));
  17. private GUISliderField spotFalloffAngleField = new GUISliderField(1, 180, new LocEdString("Spot falloff angle"));
  18. private GUIToggleField castShadowField = new GUIToggleField(new LocEdString("Cast shadow"));
  19. /// <summary>
  20. /// Initializes required data the first time <see cref="Refresh"/> is called.
  21. /// </summary>
  22. private void Initialize()
  23. {
  24. if (referencedObject != null)
  25. {
  26. Light light = (Light)referencedObject;
  27. lightTypeField.OnSelectionChanged += x =>
  28. {
  29. light.Type = (LightType)x;
  30. ToggleTypeSpecificFields((LightType) x);
  31. };
  32. colorField.OnChanged += x => light.Color = x;
  33. rangeField.OnChanged += x => light.Range = x;
  34. intensityField.OnChanged += x => light.Intensity = x;
  35. spotAngleField.OnChanged += x => light.SpotAngle = x;
  36. spotFalloffAngleField.OnChanged += x => light.SpotFalloffAngle = x;
  37. castShadowField.OnChanged += x => light.CastsShadow = x;
  38. layout.AddElement(lightTypeField);
  39. layout.AddElement(colorField);
  40. layout.AddElement(intensityField);
  41. layout.AddElement(rangeField);
  42. layout.AddElement(spotAngleField);
  43. layout.AddElement(spotFalloffAngleField);
  44. layout.AddElement(castShadowField);
  45. ToggleTypeSpecificFields(light.Type);
  46. }
  47. isInitialized = true;
  48. }
  49. /// <summary>
  50. /// Enables or disables different GUI elements depending on the light type.
  51. /// </summary>
  52. /// <param name="type">Light type to show GUI elements for.</param>
  53. private void ToggleTypeSpecificFields(LightType type)
  54. {
  55. if (type == LightType.Directional)
  56. {
  57. rangeField.Visible = false;
  58. spotAngleField.Visible = false;
  59. spotFalloffAngleField.Visible = false;
  60. }
  61. else if (type == LightType.Point)
  62. {
  63. rangeField.Visible = true;
  64. spotAngleField.Visible = false;
  65. spotFalloffAngleField.Visible = false;
  66. }
  67. else
  68. {
  69. rangeField.Visible = true;
  70. spotAngleField.Visible = true;
  71. spotFalloffAngleField.Visible = true;
  72. }
  73. }
  74. /// <inheritdoc/>
  75. internal override bool Refresh()
  76. {
  77. if (!isInitialized)
  78. Initialize();
  79. Light light = referencedObject as Light;
  80. if (light == null)
  81. return false;
  82. bool anythingModified = false;
  83. LightType lightType = light.Type;
  84. if (lightTypeField.Value != (ulong)lightType)
  85. {
  86. lightTypeField.Value = (ulong)lightType;
  87. ToggleTypeSpecificFields(lightType);
  88. anythingModified = true;
  89. }
  90. if (colorField.Value != light.Color)
  91. {
  92. colorField.Value = light.Color;
  93. anythingModified = true;
  94. }
  95. if (intensityField.Value != light.Intensity)
  96. {
  97. intensityField.Value = light.Intensity;
  98. anythingModified = true;
  99. }
  100. if (rangeField.Value != light.Range)
  101. {
  102. rangeField.Value = light.Range;
  103. anythingModified = true;
  104. }
  105. if (spotAngleField.Value != light.SpotAngle.Degrees)
  106. {
  107. spotAngleField.Value = light.SpotAngle.Degrees;
  108. anythingModified = true;
  109. }
  110. if (spotFalloffAngleField.Value != light.SpotFalloffAngle.Degrees)
  111. {
  112. spotFalloffAngleField.Value = light.SpotFalloffAngle.Degrees;
  113. anythingModified = true;
  114. }
  115. if (castShadowField.Value != light.CastsShadow)
  116. {
  117. castShadowField.Value = light.CastsShadow;
  118. anythingModified = true;
  119. }
  120. return anythingModified;
  121. }
  122. }
  123. }