| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
- //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
- using System.Collections.Generic;
- using BansheeEngine;
- namespace BansheeEditor
- {
- /** @addtogroup Inspectors
- * @{
- */
- /// <summary>
- /// Renders an inspector for the <see cref="Camera"/> component.
- /// </summary>
- [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 RenderSettingsGUI renderSettingsGUI;
- private GUILayout renderSettingsLayout;
- private ulong layersValue = 0;
- private InspectableState modifyState;
- /// <inheritdoc/>
- protected internal override void Initialize()
- {
- BuildGUI();
- }
- /// <inheritdoc/>
- protected internal override InspectableState Refresh()
- {
- 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;
- renderSettingsGUI.Settings = camera.RenderSettings;
- 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 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;
- viewportWidthField.OnChanged += x =>
- {
- Rect2 rect = camera.Viewport.Area;
- rect.width = x;
- camera.Viewport.Area = rect;
- MarkAsModified();
- };
- viewportWidthField.OnConfirmed += ConfirmModify;
- viewportWidthField.OnFocusLost += ConfirmModify;
- 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 RenderSettingsGUI(camera.RenderSettings, contentsLayout, Persistent);
- renderSettingsGUI.OnChanged += x => { camera.RenderSettings = x; MarkAsModified(); };
- renderSettingsGUI.OnConfirmed += ConfirmModify;
- }
- 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;
- }
- }
- /** @} */
- }
|