CameraInspector.cs 13 KB

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