/// <summary> /// Updates all GUI elements from current values in the joint. /// </summary> /// <param name="joint">Joint to update the GUI from.</param> protected void Refresh(DistanceJoint joint) { bool enableMinDistanceLimit = joint.HasFlag(DistanceJointFlag.MinDistance); if (enableMinLimitField.Value != enableMinDistanceLimit) { enableMinLimitField.Value = enableMinDistanceLimit; minLimitField.Active = enableMinDistanceLimit; } minLimitField.Value = joint.MinDistance; bool enableMaxDistanceLimit = joint.HasFlag(DistanceJointFlag.MaxDistance); if (enableMaxLimitField.Value != enableMaxDistanceLimit) { enableMaxLimitField.Value = enableMaxDistanceLimit; maxLimitField.Active = enableMaxDistanceLimit; } maxLimitField.Value = joint.MaxDistance; toleranceField.Value = joint.Tolerance; bool enableSpring = joint.HasFlag(DistanceJointFlag.Spring); if (enableSpringField.Value != enableSpring) { enableSpringField.Value = enableSpring; springLayout.Active = enableSpring; } springGUI.Spring = joint.Spring; base.Refresh(joint); }
private static void DrawDistanceJoint(DistanceJoint joint) { Vector3 anchorA = GetAnchor(joint, JointBody.Target); Vector3 anchorB = GetAnchor(joint, JointBody.Anchor); Gizmos.Color = Color.White; Gizmos.DrawSphere(anchorA, 0.05f); Gizmos.DrawSphere(anchorB, 0.05f); Gizmos.Color = Color.Red; Vector3 diff = anchorB - anchorA; float length = diff.Length; Vector3 normal = diff.Normalized; float min = 0.0f; float max = length; if (joint.HasFlag(DistanceJointFlag.MinDistance)) { min = MathEx.Max(0.0f, joint.MinDistance); if (joint.HasFlag(DistanceJointFlag.MaxDistance)) { min = MathEx.Min(min, MathEx.Min(10000.0f, joint.MaxDistance)); } Gizmos.DrawLine(anchorA, anchorA + normal * min); } if (joint.HasFlag(DistanceJointFlag.MaxDistance)) { max = MathEx.Min(10000.0f, joint.MaxDistance); if (joint.HasFlag(DistanceJointFlag.MinDistance)) { max = MathEx.Max(max, min); } if (length > max) { Gizmos.DrawLine(anchorA + normal * max, anchorA + normal * length); } } Gizmos.Color = Color.Green; Gizmos.DrawLine(anchorA + normal * min, anchorA + normal * MathEx.Min(max, length)); }
/// <inheritdoc/> protected internal override void Initialize() { DistanceJoint joint = (DistanceJoint)InspectedObject; BuildGUI(joint, true); drawer.AddDefault(joint, typeof(DistanceJoint)); drawer.AddField("Enable minimum limit", () => joint.HasFlag(DistanceJointFlag.MinDistance), x => joint.SetFlag(DistanceJointFlag.MinDistance, x)); drawer.AddConditional("MinDistance", () => joint.HasFlag(DistanceJointFlag.MinDistance)); drawer.AddField("Enable maximum limit", () => joint.HasFlag(DistanceJointFlag.MaxDistance), x => joint.SetFlag(DistanceJointFlag.MaxDistance, x)); drawer.AddConditional("MaxDistance", () => joint.HasFlag(DistanceJointFlag.MaxDistance)); drawer.AddField("Enable spring", () => joint.HasFlag(DistanceJointFlag.Spring), x => joint.SetFlag(DistanceJointFlag.Spring, x)); drawer.AddConditional("Spring", () => joint.HasFlag(DistanceJointFlag.Spring)); }
/// <summary> /// Creates GUI elements for fields specific to the distance joint. /// </summary> protected void BuildGUI(DistanceJoint joint) { enableMinLimitField.OnChanged += x => { joint.SetFlag(DistanceJointFlag.MinDistance, x); MarkAsModified(); ConfirmModify(); minLimitField.Active = x; }; minLimitField.OnChanged += x => { joint.MinDistance = x; MarkAsModified(); }; minLimitField.OnFocusLost += ConfirmModify; minLimitField.OnConfirmed += ConfirmModify; enableMaxLimitField.OnChanged += x => { joint.SetFlag(DistanceJointFlag.MaxDistance, x); MarkAsModified(); ConfirmModify(); maxLimitField.Active = x; }; maxLimitField.OnChanged += x => { joint.MaxDistance = x; MarkAsModified(); }; maxLimitField.OnFocusLost += ConfirmModify; maxLimitField.OnConfirmed += ConfirmModify; toleranceField.OnChanged += x => { joint.Tolerance = x; MarkAsModified(); }; toleranceField.OnFocusLost += ConfirmModify; toleranceField.OnConfirmed += ConfirmModify; enableSpringField.OnChanged += x => { joint.SetFlag(DistanceJointFlag.Spring, x); MarkAsModified(); ConfirmModify(); springLayout.Active = x; }; Layout.AddElement(enableMinLimitField); GUILayoutX minLimitLayout = Layout.AddLayoutX(); { minLimitLayout.AddSpace(10); minLimitLayout.AddElement(minLimitField); } Layout.AddElement(enableMaxLimitField); GUILayoutX maxLimitLayout = Layout.AddLayoutX(); { maxLimitLayout.AddSpace(10); maxLimitLayout.AddElement(maxLimitField); } Layout.AddElement(toleranceField); Layout.AddElement(enableSpringField); springLayout = Layout.AddLayoutX(); { springLayout.AddSpace(10); springGUI = new SpringGUI(joint.Spring, springLayout); springGUI.OnChanged += x => { joint.Spring = x; MarkAsModified(); }; springGUI.OnConfirmed += ConfirmModify; } minLimitField.Active = joint.HasFlag(DistanceJointFlag.MinDistance); maxLimitField.Active = joint.HasFlag(DistanceJointFlag.MaxDistance); springLayout.Active = joint.HasFlag(DistanceJointFlag.Spring); base.BuildGUI(joint, true); }