//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// using System; using BansheeEngine; namespace BansheeEditor { /** @addtogroup Inspectors * @{ */ /// /// Draws GUI elements for inspecting an object. /// internal class SpringGUI { private Spring spring; private GUIFloatField stiffnessField = new GUIFloatField(new LocEdString("Stiffness")); private GUIFloatField dampingField = new GUIFloatField(new LocEdString("Damping")); public Action OnChanged; public Action OnConfirmed; /// /// Current value of the spring object. /// public Spring Spring { get { return spring; } set { spring = value; stiffnessField.Value = value.stiffness; dampingField.Value = value.damping; } } /// /// Constructs a new set of GUI elements for inspecting the spring object. /// /// Initial values to assign to the GUI elements. /// Layout to append the GUI elements to. public SpringGUI(Spring spring, GUILayout layout) { this.spring = spring; stiffnessField.OnChanged += x => { this.spring.stiffness = x; MarkAsModified(); }; stiffnessField.OnFocusLost += ConfirmModify; stiffnessField.OnConfirmed += ConfirmModify; dampingField.OnChanged += x => { this.spring.damping = x; MarkAsModified(); }; dampingField.OnFocusLost += ConfirmModify; dampingField.OnConfirmed += ConfirmModify; layout.AddElement(stiffnessField); layout.AddElement(dampingField); } /// /// Marks the contents of the inspector as modified. /// private void MarkAsModified() { if (OnChanged != null) OnChanged(spring); } /// /// Confirms any queued modifications. /// private void ConfirmModify() { if (OnConfirmed != null) OnConfirmed(); } } /// /// Draws GUI elements for inspecting an object. /// internal class LimitCommonGUI { private LimitCommon limitData; private SerializableProperties properties; private string prefix; private GUIToggle hardFoldout = new GUIToggle(new LocEdString("Hard"), EditorStyles.Foldout); private GUIFloatField contactDistanceField = new GUIFloatField(new LocEdString("Contact distance")); private GUIToggle softFoldout = new GUIToggle(new LocEdString("Soft"), EditorStyles.Foldout); private GUISliderField restitutionField = new GUISliderField(0, 1, new LocEdString("Restitution")); private GUIToggle springFoldout = new GUIToggle(new LocEdString("Spring"), EditorStyles.Foldout); private SpringGUI springGUI; private GUILayoutX hardLimitLayout; private GUILayoutX softLimitLayout; private GUILayoutX springLayout; public Action OnChanged; public Action OnConfirmed; /// /// Current limit properties. /// public LimitCommon LimitData { get { return limitData; } set { limitData = value; contactDistanceField.Value = value.contactDist; restitutionField.Value = value.restitution; springGUI.Spring = value.spring; } } /// /// Constructs a new set of GUI elements for inspecting the limit object. /// /// Prefix that identifies the exact type of the limit type. /// Initial values to assign to the GUI elements. /// Layout to append the GUI elements to. /// A set of properties that are persisted by the parent inspector. Used for saving state. /// public LimitCommonGUI(string prefix, LimitCommon limitData, GUILayout layout, SerializableProperties properties) { this.limitData = limitData; this.properties = properties; this.prefix = prefix; hardFoldout.AcceptsKeyFocus = false; hardFoldout.OnToggled += x => { properties.SetBool(prefix + "_hardLimit_Expanded", x); ToggleLimitFields(); }; contactDistanceField.OnChanged += x => { this.limitData.contactDist = x; MarkAsModified(); }; contactDistanceField.OnFocusLost += ConfirmModify; contactDistanceField.OnConfirmed += ConfirmModify; softFoldout.AcceptsKeyFocus = false; softFoldout.OnToggled += x => { properties.SetBool(prefix + "_softLimit_Expanded", x); ToggleLimitFields(); }; restitutionField.OnChanged += x => { this.limitData.restitution = x; MarkAsModified(); }; restitutionField.OnFocusLost += ConfirmModify; springFoldout.AcceptsKeyFocus = false; springFoldout.OnToggled += x => { properties.SetBool(prefix + "_spring_Expanded", x); ToggleLimitFields(); }; hardLimitLayout = layout.AddLayoutX(); { hardLimitLayout.AddSpace(10); GUILayoutY hardLimitContentsLayout = hardLimitLayout.AddLayoutY(); hardLimitContentsLayout.AddElement(contactDistanceField); } softLimitLayout = layout.AddLayoutX(); layout.AddElement(softFoldout); { softLimitLayout.AddSpace(10); GUILayoutY softLimitContentsLayout = softLimitLayout.AddLayoutY(); softLimitContentsLayout.AddElement(restitutionField); softLimitContentsLayout.AddElement(springFoldout); springLayout = softLimitContentsLayout.AddLayoutX(); { springLayout.AddSpace(10); GUILayoutY springContentsLayout = springLayout.AddLayoutY(); springGUI = new SpringGUI(limitData.spring, springContentsLayout); springGUI.OnChanged += x => { this.limitData.spring = x; MarkAsModified(); }; springGUI.OnConfirmed += ConfirmModify; } } } /// /// Marks the contents of the inspector as modified. /// private void MarkAsModified() { if (OnChanged != null) OnChanged(limitData); } /// /// Confirms any queued modifications. /// private void ConfirmModify() { if (OnConfirmed != null) OnConfirmed(); } /// /// Hides or shows limit property GUI elements depending on set properties. /// private void ToggleLimitFields() { hardLimitLayout.Active = properties.GetBool(prefix + "_hardLimit_Expanded"); softLimitLayout.Active = properties.GetBool(prefix + "_softLimit_Expanded"); springLayout.Active = properties.GetBool(prefix + "_spring_Expanded"); } } /// /// Draws GUI elements for inspecting an object. /// internal class LimitLinearGUI { private LimitLinear limitData; private GUIFloatField limitExtentField = new GUIFloatField(new LocEdString("Extent")); private LimitCommonGUI limitCommonGUI; public Action OnChanged; public Action OnConfirmed; /// /// Current limit properties. /// public LimitLinear Limit { set { limitData = value; limitExtentField.Value = limitData.extent; limitCommonGUI.LimitData = value.GetBase(); } } /// /// Constructs a new set of GUI elements for inspecting the limit object. /// /// Initial values to assign to the GUI elements. /// Layout to append the GUI elements to. /// A set of properties that are persisted by the parent inspector. Used for saving state. /// public LimitLinearGUI(LimitLinear limit, GUILayout layout, SerializableProperties properties) { limitData = limit; limitExtentField.OnChanged += x => { limitData.extent = x; MarkAsModified(); }; limitExtentField.OnFocusLost += ConfirmModify; layout.AddElement(limitExtentField); limitCommonGUI = new LimitCommonGUI("linear", limit.GetBase(), layout, properties); limitCommonGUI.OnChanged += x => MarkAsModified(); limitCommonGUI.OnConfirmed += ConfirmModify; } /// /// Marks the contents of the inspector as modified. /// private void MarkAsModified() { if (OnChanged != null) OnChanged(limitData, limitCommonGUI.LimitData); } /// /// Confirms any queued modifications. /// private void ConfirmModify() { if (OnConfirmed != null) OnConfirmed(); } } /// /// Draws GUI elements for inspecting an object. /// internal class LimitLinearRangeGUI { private LimitLinearRange limitData; private GUIFloatField limitLowerField = new GUIFloatField(new LocEdString("Lower")); private GUIFloatField limitUpperField = new GUIFloatField(new LocEdString("Upper")); private LimitCommonGUI limitCommonGUI; public Action OnChanged; public Action OnConfirmed; /// /// Current limit properties. /// public LimitLinearRange Limit { set { limitData = value; limitLowerField.Value = limitData.lower; limitUpperField.Value = limitData.upper; limitCommonGUI.LimitData = value.GetBase(); } } /// /// Constructs a new set of GUI elements for inspecting the limit object. /// /// Initial values to assign to the GUI elements. /// Layout to append the GUI elements to. /// A set of properties that are persisted by the parent inspector. Used for saving state. /// public LimitLinearRangeGUI(LimitLinearRange limit, GUILayout layout, SerializableProperties properties) { this.limitData = limit; limitLowerField.OnChanged += x => { limitData.lower = x; MarkAsModified(); }; limitLowerField.OnFocusLost += ConfirmModify; limitUpperField.OnChanged += x => { limitData.upper = x; MarkAsModified(); }; limitUpperField.OnFocusLost += ConfirmModify; layout.AddElement(limitLowerField); layout.AddElement(limitUpperField); limitCommonGUI = new LimitCommonGUI("linearRange", limit.GetBase(), layout, properties); limitCommonGUI.OnChanged += x => MarkAsModified(); limitCommonGUI.OnConfirmed += ConfirmModify; } /// /// Marks the contents of the inspector as modified. /// private void MarkAsModified() { if (OnChanged != null) OnChanged(limitData, limitCommonGUI.LimitData); } /// /// Confirms any queued modifications. /// private void ConfirmModify() { if (OnConfirmed != null) OnConfirmed(); } } /// /// Draws GUI elements for inspecting an object. /// internal class LimitAngularRangeGUI { private LimitAngularRange limitData; private GUISliderField limitLowerField = new GUISliderField(0, 359, new LocEdString("Lower")); private GUISliderField limitUpperField = new GUISliderField(0, 359, new LocEdString("Upper")); private LimitCommonGUI limitCommonGUI; public Action OnChanged; public Action OnConfirmed; /// /// Current limit properties. /// public LimitAngularRange Limit { set { limitData = value; limitLowerField.Value = limitData.lower.Degrees; limitUpperField.Value = limitData.upper.Degrees; limitCommonGUI.LimitData = value.GetBase(); } } /// /// Constructs a new set of GUI elements for inspecting the limit object. /// /// Initial values to assign to the GUI elements. /// Layout to append the GUI elements to. /// A set of properties that are persisted by the parent inspector. Used for saving state. /// public LimitAngularRangeGUI(LimitAngularRange limit, GUILayout layout, SerializableProperties properties) { this.limitData = limit; limitLowerField.OnChanged += x => { limitData.lower = new Degree(x); MarkAsModified(); }; limitLowerField.OnFocusLost += ConfirmModify; limitUpperField.OnChanged += x => { limitData.upper = new Degree(x); MarkAsModified(); }; limitUpperField.OnFocusLost += ConfirmModify; layout.AddElement(limitLowerField); layout.AddElement(limitUpperField); limitCommonGUI = new LimitCommonGUI("angularRange", limit.GetBase(), layout, properties); limitCommonGUI.OnChanged += x => MarkAsModified(); limitCommonGUI.OnConfirmed += ConfirmModify; } /// /// Marks the contents of the inspector as modified. /// private void MarkAsModified() { if (OnChanged != null) OnChanged(limitData, limitCommonGUI.LimitData); } /// /// Confirms any queued modifications. /// private void ConfirmModify() { if (OnConfirmed != null) OnConfirmed(); } } /// /// Draws GUI elements for inspecting an object. /// internal class LimitConeRangeGUI { private LimitConeRange limitData; private GUISliderField yLimitAngleField = new GUISliderField(0, 180, new LocEdString("Y limit")); private GUISliderField zLimitAngleField = new GUISliderField(0, 180, new LocEdString("Z limit")); private LimitCommonGUI limitCommonGUI; public Action OnChanged; public Action OnConfirmed; /// /// Current limit properties. /// public LimitConeRange Limit { set { limitData = value; yLimitAngleField.Value = limitData.yLimitAngle.Degrees; zLimitAngleField.Value = limitData.zLimitAngle.Degrees; limitCommonGUI.LimitData = value.GetBase(); } } /// /// Constructs a new set of GUI elements for inspecting the limit object. /// /// Initial values to assign to the GUI elements. /// Layout to append the GUI elements to. /// A set of properties that are persisted by the parent inspector. Used for saving state. /// public LimitConeRangeGUI(LimitConeRange limit, GUILayout layout, SerializableProperties properties) { this.limitData = limit; yLimitAngleField.OnChanged += x => { limitData.yLimitAngle = new Degree(x); MarkAsModified(); }; yLimitAngleField.OnFocusLost += ConfirmModify; zLimitAngleField.OnChanged += x => { limitData.zLimitAngle = new Degree(x); MarkAsModified(); }; zLimitAngleField.OnFocusLost += ConfirmModify; layout.AddElement(yLimitAngleField); layout.AddElement(zLimitAngleField); limitCommonGUI = new LimitCommonGUI("coneRange", limit.GetBase(), layout, properties); limitCommonGUI.OnChanged += x => MarkAsModified(); limitCommonGUI.OnConfirmed += ConfirmModify; } /// /// Marks the contents of the inspector as modified. /// private void MarkAsModified() { if (OnChanged != null) OnChanged(limitData, limitCommonGUI.LimitData); } /// /// Confirms any queued modifications. /// private void ConfirmModify() { if (OnConfirmed != null) OnConfirmed(); } } /** @} */ }