/// <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(HingeJoint joint) { bool enableLimit = joint.HasFlag(HingeJointFlag.Limit); if (enableLimitField.Value != enableLimit) { enableLimitField.Value = enableLimit; ToggleLimitFields(enableLimit); } limitGUI.Limit = joint.Limit; bool enableDrive = joint.HasFlag(HingeJointFlag.Drive); if (enableDriveField.Value != enableDrive) { enableDriveField.Value = enableDrive; ToggleDriveFields(enableDrive); } speedField.Value = joint.Drive.speed; forceLimitField.Value = joint.Drive.forceLimit; gearRatioField.Value = joint.Drive.gearRatio; freeSpinField.Value = joint.Drive.freeSpin; base.Refresh(joint); }
/// <inheritdoc/> protected internal override void Initialize() { HingeJoint joint = (HingeJoint)InspectedObject; BuildGUI(joint, true); drawer.AddDefault(joint, typeof(HingeJoint)); drawer.AddField("Enable limit", () => joint.HasFlag(HingeJointFlag.Limit), x => joint.SetFlag(HingeJointFlag.Limit, x)); drawer.AddConditional("Limit", () => joint.HasFlag(HingeJointFlag.Limit)); drawer.AddField("Enable drive", () => joint.HasFlag(HingeJointFlag.Drive), x => joint.SetFlag(HingeJointFlag.Drive, x)); drawer.AddConditional("Drive", () => joint.HasFlag(HingeJointFlag.Drive)); }
private static void DrawHingeJoint(HingeJoint joint) { Vector3 target = GetAnchor(joint, JointBody.Target); Vector3 anchor = GetAnchor(joint, JointBody.Anchor); Vector3 center = target; Rigidbody rigidbody = joint.GetBody(JointBody.Target); if (rigidbody != null) { center = rigidbody.SceneObject.Position; } Gizmos.Color = Color.White; Gizmos.DrawSphere(center, 0.05f); Gizmos.Color = Color.Yellow; Gizmos.DrawSphere(target, 0.05f); Gizmos.DrawSphere(anchor, 0.05f); Gizmos.Color = Color.Green; Gizmos.DrawLine(target, center); const float radius = 0.25f; const float height = 0.5f; if (joint.HasFlag(HingeJointFlag.Limit)) { Gizmos.Transform = joint.SceneObject.WorldTransform; LimitAngularRange limit = joint.Limit; Action <float> drawLimitedArc = x => { Degree lower = MathEx.WrapAngle(limit.lower); Degree upper = MathEx.WrapAngle(limit.upper); lower = MathEx.Min(lower, upper); upper = MathEx.Max(upper, lower); // Arc zero to lower limit Gizmos.Color = Color.Red; Gizmos.DrawWireArc(Vector3.XAxis * x, Vector3.XAxis, radius, new Degree(0.0f), lower); // Arc lower to upper limit Degree validRange = upper - lower; Gizmos.Color = Color.Green; Gizmos.DrawWireArc(Vector3.XAxis * x, Vector3.XAxis, radius, lower, validRange); // Arc upper to full circle Degree remainingRange = new Degree(360) - upper; Gizmos.Color = Color.Red; Gizmos.DrawWireArc(Vector3.XAxis * x, Vector3.XAxis, radius, upper, remainingRange); }; drawLimitedArc(-height); drawLimitedArc(height); } else { Gizmos.Color = Color.Green; Gizmos.Transform = joint.SceneObject.WorldTransform; Gizmos.DrawWireDisc(Vector3.XAxis * -height, Vector3.XAxis, radius); Gizmos.DrawWireDisc(Vector3.XAxis * height, Vector3.XAxis, radius); } Vector3[] lineStartPoints = new Vector3[4]; lineStartPoints[0] = new Vector3(-height, radius, 0); lineStartPoints[1] = new Vector3(-height, -radius, 0); lineStartPoints[2] = new Vector3(-height, 0, radius); lineStartPoints[3] = new Vector3(-height, 0, -radius); Vector3[] lineEndPoints = new Vector3[4]; lineEndPoints[0] = new Vector3(height, radius, 0); lineEndPoints[1] = new Vector3(height, -radius, 0); lineEndPoints[2] = new Vector3(height, 0, radius); lineEndPoints[3] = new Vector3(height, 0, -radius); Gizmos.Color = Color.Green; for (int i = 0; i < 4; i++) { Gizmos.DrawLine(lineStartPoints[i], lineEndPoints[i]); } }
/// <summary> /// Creates GUI elements for fields specific to the hinge joint. /// </summary> protected void BuildGUI(HingeJoint joint) { enableLimitField.OnChanged += x => { joint.SetFlag(HingeJointFlag.Limit, x); MarkAsModified(); ConfirmModify(); ToggleLimitFields(x); }; enableDriveField.OnChanged += x => { joint.SetFlag(HingeJointFlag.Drive, x); MarkAsModified(); ConfirmModify(); ToggleDriveFields(x); }; speedField.OnChanged += x => { HingeJointDrive driveData = joint.Drive; driveData.speed = x; joint.Drive = driveData; MarkAsModified(); }; speedField.OnFocusLost += ConfirmModify; speedField.OnConfirmed += ConfirmModify; forceLimitField.OnChanged += x => { HingeJointDrive driveData = joint.Drive; driveData.forceLimit = x; joint.Drive = driveData; MarkAsModified(); }; forceLimitField.OnFocusLost += ConfirmModify; forceLimitField.OnConfirmed += ConfirmModify; gearRatioField.OnChanged += x => { HingeJointDrive driveData = joint.Drive; driveData.gearRatio = x; joint.Drive = driveData; MarkAsModified(); }; gearRatioField.OnFocusLost += ConfirmModify; gearRatioField.OnConfirmed += ConfirmModify; freeSpinField.OnChanged += x => { HingeJointDrive driveData = joint.Drive; driveData.freeSpin = x; joint.Drive = driveData; MarkAsModified(); ConfirmModify(); }; Layout.AddElement(enableLimitField); limitLayout = Layout.AddLayoutX(); { limitLayout.AddSpace(10); GUILayoutY limitContentsLayout = limitLayout.AddLayoutY(); limitGUI = new LimitAngularRangeGUI(joint.Limit, limitContentsLayout, Persistent); limitGUI.OnChanged += (x, y) => { joint.Limit = x; joint.Limit.SetBase(y); MarkAsModified(); }; limitGUI.OnConfirmed += ConfirmModify; } Layout.AddElement(enableDriveField); driveLayout = Layout.AddLayoutX(); { driveLayout.AddSpace(10); GUILayoutY driveContentsLayout = driveLayout.AddLayoutY(); driveContentsLayout.AddElement(speedField); driveContentsLayout.AddElement(forceLimitField); driveContentsLayout.AddElement(gearRatioField); driveContentsLayout.AddElement(freeSpinField); } ToggleLimitFields(joint.HasFlag(HingeJointFlag.Limit)); ToggleDriveFields(joint.HasFlag(HingeJointFlag.Drive)); base.BuildGUI(joint, true); }