LightProbeVolumeInspector.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2017 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using System.Collections.Generic;
  4. using bs;
  5. namespace bs.Editor
  6. {
  7. /** @addtogroup Inspectors
  8. * @{
  9. */
  10. /// <summary>
  11. /// Renders an inspector for the <see cref="LightProbeVolume"/> component.
  12. /// </summary>
  13. [CustomInspector(typeof(LightProbeVolume))]
  14. internal class LightProbeVolumeInspector : Inspector
  15. {
  16. private GUILabel manualLabel = new GUILabel(new LocEdString("Manual probe placement"));
  17. private GUIButton addProbeButton = new GUIButton(new LocEdString("Add probe"));
  18. private GUIButton removeProbeButton = new GUIButton(new LocEdString("Remove probe"));
  19. private GUILabel uniformLabel = new GUILabel(new LocEdString("Uniform grid probe placement"));
  20. private GUIVector3Field positionField = new GUIVector3Field(new LocEdString("Grid origin"));
  21. private GUIVector3Field sizeField = new GUIVector3Field(new LocEdString("Grid size"));
  22. private GUIVector3Field densityField = new GUIVector3Field(new LocEdString("Grid density"));
  23. private GUIButton resetToGridButton = new GUIButton(new LocEdString("Reset to grid"));
  24. private GUIButton clipOuterButton = new GUIButton(new LocEdString("Clip to volume"));
  25. private GUIButton renderButton = new GUIButton(new LocEdString("Render"));
  26. private InspectableState modifyState;
  27. /// <inheritdoc/>
  28. protected internal override void Initialize()
  29. {
  30. Layout.Clear();
  31. LightProbeVolume lpv = InspectedObject as LightProbeVolume;
  32. if (lpv == null)
  33. return;
  34. // Set up callbacks
  35. addProbeButton.OnClick += () =>
  36. {
  37. StartUndo();
  38. lpv.AddProbe(Vector3.Zero);
  39. EndUndo();
  40. MarkAsModified();
  41. ConfirmModify();
  42. };
  43. removeProbeButton.OnClick += () =>
  44. {
  45. if (LightProbeVolumeNodeHandles.SelectedNode != uint.MaxValue)
  46. {
  47. StartUndo();
  48. lpv.RemoveProbe((int) LightProbeVolumeNodeHandles.SelectedNode);
  49. EndUndo();
  50. MarkAsModified();
  51. ConfirmModify();
  52. }
  53. };
  54. positionField.OnConfirm += x =>
  55. {
  56. AABox gridVolume = lpv.GridVolume;
  57. Vector3 extents = (gridVolume.Maximum - gridVolume.Minimum) * 0.5f;
  58. Vector3 min = positionField.Value - extents;
  59. Vector3 max = positionField.Value + extents;
  60. Vector3I cellCount = lpv.CellCount;
  61. gridVolume = new AABox(min, max);
  62. StartUndo();
  63. lpv.Resize(gridVolume, cellCount);
  64. EndUndo();
  65. MarkAsModified();
  66. ConfirmModify();
  67. };
  68. sizeField.OnConfirm += x =>
  69. {
  70. AABox gridVolume = lpv.GridVolume;
  71. Vector3 min = gridVolume.Minimum;
  72. Vector3 max = min + sizeField.Value;
  73. Vector3I cellCount = lpv.CellCount;
  74. gridVolume = new AABox(min, max);
  75. StartUndo();
  76. lpv.Resize(gridVolume, cellCount);
  77. EndUndo();
  78. MarkAsModified();
  79. ConfirmModify();
  80. };
  81. densityField.OnConfirm += x =>
  82. {
  83. AABox gridVolume = lpv.GridVolume;
  84. Vector3 density = densityField.Value;
  85. Vector3I cellCount = new Vector3I((int)density.x, (int)density.y, (int)density.y);
  86. StartUndo();
  87. lpv.Resize(gridVolume, cellCount);
  88. EndUndo();
  89. MarkAsModified();
  90. ConfirmModify();
  91. };
  92. resetToGridButton.OnClick += () =>
  93. {
  94. StartUndo();
  95. lpv.Reset();
  96. EndUndo();
  97. MarkAsModified();
  98. ConfirmModify();
  99. };
  100. clipOuterButton.OnClick += () =>
  101. {
  102. StartUndo();
  103. lpv.Clip();
  104. EndUndo();
  105. MarkAsModified();
  106. ConfirmModify();
  107. };
  108. renderButton.OnClick += () =>
  109. {
  110. lpv.RenderProbes();
  111. MarkAsModified();
  112. ConfirmModify();
  113. };
  114. // Set up layout
  115. Layout.AddElement(manualLabel);
  116. GUILayout manualLayout = Layout.AddLayoutX();
  117. manualLayout.AddElement(addProbeButton);
  118. manualLayout.AddElement(removeProbeButton);
  119. Layout.AddSpace(10);
  120. Layout.AddElement(uniformLabel);
  121. Layout.AddElement(positionField);
  122. Layout.AddElement(sizeField);
  123. Layout.AddElement(densityField);
  124. Layout.AddSpace(5);
  125. GUILayout uniformLayout = Layout.AddLayoutX();
  126. uniformLayout.AddElement(resetToGridButton);
  127. uniformLayout.AddElement(clipOuterButton);
  128. Layout.AddSpace(10);
  129. Layout.AddElement(renderButton);
  130. }
  131. /// <inheritdoc/>
  132. protected internal override InspectableState Refresh(bool force = false)
  133. {
  134. LightProbeVolume lpv = InspectedObject as LightProbeVolume;
  135. if (lpv == null)
  136. return InspectableState.NotModified;
  137. InspectableState oldState = modifyState;
  138. if (modifyState.HasFlag(InspectableState.Modified))
  139. modifyState = InspectableState.NotModified;
  140. AABox gridVolume = lpv.GridVolume;
  141. Vector3 size = gridVolume.Maximum - gridVolume.Minimum;
  142. Vector3 position = gridVolume.Minimum + size * 0.5f;
  143. if (!positionField.HasInputFocus || force)
  144. positionField.Value = position;
  145. if (!sizeField.HasInputFocus || force)
  146. sizeField.Value = size;
  147. if (!densityField.HasInputFocus || force)
  148. {
  149. Vector3I cellCount = lpv.CellCount;
  150. densityField.Value = new Vector3(cellCount.x, cellCount.y, cellCount.z);
  151. }
  152. return oldState;
  153. }
  154. /// <summary>
  155. /// Marks the contents of the inspector as modified.
  156. /// </summary>
  157. protected void MarkAsModified()
  158. {
  159. modifyState |= InspectableState.ModifyInProgress;
  160. }
  161. /// <summary>
  162. /// Confirms any queued modifications.
  163. /// </summary>
  164. protected void ConfirmModify()
  165. {
  166. if (modifyState.HasFlag(InspectableState.ModifyInProgress))
  167. modifyState |= InspectableState.Modified;
  168. }
  169. }
  170. /** @} */
  171. }