CameraInspector.cs 13 KB

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