< Summary

Information
Class: Gravitas.Constraints.JointLimit2D
Assembly: Gravitas
File(s): /home/runner/work/Gravitas/Gravitas/src/Gravitas/Constraints/2D/JointLimit2D.cs
Line coverage
100%
Covered lines: 34
Uncovered lines: 0
Coverable lines: 34
Total lines: 117
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Unrestricted()100%11100%
Distance(...)100%11100%
Slider(...)100%11100%
Angular(...)100%11100%
Validate()100%66100%

File(s)

/home/runner/work/Gravitas/Gravitas/src/Gravitas/Constraints/2D/JointLimit2D.cs

#LineLine coverage
 1//=======================================================================
 2// JointLimit2D.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2026-present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using FixedMathSharp;
 9
 10namespace Gravitas.Constraints;
 11
 12/// <summary>
 13/// Optional deterministic scalar limit payload for a pure 2D joint.
 14/// </summary>
 15public readonly struct JointLimit2D
 16{
 17    private JointLimit2D(
 18        JointLimitKind2D kind,
 19        Fixed64 targetDistance,
 20        Fixed64 minTranslation,
 21        Fixed64 maxTranslation,
 22        Fixed64 minAngle,
 23        Fixed64 maxAngle)
 24    {
 2825        Kind = kind;
 2826        TargetDistance = targetDistance;
 2827        MinTranslation = minTranslation;
 2828        MaxTranslation = maxTranslation;
 2829        MinAngle = minAngle;
 2830        MaxAngle = maxAngle;
 2831    }
 32
 33    /// <summary>
 34    /// Gets an unrestricted limit payload.
 35    /// </summary>
 18736    public static JointLimit2D Unrestricted => default;
 37
 38    /// <summary>
 39    /// Gets the active limit family.
 40    /// </summary>
 41    public JointLimitKind2D Kind { get; }
 42
 43    /// <summary>
 44    /// Gets the target anchor distance for distance joints.
 45    /// </summary>
 46    public Fixed64 TargetDistance { get; }
 47
 48    /// <summary>
 49    /// Gets the minimum slider translation in world units.
 50    /// </summary>
 51    public Fixed64 MinTranslation { get; }
 52
 53    /// <summary>
 54    /// Gets the maximum slider translation in world units.
 55    /// </summary>
 56    public Fixed64 MaxTranslation { get; }
 57
 58    /// <summary>
 59    /// Gets the minimum scalar relative angle in radians.
 60    /// </summary>
 61    public Fixed64 MinAngle { get; }
 62
 63    /// <summary>
 64    /// Gets the maximum scalar relative angle in radians.
 65    /// </summary>
 66    public Fixed64 MaxAngle { get; }
 67
 68    /// <summary>
 69    /// Creates a deterministic distance target.
 70    /// </summary>
 71    public static JointLimit2D Distance(Fixed64 targetDistance)
 72    {
 1273        SwiftThrowHelper.ThrowIfArgument(
 1274            targetDistance < Fixed64.Zero,
 1275            nameof(targetDistance),
 1276            "Joint target distance cannot be negative.");
 1277        return new JointLimit2D(JointLimitKind2D.Distance, targetDistance, Fixed64.Zero, Fixed64.Zero, Fixed64.Zero, Fix
 78    }
 79
 80    /// <summary>
 81    /// Creates a deterministic prismatic slider translation range.
 82    /// </summary>
 83    public static JointLimit2D Slider(Fixed64 minTranslation, Fixed64 maxTranslation)
 84    {
 885        SwiftThrowHelper.ThrowIfArgument(
 886            minTranslation > maxTranslation,
 887            nameof(minTranslation),
 888            "Slider minimum translation cannot exceed maximum translation.");
 789        return new JointLimit2D(JointLimitKind2D.Slider, Fixed64.Zero, minTranslation, maxTranslation, Fixed64.Zero, Fix
 90    }
 91
 92    /// <summary>
 93    /// Creates a deterministic scalar angular range.
 94    /// </summary>
 95    public static JointLimit2D Angular(Fixed64 minAngle, Fixed64 maxAngle)
 96    {
 997        SwiftThrowHelper.ThrowIfArgument(
 998            minAngle > maxAngle,
 999            nameof(minAngle),
 9100            "Angular minimum angle cannot exceed maximum angle.");
 9101        return new JointLimit2D(JointLimitKind2D.Angular, Fixed64.Zero, Fixed64.Zero, Fixed64.Zero, minAngle, maxAngle);
 102    }
 103
 104    internal void Validate()
 105    {
 221106        SwiftThrowHelper.ThrowIfArgument(
 221107            Kind != JointLimitKind2D.Unrestricted
 221108                && Kind != JointLimitKind2D.Distance
 221109                && Kind != JointLimitKind2D.Slider
 221110                && Kind != JointLimitKind2D.Angular,
 221111            nameof(Kind),
 221112            "Unsupported 2D joint limit kind.");
 221113        SwiftThrowHelper.ThrowIfArgument(TargetDistance < Fixed64.Zero, nameof(TargetDistance), "Joint target distance c
 221114        SwiftThrowHelper.ThrowIfArgument(MinTranslation > MaxTranslation, nameof(MinTranslation), "Slider minimum transl
 221115        SwiftThrowHelper.ThrowIfArgument(MinAngle > MaxAngle, nameof(MinAngle), "Angular minimum angle cannot exceed max
 221116    }
 117}