|
|
@@ -15,299 +15,23 @@ namespace bs.Editor
|
|
|
[CustomInspector(typeof(Camera))]
|
|
|
internal class CameraInspector : Inspector
|
|
|
{
|
|
|
- private GUIEnumField projectionTypeField = new GUIEnumField(typeof(ProjectionType), new LocEdString("Projection type"));
|
|
|
- private GUISliderField fieldOfView = new GUISliderField(1, 360, new LocEdString("Field of view"));
|
|
|
- private GUIFloatField orthoHeight = new GUIFloatField(new LocEdString("Orthographic height"));
|
|
|
- private GUIFloatField aspectField = new GUIFloatField(new LocEdString("Aspect ratio"));
|
|
|
- private GUIFloatField nearPlaneField = new GUIFloatField(new LocEdString("Near plane"));
|
|
|
- private GUIFloatField farPlaneField = new GUIFloatField(new LocEdString("Far plane"));
|
|
|
- private GUIFloatField viewportXField = new GUIFloatField(new LocEdString("X"), 30);
|
|
|
- private GUIFloatField viewportYField = new GUIFloatField(new LocEdString("Y"), 30);
|
|
|
- private GUIFloatField viewportWidthField = new GUIFloatField(new LocEdString("Width"), 30);
|
|
|
- private GUIFloatField viewportHeightField = new GUIFloatField(new LocEdString("Height"), 30);
|
|
|
- private GUIEnumField clearFlagsFields = new GUIEnumField(typeof (ClearFlags), true, new LocEdString("Clear flags"));
|
|
|
- private GUIIntField clearStencilField = new GUIIntField(new LocEdString("Clear stencil"));
|
|
|
- private GUIFloatField clearDepthField = new GUIFloatField(new LocEdString("Clear depth"));
|
|
|
- private GUIColorField clearColorField = new GUIColorField(new LocEdString("Clear color"));
|
|
|
- private GUIIntField priorityField = new GUIIntField(new LocEdString("Render priority"));
|
|
|
- private GUIListBoxField layersField = new GUIListBoxField(Layers.Names, true, new LocEdString("Layers"));
|
|
|
- private GUIToggleField mainField = new GUIToggleField(new LocEdString("Main"));
|
|
|
-
|
|
|
- private GUIToggle renderSettingsFoldout = new GUIToggle(new LocEdString("Render settings"), EditorStyles.Foldout);
|
|
|
- private InspectorFieldDrawer renderSettingsGUI;
|
|
|
- private GUILayout renderSettingsLayout;
|
|
|
-
|
|
|
- private ulong layersValue = 0;
|
|
|
- private InspectableState modifyState;
|
|
|
-
|
|
|
/// <inheritdoc/>
|
|
|
protected internal override void Initialize()
|
|
|
{
|
|
|
- BuildGUI();
|
|
|
- }
|
|
|
-
|
|
|
- /// <inheritdoc/>
|
|
|
- protected internal override InspectableState Refresh(bool force = false)
|
|
|
- {
|
|
|
- Camera camera = InspectedObject as Camera;
|
|
|
- if (camera == null)
|
|
|
- return InspectableState.NotModified;
|
|
|
-
|
|
|
- ProjectionType projType = camera.ProjectionType;
|
|
|
- if (projectionTypeField.Value != (ulong)projType)
|
|
|
- {
|
|
|
- projectionTypeField.Value = (ulong)projType;
|
|
|
- ToggleTypeSpecificFields(projType);
|
|
|
- }
|
|
|
-
|
|
|
- fieldOfView.Value = camera.FieldOfView.Degrees;
|
|
|
- orthoHeight.Value = camera.OrthoHeight;
|
|
|
- aspectField.Value = camera.AspectRatio;
|
|
|
- nearPlaneField.Value = camera.NearClipPlane;
|
|
|
- farPlaneField.Value = camera.FarClipPlane;
|
|
|
- viewportXField.Value = camera.Viewport.Area.x;
|
|
|
- viewportYField.Value = camera.Viewport.Area.y;
|
|
|
- viewportWidthField.Value = camera.Viewport.Area.width;
|
|
|
- viewportHeightField.Value = camera.Viewport.Area.height;
|
|
|
- clearFlagsFields.Value = (ulong)camera.Viewport.ClearFlags;
|
|
|
- clearStencilField.Value = camera.Viewport.ClearStencil;
|
|
|
- clearDepthField.Value = camera.Viewport.ClearDepth;
|
|
|
- clearColorField.Value = camera.Viewport.ClearColor;
|
|
|
- priorityField.Value = camera.Priority;
|
|
|
- mainField.Value = camera.Main;
|
|
|
-
|
|
|
- if (layersValue != camera.Layers)
|
|
|
- {
|
|
|
- bool[] states = new bool[64];
|
|
|
- for (int i = 0; i < states.Length; i++)
|
|
|
- states[i] = (camera.Layers & Layers.Values[i]) == Layers.Values[i];
|
|
|
-
|
|
|
- layersField.States = states;
|
|
|
- layersValue = camera.Layers;
|
|
|
- }
|
|
|
-
|
|
|
- InspectableState renderSettingsState = renderSettingsGUI.Refresh(force);
|
|
|
- if (renderSettingsState != InspectableState.NotModified)
|
|
|
- {
|
|
|
- camera.RenderSettings = camera.RenderSettings;
|
|
|
- modifyState |= renderSettingsState;
|
|
|
- }
|
|
|
-
|
|
|
- InspectableState oldState = modifyState;
|
|
|
- if (modifyState.HasFlag(InspectableState.Modified))
|
|
|
- modifyState = InspectableState.NotModified;
|
|
|
-
|
|
|
- return oldState;
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Recreates all the GUI elements used by this inspector.
|
|
|
- /// </summary>
|
|
|
- private void BuildGUI()
|
|
|
- {
|
|
|
- if (InspectedObject != null)
|
|
|
- {
|
|
|
- Camera camera = (Camera)InspectedObject;
|
|
|
-
|
|
|
- projectionTypeField.OnSelectionChanged += x =>
|
|
|
- {
|
|
|
- camera.ProjectionType = (ProjectionType)x;
|
|
|
- MarkAsModified();
|
|
|
- ConfirmModify();
|
|
|
- ToggleTypeSpecificFields((ProjectionType)x);
|
|
|
- };
|
|
|
-
|
|
|
- fieldOfView.OnChanged += x => { camera.FieldOfView = (Degree)x; MarkAsModified(); };
|
|
|
- fieldOfView.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- orthoHeight.OnChanged += x => { camera.OrthoHeight = x; MarkAsModified(); };
|
|
|
- orthoHeight.OnConfirmed += ConfirmModify;
|
|
|
- orthoHeight.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- aspectField.OnChanged += x => { camera.AspectRatio = x; MarkAsModified(); };
|
|
|
- aspectField.OnConfirmed += ConfirmModify;
|
|
|
- aspectField.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- nearPlaneField.OnChanged += x => { camera.NearClipPlane = x; MarkAsModified(); };
|
|
|
- nearPlaneField.OnConfirmed += ConfirmModify;
|
|
|
- nearPlaneField.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- farPlaneField.OnChanged += x => { camera.FarClipPlane = x; MarkAsModified(); };
|
|
|
- farPlaneField.OnConfirmed += ConfirmModify;
|
|
|
- farPlaneField.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- viewportXField.OnChanged += x =>
|
|
|
- {
|
|
|
- Rect2 rect = camera.Viewport.Area;
|
|
|
- rect.x = x;
|
|
|
- camera.Viewport.Area = rect;
|
|
|
-
|
|
|
- MarkAsModified();
|
|
|
- };
|
|
|
- viewportXField.OnConfirmed += ConfirmModify;
|
|
|
- viewportXField.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- viewportYField.OnChanged += x =>
|
|
|
- {
|
|
|
- Rect2 rect = camera.Viewport.Area;
|
|
|
- rect.y = x;
|
|
|
- camera.Viewport.Area = rect;
|
|
|
-
|
|
|
- MarkAsModified();
|
|
|
- };
|
|
|
- viewportYField.OnConfirmed += ConfirmModify;
|
|
|
- viewportYField.OnFocusLost += ConfirmModify;
|
|
|
+ Camera camera = (Camera)InspectedObject;
|
|
|
|
|
|
- viewportWidthField.OnChanged += x =>
|
|
|
- {
|
|
|
- Rect2 rect = camera.Viewport.Area;
|
|
|
- rect.width = x;
|
|
|
- camera.Viewport.Area = rect;
|
|
|
+ drawer.AddDefault(camera);
|
|
|
+ drawer.BeginCategory("Viewport");
|
|
|
+ drawer.AddField("Area", () => camera.Viewport.Area, x => camera.Viewport.Area = x);
|
|
|
+ drawer.AddField("Clear flags", () => camera.Viewport.ClearFlags, x => camera.Viewport.ClearFlags = x);
|
|
|
+ drawer.AddField("Clear color", () => camera.Viewport.ClearColor, x => camera.Viewport.ClearColor = x);
|
|
|
+ drawer.AddField("Clear stencil", () => camera.Viewport.ClearStencil, x => camera.Viewport.ClearStencil = x);
|
|
|
+ drawer.AddField("Clear depth", () => camera.Viewport.ClearDepth, x => camera.Viewport.ClearDepth = x);
|
|
|
|
|
|
- MarkAsModified();
|
|
|
- };
|
|
|
- viewportWidthField.OnConfirmed += ConfirmModify;
|
|
|
- viewportWidthField.OnFocusLost += ConfirmModify;
|
|
|
+ drawer.AddConditional("FieldOfView", () => camera.ProjectionType == ProjectionType.Perspective);
|
|
|
+ drawer.AddConditional("OrthoHeight", () => camera.ProjectionType == ProjectionType.Orthographic);
|
|
|
|
|
|
- viewportHeightField.OnChanged += x =>
|
|
|
- {
|
|
|
- Rect2 rect = camera.Viewport.Area;
|
|
|
- rect.height = x;
|
|
|
- camera.Viewport.Area = rect;
|
|
|
-
|
|
|
- MarkAsModified();
|
|
|
- };
|
|
|
- viewportHeightField.OnConfirmed += ConfirmModify;
|
|
|
- viewportHeightField.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- clearFlagsFields.OnSelectionChanged += x =>
|
|
|
- {
|
|
|
- camera.Viewport.ClearFlags = (ClearFlags) x;
|
|
|
- MarkAsModified();
|
|
|
- ConfirmModify();
|
|
|
- };
|
|
|
-
|
|
|
- clearStencilField.OnChanged += x => { camera.Viewport.ClearStencil = (ushort) x; };
|
|
|
- clearStencilField.OnConfirmed += ConfirmModify;
|
|
|
- clearStencilField.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- clearDepthField.OnChanged += x => { camera.Viewport.ClearDepth = x; };
|
|
|
- clearDepthField.OnConfirmed += ConfirmModify;
|
|
|
- clearDepthField.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- clearColorField.OnChanged += x =>
|
|
|
- {
|
|
|
- camera.Viewport.ClearColor = x;
|
|
|
- MarkAsModified();
|
|
|
- ConfirmModify();
|
|
|
- };
|
|
|
-
|
|
|
- priorityField.OnChanged += x => { camera.Priority = x; MarkAsModified(); };
|
|
|
- priorityField.OnConfirmed += ConfirmModify;
|
|
|
- priorityField.OnFocusLost += ConfirmModify;
|
|
|
-
|
|
|
- layersField.OnSelectionChanged += x =>
|
|
|
- {
|
|
|
- ulong layers = 0;
|
|
|
- bool[] states = layersField.States;
|
|
|
- for (int i = 0; i < states.Length; i++)
|
|
|
- layers |= states[i] ? Layers.Values[i] : 0;
|
|
|
-
|
|
|
- layersValue = layers;
|
|
|
- camera.Layers = layers;
|
|
|
-
|
|
|
- MarkAsModified();
|
|
|
- ConfirmModify();
|
|
|
- };
|
|
|
-
|
|
|
- mainField.OnChanged += x =>
|
|
|
- {
|
|
|
- camera.Main = x;
|
|
|
- MarkAsModified();
|
|
|
- ConfirmModify();
|
|
|
- };
|
|
|
-
|
|
|
- Layout.AddElement(projectionTypeField);
|
|
|
- Layout.AddElement(fieldOfView);
|
|
|
- Layout.AddElement(orthoHeight);
|
|
|
- Layout.AddElement(aspectField);
|
|
|
- Layout.AddElement(nearPlaneField);
|
|
|
- Layout.AddElement(farPlaneField);
|
|
|
- GUILayoutX viewportTopLayout = Layout.AddLayoutX();
|
|
|
- viewportTopLayout.AddElement(new GUILabel(new LocEdString("Viewport"), GUIOption.FixedWidth(100)));
|
|
|
- GUILayoutY viewportContentLayout = viewportTopLayout.AddLayoutY();
|
|
|
-
|
|
|
- GUILayoutX viewportTopRow = viewportContentLayout.AddLayoutX();
|
|
|
- viewportTopRow.AddElement(viewportXField);
|
|
|
- viewportTopRow.AddElement(viewportWidthField);
|
|
|
-
|
|
|
- GUILayoutX viewportBotRow = viewportContentLayout.AddLayoutX();
|
|
|
- viewportBotRow.AddElement(viewportYField);
|
|
|
- viewportBotRow.AddElement(viewportHeightField);
|
|
|
-
|
|
|
- Layout.AddElement(clearFlagsFields);
|
|
|
- Layout.AddElement(clearColorField);
|
|
|
- Layout.AddElement(clearDepthField);
|
|
|
- Layout.AddElement(clearStencilField);
|
|
|
- Layout.AddElement(priorityField);
|
|
|
- Layout.AddElement(layersField);
|
|
|
- Layout.AddElement(mainField);
|
|
|
-
|
|
|
- renderSettingsFoldout.OnToggled += x =>
|
|
|
- {
|
|
|
- Persistent.SetBool("renderSettings_Expanded", x);
|
|
|
- renderSettingsLayout.Active = x;
|
|
|
- };
|
|
|
- renderSettingsFoldout.AcceptsKeyFocus = false;
|
|
|
- Layout.AddElement(renderSettingsFoldout);
|
|
|
-
|
|
|
- renderSettingsLayout = Layout.AddLayoutX();
|
|
|
- {
|
|
|
- renderSettingsLayout.AddSpace(10);
|
|
|
-
|
|
|
- GUILayoutY contentsLayout = renderSettingsLayout.AddLayoutY();
|
|
|
- renderSettingsGUI = new InspectorFieldDrawer(new InspectableContext(Persistent, camera), contentsLayout);
|
|
|
- renderSettingsGUI.AddDefault(camera.RenderSettings);
|
|
|
- }
|
|
|
-
|
|
|
- ToggleTypeSpecificFields(camera.ProjectionType);
|
|
|
- renderSettingsLayout.Active = Persistent.GetBool("renderSettings_Expanded");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Enables or disables different GUI elements depending on the projection type.
|
|
|
- /// </summary>
|
|
|
- /// <param name="type">Projection type to show GUI elements for.</param>
|
|
|
- private void ToggleTypeSpecificFields(ProjectionType type)
|
|
|
- {
|
|
|
- if (type == ProjectionType.Orthographic)
|
|
|
- {
|
|
|
- fieldOfView.Active = false;
|
|
|
- orthoHeight.Active = true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fieldOfView.Active = true;
|
|
|
- orthoHeight.Active = false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Marks the contents of the inspector as modified.
|
|
|
- /// </summary>
|
|
|
- protected void MarkAsModified()
|
|
|
- {
|
|
|
- modifyState |= InspectableState.ModifyInProgress;
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Confirms any queued modifications.
|
|
|
- /// </summary>
|
|
|
- protected void ConfirmModify()
|
|
|
- {
|
|
|
- if (modifyState.HasFlag(InspectableState.ModifyInProgress))
|
|
|
- modifyState |= InspectableState.Modified;
|
|
|
+ drawer.EndCategory();
|
|
|
}
|
|
|
}
|
|
|
|