CameraInspector.cs 12 KB

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