< Summary

Information
Class: Gravitas.Colliders.LSCircleCollider2D
Assembly: Gravitas
File(s): /home/runner/work/Gravitas/Gravitas/src/Gravitas/Colliders/2D/LSCircleCollider2D.cs
Line coverage
100%
Covered lines: 101
Uncovered lines: 0
Coverable lines: 101
Total lines: 193
Line coverage: 100%
Branch coverage
100%
Covered branches: 18
Total branches: 18
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%
.ctor(...)100%11100%
get_Shape()100%11100%
get_Radius()100%11100%
set_Radius(...)100%22100%
get_ScaledRadius()100%11100%
ContainsPoint(...)100%11100%
GetClosestPoint(...)100%44100%
GetSupportPoint(...)100%66100%
CalculateAreaForMassProperties()100%11100%
CalculatePreparedAreaForMassProperties()100%11100%
CalculateCenterOfMassMoment(...)100%22100%
GetMassPropertyRadius()100%22100%
PrepareShape(...)100%11100%
PublishShape()100%11100%
RecordShapeData(...)100%22100%

File(s)

/home/runner/work/Gravitas/Gravitas/src/Gravitas/Colliders/2D/LSCircleCollider2D.cs

#LineLine coverage
 1//=======================================================================
 2// LSCircleCollider2D.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 Chronicler;
 9using FixedMathSharp;
 10using FixedMathSharp.Geometry;
 11using System.Runtime.CompilerServices;
 12
 13namespace Gravitas.Colliders;
 14
 15/// <summary>
 16/// Pure 2D circle collider.
 17/// </summary>
 18public sealed class LSCircleCollider2D : LSCollider2D
 19{
 20    private Fixed64 _radius;
 21    private Fixed64 _scaledRadius;
 22    private Fixed64 _preparedRadius;
 23
 24    /// <summary>Creates a pure 2D circle with an authored radius.</summary>
 297725    public LSCircleCollider2D(Fixed64 radius)
 26    {
 297727        Radius = radius;
 297728    }
 29
 30    /// <summary>Creates a runtime circle from an authored shape definition.</summary>
 16831    public LSCircleCollider2D(ColliderShapeDefinition2D definition)
 32    {
 16833        definition.EnsureKind(ColliderShapeDefinition2DKind.Circle);
 16734        Material = definition.Material;
 16735        Radius = definition.Radius;
 16736    }
 37
 38    /// <inheritdoc/>
 2674839    public override ColliderType2D Shape => ColliderType2D.Circle;
 40
 41    /// <summary>Gets or sets the unscaled circle radius.</summary>
 42    public Fixed64 Radius
 43    {
 44        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 60045        get => _radius;
 46        set
 47        {
 316048            SwiftThrowHelper.ThrowIfArgument(value <= Fixed64.Zero, nameof(value), "2D circle radius must be greater tha
 316049            if (_radius == value)
 250                return;
 51
 315852            _radius = value;
 315853            MarkShapeDirty();
 315854        }
 55    }
 56
 57    /// <summary>Gets the radius after owner and compound-part scaling.</summary>
 58    public Fixed64 ScaledRadius
 59    {
 60        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 11878461        get => GetMassPropertyRadius();
 62    }
 63
 64    /// <inheritdoc/>
 65    public override bool ContainsPoint(Vector2d point) =>
 149666        FixedSegment2d.ContainsPointInCenteredCapsule(
 149667            point,
 149668            Center,
 149669            Vector2d.Forward,
 149670            Fixed64.Zero,
 149671            ScaledRadius,
 149672            Fixed64.Zero);
 73
 74    /// <inheritdoc/>
 75    public override Vector2d GetClosestPoint(Vector2d point)
 76    {
 377        if (TryGetClosestBoundaryAnchor(
 378                point,
 379                out FixedPointAnchor2d anchor)
 380            && anchor.TryGetPoint(out Vector2d closest))
 81        {
 282            return closest;
 83        }
 84
 185        throw new System.InvalidOperationException(
 186            "The closest circle surface point is outside the Fixed64 coordinate domain.");
 87    }
 88
 89    /// <inheritdoc/>
 90    public override Vector2d GetSupportPoint(Vector2d direction)
 91    {
 792        if (direction == Vector2d.Zero)
 193            direction = Vector2d.Right;
 94
 795        if (Vector2d.TryRotate(
 796                direction.Normalized,
 797                -Rotation,
 798                out Vector2d localDirection))
 99        {
 7100            FixedPointAnchor2d anchor =
 7101                FixedSegment2d.GetCenteredCapsuleSupportAnchor(
 7102                Center,
 7103                Rotation,
 7104                Vector2d.Forward,
 7105                Fixed64.Zero,
 7106                ScaledRadius,
 7107                localDirection);
 7108            if (anchor.TryGetPoint(out Vector2d support))
 5109                return support;
 110        }
 111
 2112        throw new System.InvalidOperationException(
 2113            "The circle support point is outside the Fixed64 coordinate domain.");
 114    }
 115
 116    internal override ExactMassWeight CalculateAreaForMassProperties()
 117    {
 1262118        Fixed64 radius = GetMassPropertyRadius();
 1262119        return ExactMassWeight.FromProduct(
 1262120            Fixed64.Pi,
 1262121            radius,
 1262122            radius);
 123    }
 124
 125    internal override ExactMassWeight CalculatePreparedAreaForMassProperties() =>
 418126        ExactMassWeight.FromProduct(
 418127            Fixed64.Pi,
 418128            _preparedRadius,
 418129            _preparedRadius);
 130
 131    internal override Fixed64 CalculateCenterOfMassMoment(Fixed64 mass)
 132    {
 8442133        Fixed64 radius = GetMassPropertyRadius();
 8442134        return Fixed64.TryMultiplyDivide(
 8442135            mass,
 8442136            radius,
 8442137            radius,
 8442138            Fixed64.Two,
 8442139            out Fixed64 moment)
 8442140            ? moment
 8442141            : Fixed64.MaxValue;
 142    }
 143
 144    private Fixed64 GetMassPropertyRadius()
 145    {
 128488146        if (HasCommittedShape)
 118966147            return _scaledRadius;
 148
 9522149        GetCurrentScaleFactors(
 9522150            out Vector2d ownerScale,
 9522151            out Vector2d partScale);
 9522152        Fixed64 radiusX = ColliderScalePolicy.Scale(
 9522153            _radius,
 9522154            ownerScale.X,
 9522155            partScale.X);
 9522156        Fixed64 radiusY = ColliderScalePolicy.Scale(
 9522157            _radius,
 9522158            ownerScale.Y,
 9522159            partScale.Y);
 9522160        return FixedMath.Max(radiusX, radiusY);
 161    }
 162
 163    private protected override void PrepareShape(in ColliderShapeSnapshot2D snapshot)
 164    {
 6286165        Fixed64 radiusX = ColliderScalePolicy.ScalePositive(
 6286166            _radius,
 6286167            snapshot.OwnerScale.X,
 6286168            snapshot.PartScale.X);
 6284169        Fixed64 radiusY = ColliderScalePolicy.ScalePositive(
 6284170            _radius,
 6284171            snapshot.OwnerScale.Y,
 6284172            snapshot.PartScale.Y);
 6284173        _preparedRadius = FixedMath.Max(radiusX, radiusY);
 6284174        SetPreparedBounds(FixedBoundArea.FromCenterAndScopeClippedToDomain(
 6284175            snapshot.Center,
 6284176            new Vector2d(_preparedRadius, _preparedRadius)));
 6284177    }
 178
 179    private protected override void PublishShape() =>
 6175180        _scaledRadius = _preparedRadius;
 181
 182    /// <inheritdoc/>
 183    protected override void RecordShapeData(IChronicler chronicler)
 184    {
 119185        Fixed64 radius = _radius;
 119186        RecordValues.Look(chronicler, ref radius, "Radius", Fixed64.Half);
 119187        if (chronicler.Mode == SerializationMode.Loading)
 188        {
 69189            SwiftThrowHelper.ThrowIfArgument(radius <= Fixed64.Zero, nameof(radius), "2D circle radius must be greater t
 69190            _radius = radius;
 191        }
 119192    }
 193}