CameraInspector.cs 14 KB

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