CameraInspector.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. using System.Collections.Generic;
  2. using BansheeEngine;
  3. namespace BansheeEditor
  4. {
  5. /// <summary>
  6. /// Renders an inspector for the <see cref="Camera"/> component.
  7. /// </summary>
  8. [CustomInspector(typeof(Camera))]
  9. public class CameraInspector : Inspector
  10. {
  11. private GUIEnumField projectionTypeField = new GUIEnumField(typeof(ProjectionType), new LocEdString("Projection type"));
  12. private GUISliderField fieldOfView = new GUISliderField(1, 360, new LocEdString("Field of view"));
  13. private GUIFloatField orthoHeight = new GUIFloatField(new LocEdString("Orthographic height"));
  14. private GUIFloatField aspectField = new GUIFloatField(new LocEdString("Aspect ratio"));
  15. private GUIFloatField nearPlaneField = new GUIFloatField(new LocEdString("Near plane"));
  16. private GUIFloatField farPlaneField = new GUIFloatField(new LocEdString("Far plane"));
  17. private GUIFloatField viewportXField = new GUIFloatField(new LocEdString("X"), 30);
  18. private GUIFloatField viewportYField = new GUIFloatField(new LocEdString("Y"), 30);
  19. private GUIFloatField viewportWidthField = new GUIFloatField(new LocEdString("Width"), 30);
  20. private GUIFloatField viewportHeightField = new GUIFloatField(new LocEdString("Height"), 30);
  21. private GUIEnumField clearFlagsFields = new GUIEnumField(typeof (ClearFlags), true, new LocEdString("Clear flags"));
  22. private GUIIntField clearStencilField = new GUIIntField(new LocEdString("Clear stencil"));
  23. private GUIFloatField clearDepthField = new GUIFloatField(new LocEdString("Clear depth"));
  24. private GUIColorField clearColorField = new GUIColorField(new LocEdString("Clear color"));
  25. private GUIIntField priorityField = new GUIIntField(new LocEdString("Render priority"));
  26. private GUIListBoxField layersField = new GUIListBoxField(Layers.Names, true, new LocEdString("Layers"));
  27. private ulong layersValue = 0;
  28. /// <inheritdoc/>
  29. protected internal override void Initialize()
  30. {
  31. BuildGUI();
  32. }
  33. /// <inheritdoc/>
  34. protected internal override bool Refresh()
  35. {
  36. Camera camera = referencedObject as Camera;
  37. if (camera == null)
  38. return false;
  39. bool anythingModified = false;
  40. ProjectionType projType = camera.ProjectionType;
  41. if (projectionTypeField.Value != (ulong)projType)
  42. {
  43. projectionTypeField.Value = (ulong)projType;
  44. ToggleTypeSpecificFields(projType);
  45. anythingModified = true;
  46. }
  47. if (fieldOfView.Value != camera.FieldOfView.Degrees)
  48. {
  49. fieldOfView.Value = camera.FieldOfView.Degrees;
  50. anythingModified = true;
  51. }
  52. if (orthoHeight.Value != camera.OrthoHeight)
  53. {
  54. orthoHeight.Value = camera.OrthoHeight;
  55. anythingModified = true;
  56. }
  57. if (aspectField.Value != camera.AspectRatio)
  58. {
  59. aspectField.Value = camera.AspectRatio;
  60. anythingModified = true;
  61. }
  62. if (nearPlaneField.Value != camera.NearClipPlane)
  63. {
  64. nearPlaneField.Value = camera.NearClipPlane;
  65. anythingModified = true;
  66. }
  67. if (farPlaneField.Value != camera.FarClipPlane)
  68. {
  69. farPlaneField.Value = camera.FarClipPlane;
  70. anythingModified = true;
  71. }
  72. if (viewportXField.Value != camera.ViewportRect.x)
  73. {
  74. viewportXField.Value = camera.ViewportRect.x;
  75. anythingModified = true;
  76. }
  77. if (viewportYField.Value != camera.ViewportRect.y)
  78. {
  79. viewportYField.Value = camera.ViewportRect.y;
  80. anythingModified = true;
  81. }
  82. if (viewportWidthField.Value != camera.ViewportRect.width)
  83. {
  84. viewportWidthField.Value = camera.ViewportRect.width;
  85. anythingModified = true;
  86. }
  87. if (viewportHeightField.Value != camera.ViewportRect.height)
  88. {
  89. viewportHeightField.Value = camera.ViewportRect.height;
  90. anythingModified = true;
  91. }
  92. if (clearFlagsFields.Value != (ulong)camera.ClearFlags)
  93. {
  94. clearFlagsFields.Value = (ulong)camera.ClearFlags;
  95. anythingModified = true;
  96. }
  97. if (clearStencilField.Value != camera.ClearStencil)
  98. {
  99. clearStencilField.Value = camera.ClearStencil;
  100. anythingModified = true;
  101. }
  102. if (clearDepthField.Value != camera.ClearDepth)
  103. {
  104. clearDepthField.Value = camera.ClearDepth;
  105. anythingModified = true;
  106. }
  107. if (clearColorField.Value != camera.ClearColor)
  108. {
  109. clearColorField.Value = camera.ClearColor;
  110. anythingModified = true;
  111. }
  112. if (priorityField.Value != camera.Priority)
  113. {
  114. priorityField.Value = camera.Priority;
  115. anythingModified = true;
  116. }
  117. if (layersValue != camera.Layers)
  118. {
  119. bool[] states = new bool[64];
  120. for (int i = 0; i < states.Length; i++)
  121. states[i] = (camera.Layers & Layers.Values[i]) == Layers.Values[i];
  122. layersField.States = states;
  123. layersValue = camera.Layers;
  124. anythingModified = true;
  125. }
  126. return anythingModified;
  127. }
  128. /// <summary>
  129. /// Recreates all the GUI elements used by this inspector.
  130. /// </summary>
  131. private void BuildGUI()
  132. {
  133. if (referencedObject != null)
  134. {
  135. Camera camera = (Camera)referencedObject;
  136. projectionTypeField.OnSelectionChanged += x =>
  137. {
  138. camera.ProjectionType = (ProjectionType)x;
  139. ToggleTypeSpecificFields((ProjectionType)x);
  140. };
  141. fieldOfView.OnChanged += x => camera.FieldOfView = x;
  142. orthoHeight.OnChanged += x => camera.OrthoHeight = x;
  143. aspectField.OnChanged += x => camera.AspectRatio = x;
  144. nearPlaneField.OnChanged += x => camera.NearClipPlane = x;
  145. farPlaneField.OnChanged += x => camera.FarClipPlane = x;
  146. viewportXField.OnChanged += x =>
  147. { Rect2 rect = camera.ViewportRect; rect.x = x; camera.ViewportRect = rect; };
  148. viewportYField.OnChanged += x =>
  149. { Rect2 rect = camera.ViewportRect; rect.y = x; camera.ViewportRect = rect; };
  150. viewportWidthField.OnChanged += x =>
  151. { Rect2 rect = camera.ViewportRect; rect.width = x; camera.ViewportRect = rect; };
  152. viewportHeightField.OnChanged += x =>
  153. { Rect2 rect = camera.ViewportRect; rect.height = x; camera.ViewportRect = rect; };
  154. clearFlagsFields.OnSelectionChanged += x => camera.ClearFlags = (ClearFlags)x;
  155. clearStencilField.OnChanged += x => camera.ClearStencil = (ushort)x;
  156. clearDepthField.OnChanged += x => camera.ClearDepth = x;
  157. clearColorField.OnChanged += x => camera.ClearColor = x;
  158. priorityField.OnChanged += x => camera.Priority = x;
  159. layersField.OnSelectionChanged += x =>
  160. {
  161. ulong layers = 0;
  162. bool[] states = layersField.States;
  163. for (int i = 0; i < states.Length; i++)
  164. layers |= states[i] ? Layers.Values[i] : 0;
  165. layersValue = layers;
  166. camera.Layers = layers;
  167. };
  168. layout.AddElement(projectionTypeField);
  169. layout.AddElement(fieldOfView);
  170. layout.AddElement(orthoHeight);
  171. layout.AddElement(aspectField);
  172. layout.AddElement(nearPlaneField);
  173. layout.AddElement(farPlaneField);
  174. GUILayoutX viewportTopLayout = layout.AddLayoutX();
  175. viewportTopLayout.AddElement(new GUILabel(new LocEdString("Viewport"), GUIOption.FixedWidth(100)));
  176. GUILayoutY viewportContentLayout = viewportTopLayout.AddLayoutY();
  177. GUILayoutX viewportTopRow = viewportContentLayout.AddLayoutX();
  178. viewportTopRow.AddElement(viewportXField);
  179. viewportTopRow.AddElement(viewportWidthField);
  180. GUILayoutX viewportBotRow = viewportContentLayout.AddLayoutX();
  181. viewportBotRow.AddElement(viewportYField);
  182. viewportBotRow.AddElement(viewportHeightField);
  183. layout.AddElement(clearFlagsFields);
  184. layout.AddElement(clearColorField);
  185. layout.AddElement(clearDepthField);
  186. layout.AddElement(clearStencilField);
  187. layout.AddElement(priorityField);
  188. layout.AddElement(layersField);
  189. ToggleTypeSpecificFields(camera.ProjectionType);
  190. }
  191. }
  192. /// <summary>
  193. /// Enables or disables different GUI elements depending on the projection type.
  194. /// </summary>
  195. /// <param name="type">Projection type to show GUI elements for.</param>
  196. private void ToggleTypeSpecificFields(ProjectionType type)
  197. {
  198. if (type == ProjectionType.Orthographic)
  199. {
  200. fieldOfView.Enabled = false;
  201. orthoHeight.Enabled = true;
  202. }
  203. else
  204. {
  205. fieldOfView.Enabled = true;
  206. orthoHeight.Enabled = false;
  207. }
  208. }
  209. }
  210. }