CameraInspector.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 GUIEnumField projectionTypeField = new GUIEnumField(typeof(ProjectionType), new LocEdString("Projection type"));
  12. private GUISliderField fieldOfView = new GUISliderField(1, 360, new LocEdString("Field of view"));
  13. private GUIFloatField orthoHeight = new GUIFloatField(new LocEdString("Orthographic height"));
  14. private GUIFloatField aspectField = new GUIFloatField(new LocEdString("Aspect ratio"));
  15. private GUIFloatField nearPlaneField = new GUIFloatField(new LocEdString("Near plane"));
  16. private GUIFloatField farPlaneField = new GUIFloatField(new LocEdString("Far plane"));
  17. private GUIFloatField viewportXField = new GUIFloatField(new LocEdString("X"), 30);
  18. private GUIFloatField viewportYField = new GUIFloatField(new LocEdString("Y"), 30);
  19. private GUIFloatField viewportWidthField = new GUIFloatField(new LocEdString("Width"), 30);
  20. private GUIFloatField viewportHeightField = new GUIFloatField(new LocEdString("Height"), 30);
  21. private GUIEnumField clearFlagsFields = new GUIEnumField(typeof (ClearFlags), true, new LocEdString("Clear flags"));
  22. private GUIIntField clearStencilField = new GUIIntField(new LocEdString("Clear stencil"));
  23. private GUIFloatField clearDepthField = new GUIFloatField(new LocEdString("Clear depth"));
  24. private GUIColorField clearColorField = new GUIColorField(new LocEdString("Clear color"));
  25. private GUIIntField priorityField = new GUIIntField(new LocEdString("Render priority"));
  26. private GUIListBoxField layersField = new GUIListBoxField(Layers.Names, true, new LocEdString("Layers"));
  27. private ulong layersValue = 0;
  28. /// <inheritdoc/>
  29. protected internal override void Initialize()
  30. {
  31. BuildGUI();
  32. }
  33. /// <inheritdoc/>
  34. protected internal override void Refresh()
  35. {
  36. Camera camera = InspectedObject as Camera;
  37. if (camera == null)
  38. return;
  39. ProjectionType projType = camera.ProjectionType;
  40. if (projectionTypeField.Value != (ulong)projType)
  41. {
  42. projectionTypeField.Value = (ulong)projType;
  43. ToggleTypeSpecificFields(projType);
  44. }
  45. fieldOfView.Value = camera.FieldOfView.Degrees;
  46. orthoHeight.Value = camera.OrthoHeight;
  47. aspectField.Value = camera.AspectRatio;
  48. nearPlaneField.Value = camera.NearClipPlane;
  49. farPlaneField.Value = camera.FarClipPlane;
  50. viewportXField.Value = camera.ViewportRect.x;
  51. viewportYField.Value = camera.ViewportRect.y;
  52. viewportWidthField.Value = camera.ViewportRect.width;
  53. viewportHeightField.Value = camera.ViewportRect.height;
  54. clearFlagsFields.Value = (ulong)camera.ClearFlags;
  55. clearStencilField.Value = camera.ClearStencil;
  56. clearDepthField.Value = camera.ClearDepth;
  57. clearColorField.Value = camera.ClearColor;
  58. priorityField.Value = camera.Priority;
  59. if (layersValue != camera.Layers)
  60. {
  61. bool[] states = new bool[64];
  62. for (int i = 0; i < states.Length; i++)
  63. states[i] = (camera.Layers & Layers.Values[i]) == Layers.Values[i];
  64. layersField.States = states;
  65. layersValue = camera.Layers;
  66. }
  67. }
  68. /// <summary>
  69. /// Recreates all the GUI elements used by this inspector.
  70. /// </summary>
  71. private void BuildGUI()
  72. {
  73. if (InspectedObject != null)
  74. {
  75. Camera camera = (Camera)InspectedObject;
  76. projectionTypeField.OnSelectionChanged += x =>
  77. {
  78. camera.ProjectionType = (ProjectionType)x;
  79. ToggleTypeSpecificFields((ProjectionType)x);
  80. };
  81. fieldOfView.OnChanged += x => camera.FieldOfView = x;
  82. orthoHeight.OnChanged += x => camera.OrthoHeight = x;
  83. aspectField.OnChanged += x => camera.AspectRatio = x;
  84. nearPlaneField.OnChanged += x => camera.NearClipPlane = x;
  85. farPlaneField.OnChanged += x => camera.FarClipPlane = x;
  86. viewportXField.OnChanged += x =>
  87. { Rect2 rect = camera.ViewportRect; rect.x = x; camera.ViewportRect = rect; };
  88. viewportYField.OnChanged += x =>
  89. { Rect2 rect = camera.ViewportRect; rect.y = x; camera.ViewportRect = rect; };
  90. viewportWidthField.OnChanged += x =>
  91. { Rect2 rect = camera.ViewportRect; rect.width = x; camera.ViewportRect = rect; };
  92. viewportHeightField.OnChanged += x =>
  93. { Rect2 rect = camera.ViewportRect; rect.height = x; camera.ViewportRect = rect; };
  94. clearFlagsFields.OnSelectionChanged += x => camera.ClearFlags = (ClearFlags)x;
  95. clearStencilField.OnChanged += x => camera.ClearStencil = (ushort)x;
  96. clearDepthField.OnChanged += x => camera.ClearDepth = x;
  97. clearColorField.OnChanged += x => camera.ClearColor = x;
  98. priorityField.OnChanged += x => camera.Priority = x;
  99. layersField.OnSelectionChanged += x =>
  100. {
  101. ulong layers = 0;
  102. bool[] states = layersField.States;
  103. for (int i = 0; i < states.Length; i++)
  104. layers |= states[i] ? Layers.Values[i] : 0;
  105. layersValue = layers;
  106. camera.Layers = layers;
  107. };
  108. Layout.AddElement(projectionTypeField);
  109. Layout.AddElement(fieldOfView);
  110. Layout.AddElement(orthoHeight);
  111. Layout.AddElement(aspectField);
  112. Layout.AddElement(nearPlaneField);
  113. Layout.AddElement(farPlaneField);
  114. GUILayoutX viewportTopLayout = Layout.AddLayoutX();
  115. viewportTopLayout.AddElement(new GUILabel(new LocEdString("Viewport"), GUIOption.FixedWidth(100)));
  116. GUILayoutY viewportContentLayout = viewportTopLayout.AddLayoutY();
  117. GUILayoutX viewportTopRow = viewportContentLayout.AddLayoutX();
  118. viewportTopRow.AddElement(viewportXField);
  119. viewportTopRow.AddElement(viewportWidthField);
  120. GUILayoutX viewportBotRow = viewportContentLayout.AddLayoutX();
  121. viewportBotRow.AddElement(viewportYField);
  122. viewportBotRow.AddElement(viewportHeightField);
  123. Layout.AddElement(clearFlagsFields);
  124. Layout.AddElement(clearColorField);
  125. Layout.AddElement(clearDepthField);
  126. Layout.AddElement(clearStencilField);
  127. Layout.AddElement(priorityField);
  128. Layout.AddElement(layersField);
  129. ToggleTypeSpecificFields(camera.ProjectionType);
  130. }
  131. }
  132. /// <summary>
  133. /// Enables or disables different GUI elements depending on the projection type.
  134. /// </summary>
  135. /// <param name="type">Projection type to show GUI elements for.</param>
  136. private void ToggleTypeSpecificFields(ProjectionType type)
  137. {
  138. if (type == ProjectionType.Orthographic)
  139. {
  140. fieldOfView.Active = false;
  141. orthoHeight.Active = true;
  142. }
  143. else
  144. {
  145. fieldOfView.Active = true;
  146. orthoHeight.Active = false;
  147. }
  148. }
  149. }
  150. }