/// <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) { if (enableLimitField.Value != joint.EnableLimit) { enableLimitField.Value = joint.EnableLimit; ToggleLimitFields(joint.EnableLimit); } limitGUI.Limit = joint.Limit; if (enableDriveField.Value != joint.EnableDrive) { enableDriveField.Value = joint.EnableDrive; ToggleDriveFields(joint.EnableDrive); } speedField.Value = joint.Drive.Speed; forceLimitField.Value = joint.Drive.ForceLimit; gearRatioField.Value = joint.Drive.GearRatio; freeSpinField.Value = joint.Drive.FreeSpin; base.Refresh(joint); }
/// <summary> /// Creates GUI elements for fields specific to the hinge joint. /// </summary> protected void BuildGUI(HingeJoint joint) { enableLimitField.OnChanged += x => { joint.EnableLimit = x; MarkAsModified(); ConfirmModify(); ToggleLimitFields(x); }; enableDriveField.OnChanged += x => { joint.EnableDrive = x; MarkAsModified(); ConfirmModify(); ToggleDriveFields(x); }; speedField.OnChanged += x => { HingeJointDriveData driveData = joint.Drive.Data; driveData.speed = x; joint.Drive = new HingeJointDrive(driveData); MarkAsModified(); }; speedField.OnFocusLost += ConfirmModify; speedField.OnConfirmed += ConfirmModify; forceLimitField.OnChanged += x => { HingeJointDriveData driveData = joint.Drive.Data; driveData.forceLimit = x; joint.Drive = new HingeJointDrive(driveData); MarkAsModified(); }; forceLimitField.OnFocusLost += ConfirmModify; forceLimitField.OnConfirmed += ConfirmModify; gearRatioField.OnChanged += x => { HingeJointDriveData driveData = joint.Drive.Data; driveData.gearRatio = x; joint.Drive = new HingeJointDrive(driveData); MarkAsModified(); }; gearRatioField.OnFocusLost += ConfirmModify; gearRatioField.OnConfirmed += ConfirmModify; freeSpinField.OnChanged += x => { HingeJointDriveData driveData = joint.Drive.Data; driveData.freeSpin = x; joint.Drive = new HingeJointDrive(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 = new LimitAngularRange(x, 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.EnableLimit); ToggleDriveFields(joint.EnableDrive); base.BuildGUI(joint, true); }
private static void DrawHingeJoint(HingeJoint joint) { Vector3 target = GetAnchor(joint, JointBody.Target); Vector3 anchor = GetAnchor(joint, JointBody.Anchor); Vector3 center = target; Rigidbody rigidbody = joint.GetRigidbody(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.EnableLimit) { 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]); }