CameraInspector.cs 13 KB

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