//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// using BansheeEngine; namespace BansheeEditor { /** @addtogroup Inspectors * @{ */ /// /// Renders common inspector elements for all components. /// internal abstract class ColliderInspector : Inspector { private GUIToggleField isTriggerField = new GUIToggleField(new LocEdString("Is trigger")); private GUIFloatField massField = new GUIFloatField(new LocEdString("Mass")); private GUIResourceField materialField = new GUIResourceField(typeof (PhysicsMaterial), new LocEdString("Material")); private GUIFloatField contactOffsetField = new GUIFloatField(new LocEdString("Contact offset")); private GUIFloatField restOffsetField = new GUIFloatField(new LocEdString("Rest offset")); private GUIEnumField collisionReportModeField = new GUIEnumField(typeof (CollisionReportMode), new LocEdString("Collision report mode")); private GUIListBoxField layerField = new GUIListBoxField(Layers.Names, false, new LocEdString("Layer")); private ulong layersValue = 0; protected InspectableState modifyState; /// /// Updates all GUI elements from current values in the collider. /// /// Collider to update the GUI from. protected virtual void Refresh(Collider collider) { isTriggerField.Value = collider.Trigger; massField.Value = collider.Mass; materialField.Value = collider.Material; contactOffsetField.Value = collider.ContactOffset; restOffsetField.Value = collider.RestOffset; collisionReportModeField.Value = (ulong)collider.CollisionReportMode; if (layersValue != collider.Layer) { bool[] states = new bool[64]; for (int i = 0; i < states.Length; i++) states[i] = (collider.Layer & Layers.Values[i]) == Layers.Values[i]; layerField.States = states; layersValue = collider.Layer; } } /// /// Creates GUI elements for fields common to all colliders. /// protected virtual void BuildGUI(Collider collider) { isTriggerField.OnChanged += x => { collider.Trigger = x; MarkAsModified(); ConfirmModify(); }; massField.OnChanged += x => { collider.Mass = x; MarkAsModified(); }; massField.OnConfirmed += ConfirmModify; massField.OnFocusLost += ConfirmModify; materialField.OnChanged += x => { PhysicsMaterial mesh = Resources.Load(x); collider.Material = mesh; MarkAsModified(); ConfirmModify(); }; contactOffsetField.OnChanged += x => { collider.ContactOffset = x; MarkAsModified(); }; contactOffsetField.OnConfirmed += ConfirmModify; contactOffsetField.OnFocusLost += ConfirmModify; restOffsetField.OnChanged += x => { collider.RestOffset = x; MarkAsModified(); }; restOffsetField.OnConfirmed += ConfirmModify; restOffsetField.OnFocusLost += ConfirmModify; collisionReportModeField.OnSelectionChanged += x => { collider.CollisionReportMode = (CollisionReportMode)x; MarkAsModified(); ConfirmModify(); }; layerField.OnSelectionChanged += x => { ulong layer = 0; bool[] states = layerField.States; for (int i = 0; i < states.Length; i++) layer |= states[i] ? Layers.Values[i] : 0; layersValue = layer; collider.Layer = layer; MarkAsModified(); ConfirmModify(); }; Layout.AddElement(isTriggerField); Layout.AddElement(massField); Layout.AddElement(materialField); Layout.AddElement(contactOffsetField); Layout.AddElement(restOffsetField); Layout.AddElement(collisionReportModeField); Layout.AddElement(layerField); } /// /// Marks the contents of the inspector as modified. /// protected void MarkAsModified() { modifyState |= InspectableState.ModifyInProgress; } /// /// Confirms any queued modifications. /// protected void ConfirmModify() { if (modifyState.HasFlag(InspectableState.ModifyInProgress)) modifyState |= InspectableState.Modified; } } /** @} */ }