CameraInspector.cs 9.9 KB

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