< Summary

Information
Class: FixedMathSharp.Geometry.FixedRay
Assembly: FixedMathSharp
File(s): /home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Primitives/Rays/FixedRay.cs
Line coverage
100%
Covered lines: 168
Uncovered lines: 0
Coverable lines: 168
Total lines: 568
Line coverage: 100%
Branch coverage
100%
Covered branches: 66
Total branches: 66
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Primitives/Rays/FixedRay.cs

#LineLine coverage
 1//=======================================================================
 2// FixedRay.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2024–present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using System;
 9using System.Runtime.CompilerServices;
 10using System.Text.Json.Serialization;
 11using MemoryPack;
 12
 13namespace FixedMathSharp.Geometry;
 14
 15/// <summary>
 16/// Represents a ray with an origin and direction in three-dimensional space.
 17/// </summary>
 18/// <remarks>
 19/// Intersection methods return the ray parameter for the first forward hit. If <see cref="Direction"/> is normalized,
 20/// that parameter is also the distance from <see cref="Position"/>.
 21/// </remarks>
 22[Serializable]
 23[MemoryPackable]
 24public partial struct FixedRay : IEquatable<FixedRay>
 25{
 26    #region Fields
 27
 28    /// <summary>
 29    /// The origin of the ray.
 30    /// </summary>
 31    [JsonInclude]
 32    [MemoryPackOrder(0)]
 33    public Vector3d Position;
 34
 35    /// <summary>
 36    /// The direction of the ray.
 37    /// </summary>
 38    [JsonInclude]
 39    [MemoryPackOrder(1)]
 40    public Vector3d Direction;
 41
 42    #endregion
 43
 44    #region Constructors
 45
 46    /// <summary>
 47    /// Initializes a new ray with the specified origin and direction.
 48    /// </summary>
 49    [JsonConstructor]
 50    public FixedRay(Vector3d position, Vector3d direction)
 51    {
 10452        Position = position;
 10453        Direction = direction;
 10454    }
 55
 56    #endregion
 57
 58    #region Methods
 59
 60    /// <summary>
 61    /// Gets the point at the specified ray parameter with one final
 62    /// round-half-to-even conversion per coordinate.
 63    /// </summary>
 64    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 165    public Vector3d GetPoint(Fixed64 parameter) => new(
 166        Fixed64.MultiplyAdd(Direction.X, parameter, Position.X),
 167        Fixed64.MultiplyAdd(Direction.Y, parameter, Position.Y),
 168        Fixed64.MultiplyAdd(Direction.Z, parameter, Position.Z));
 69
 70    /// <summary>
 71    /// Attempts to get the point at the specified ray parameter with one final
 72    /// round-half-to-even conversion per coordinate.
 73    /// </summary>
 74    /// <param name="parameter">The parametric distance along the ray direction.</param>
 75    /// <param name="point">
 76    /// The point when every final coordinate is representable; otherwise,
 77    /// <see langword="default"/>.
 78    /// </param>
 79    /// <returns>
 80    /// <see langword="true"/> when every final coordinate is representable;
 81    /// otherwise, <see langword="false"/>.
 82    /// </returns>
 83    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 84    public readonly bool TryGetPoint(Fixed64 parameter, out Vector3d point)
 85    {
 786        if (!Fixed64.TryMultiplyAdd(Direction.X, parameter, Position.X, out Fixed64 x)
 787            || !Fixed64.TryMultiplyAdd(Direction.Y, parameter, Position.Y, out Fixed64 y)
 788            || !Fixed64.TryMultiplyAdd(Direction.Z, parameter, Position.Z, out Fixed64 z))
 89        {
 390            point = default;
 391            return false;
 92        }
 93
 494        point = new Vector3d(x, y, z);
 495        return true;
 96    }
 97
 98    /// <summary>
 99    /// Finds the first forward intersection with the specified plane.
 100    /// </summary>
 101    public Fixed64? Intersects(FixedPlane plane)
 102    {
 3103        Fixed64 denominator = plane.DotNormal(Direction);
 3104        if (IsNearlyZero(denominator))
 1105            return null;
 106
 2107        Fixed64 t = -plane.DotCoordinate(Position) / denominator;
 2108        return t < Fixed64.Zero ? null : t;
 109    }
 110
 111    /// <summary>
 112    /// Finds the first forward intersection with the specified bounding box.
 113    /// </summary>
 114    public Fixed64? Intersects(FixedBoundBox box)
 115    {
 15116        return IntersectsBoxLike(box.Min, box.Max);
 117    }
 118
 119    /// <summary>
 120    /// Finds the first forward intersection with the specified bounding sphere.
 121    /// </summary>
 122    public Fixed64? Intersects(FixedBoundSphere sphere) =>
 19123        WideRayIntersection.Intersects(Position, Direction, sphere, Fixed64.MaxValue);
 124
 125    /// <summary>
 126    /// Finds the first forward intersection with the specified bounding sphere
 127    /// at or before <paramref name="maxParameter"/>.
 128    /// </summary>
 129    /// <remarks>
 130    /// Offset differences, quadratic products, the discriminant, and root
 131    /// ordering are evaluated without fixed-point saturation. The returned
 132    /// parameter uses deterministic round-half-to-even conversion.
 133    /// </remarks>
 134    public Fixed64? Intersects(FixedBoundSphere sphere, Fixed64 maxParameter) =>
 5135        WideRayIntersection.Intersects(Position, Direction, sphere, maxParameter);
 136
 137    /// <summary>
 138    /// Finds the first forward intersection with the specified bounding sphere,
 139    /// expanded by <paramref name="radiusExpansion"/>, at or before
 140    /// <paramref name="maxParameter"/>.
 141    /// </summary>
 142    /// <remarks>
 143    /// The two radii are combined in wide arithmetic, so their sum may exceed
 144    /// <see cref="Fixed64.MaxValue"/> without saturation.
 145    /// </remarks>
 146    /// <exception cref="ArgumentOutOfRangeException">
 147    /// <paramref name="radiusExpansion"/> is negative.
 148    /// </exception>
 149    public Fixed64? Intersects(
 150        FixedBoundSphere sphere,
 151        Fixed64 radiusExpansion,
 152        Fixed64 maxParameter) =>
 6153        WideRayIntersection.Intersects(Position, Direction, sphere, radiusExpansion, maxParameter);
 154
 155    /// <summary>
 156    /// Gets the closed parameter interval where this ray overlaps the sphere,
 157    /// clipped to <c>[0, <paramref name="maxParameter"/>]</c>.
 158    /// </summary>
 159    /// <remarks>
 160    /// Direction need not be normalized. Exact root clipping precedes
 161    /// deterministic round-half-to-even conversion of both endpoints.
 162    /// </remarks>
 163    public bool TryGetIntersectionInterval(
 164        FixedBoundSphere sphere,
 165        Fixed64 maxParameter,
 166        out Fixed64 entry,
 167        out Fixed64 exit) =>
 16168        WideRayIntersection.TryGetInterval(
 16169            Position,
 16170            Direction,
 16171            sphere,
 16172            maxParameter,
 16173            out entry,
 16174            out exit);
 175
 176    /// <summary>
 177    /// Gets the closed parameter interval where this ray overlaps the sphere
 178    /// expanded by <paramref name="radiusExpansion"/>, clipped to
 179    /// <c>[0, <paramref name="maxParameter"/>]</c>.
 180    /// </summary>
 181    /// <exception cref="ArgumentOutOfRangeException">
 182    /// <paramref name="radiusExpansion"/> is negative.
 183    /// </exception>
 184    public bool TryGetIntersectionInterval(
 185        FixedBoundSphere sphere,
 186        Fixed64 radiusExpansion,
 187        Fixed64 maxParameter,
 188        out Fixed64 entry,
 189        out Fixed64 exit) =>
 2190        WideRayIntersection.TryGetInterval(
 2191            Position,
 2192            Direction,
 2193            sphere,
 2194            radiusExpansion,
 2195            maxParameter,
 2196            out entry,
 2197            out exit);
 198
 199    /// <summary>
 200    /// Finds the first forward intersection with the specified frustum.
 201    /// </summary>
 202    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 203    public Fixed64? Intersects(FixedBoundFrustum frustum)
 204    {
 4205        return frustum.Intersects(this);
 206    }
 207
 208    private Fixed64? IntersectsBoxLike(Vector3d min, Vector3d max)
 209    {
 15210        Fixed64 tMin = Fixed64.Zero;
 15211        Fixed64 tMax = Fixed64.MaxValue;
 212
 15213        if (!ClipAxis(Position.X, Direction.X, min.X, max.X, ref tMin, ref tMax))
 3214            return null;
 215
 12216        if (!ClipAxis(Position.Y, Direction.Y, min.Y, max.Y, ref tMin, ref tMax))
 2217            return null;
 218
 10219        if (!ClipAxis(Position.Z, Direction.Z, min.Z, max.Z, ref tMin, ref tMax))
 2220            return null;
 221
 8222        return tMin;
 223    }
 224
 225    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 226    private static bool ClipAxis(
 227        Fixed64 position,
 228        Fixed64 direction,
 229        Fixed64 min,
 230        Fixed64 max,
 231        ref Fixed64 tMin,
 232        ref Fixed64 tMax)
 233    {
 37234        if (direction == Fixed64.Zero)
 22235            return position >= min && position <= max;
 236
 15237        Fixed64 t1 = (min - position) / direction;
 15238        Fixed64 t2 = (max - position) / direction;
 239
 15240        if (t1 > t2)
 241        {
 2242            Fixed64 temp = t1;
 2243            t1 = t2;
 2244            t2 = temp;
 245        }
 246
 15247        if (t1 > tMin)
 8248            tMin = t1;
 249
 15250        if (t2 < tMax)
 12251            tMax = t2;
 252
 15253        return tMin <= tMax;
 254    }
 255
 256    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 257    internal static bool IsNearlyZero(Fixed64 value)
 258    {
 55259        return value.Abs() <= Fixed64.Epsilon;
 260    }
 261
 262    /// <summary>
 263    /// Deconstructs the ray into its origin and direction.
 264    /// </summary>
 265    public void Deconstruct(out Vector3d position, out Vector3d direction)
 266    {
 1267        position = Position;
 1268        direction = Direction;
 1269    }
 270
 271    #endregion
 272
 273    #region Operators
 274
 275    /// <summary>
 276    /// Determines whether two rays are equal.
 277    /// </summary>
 278    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 2279    public static bool operator ==(FixedRay left, FixedRay right) => left.Equals(right);
 280
 281    /// <summary>
 282    /// Determines whether two rays are not equal.
 283    /// </summary>
 284    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 1285    public static bool operator !=(FixedRay left, FixedRay right) => !left.Equals(right);
 286
 287    #endregion
 288
 289    #region Equality
 290
 291    /// <inheritdoc/>
 292    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 2293    public override bool Equals(object? obj) => obj is FixedRay other && Equals(other);
 294
 295    /// <inheritdoc/>
 296    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 297    public bool Equals(FixedRay other)
 298    {
 9299        return Position.Equals(other.Position) && Direction.Equals(other.Direction);
 300    }
 301
 302    /// <inheritdoc/>
 303    public override int GetHashCode()
 304    {
 305        unchecked
 306        {
 2307            int hash = 17;
 2308            hash = hash * 23 + Position.GetHashCode();
 2309            hash = hash * 23 + Direction.GetHashCode();
 2310            return hash;
 311        }
 312    }
 313
 314    #endregion
 315
 316    /// <summary>
 317    /// Gets the closed parameter interval where this ray overlaps a capsule,
 318    /// clipped to <c>[0, <paramref name="maxParameter"/>]</c>.
 319    /// </summary>
 320    public readonly bool TryGetCapsuleIntersectionInterval(
 321        FixedSegment capsuleAxis,
 322        Fixed64 radius,
 323        Fixed64 maxParameter,
 324        out Fixed64 entryParameter,
 325        out Fixed64 exitParameter) =>
 3326        TryGetCapsuleIntersectionInterval(
 3327            capsuleAxis, radius, Fixed64.Zero, maxParameter,
 3328            out entryParameter, out exitParameter, out _, out _);
 329
 330    /// <summary>
 331    /// Gets the closed parameter interval where this ray overlaps a radially
 332    /// expanded capsule and reports exact bounded-endpoint containment.
 333    /// </summary>
 334    /// <remarks>
 335    /// Direction need not be normalized. When it is normalized, returned
 336    /// parameters are physical distances. The origin is tested inclusively;
 337    /// the point at <paramref name="maxParameter"/> is tested strictly.
 338    /// </remarks>
 339    public readonly bool TryGetCapsuleIntersectionInterval(
 340        FixedSegment capsuleAxis,
 341        Fixed64 radius,
 342        Fixed64 radiusExpansion,
 343        Fixed64 maxParameter,
 344        out Fixed64 entryParameter,
 345        out Fixed64 exitParameter,
 346        out bool originContained,
 347        out bool maximumContainedStrict)
 348    {
 9349        if (radius < Fixed64.Zero)
 1350            throw new ArgumentOutOfRangeException(nameof(radius));
 8351        if (radiusExpansion < Fixed64.Zero)
 1352            throw new ArgumentOutOfRangeException(nameof(radiusExpansion));
 7353        if (!ValidateMaximum(
 7354                maxParameter,
 7355                out entryParameter,
 7356                out exitParameter,
 7357                out originContained,
 7358                out maximumContainedStrict))
 359        {
 2360            return false;
 361        }
 362
 5363        return WideFiniteAxisIntersection.TryGetCapsuleInterval(
 5364            this, maxParameter, capsuleAxis, radius, radiusExpansion,
 5365            out entryParameter, out exitParameter,
 5366            out originContained, out maximumContainedStrict);
 367    }
 368
 369    /// <summary>
 370    /// Gets the closed parameter interval where this ray overlaps a centered
 371    /// capsule, clipped to <c>[0, <paramref name="maxParameter"/>]</c>.
 372    /// </summary>
 373    public readonly bool TryGetCapsuleIntersectionInterval(
 374        Vector3d center,
 375        Vector3d axisDirection,
 376        Fixed64 axisLength,
 377        Fixed64 radius,
 378        Fixed64 maxParameter,
 379        out Fixed64 entryParameter,
 380        out Fixed64 exitParameter) =>
 3381        TryGetCapsuleIntersectionInterval(
 3382            center, axisDirection, axisLength, radius, Fixed64.Zero, maxParameter,
 3383            out entryParameter, out exitParameter, out _, out _);
 384
 385    /// <summary>
 386    /// Gets the closed parameter interval where this ray overlaps a centered,
 387    /// radially expanded capsule and reports exact endpoint containment.
 388    /// </summary>
 389    public readonly bool TryGetCapsuleIntersectionInterval(
 390        Vector3d center,
 391        Vector3d axisDirection,
 392        Fixed64 axisLength,
 393        Fixed64 radius,
 394        Fixed64 radiusExpansion,
 395        Fixed64 maxParameter,
 396        out Fixed64 entryParameter,
 397        out Fixed64 exitParameter,
 398        out bool originContained,
 399        out bool maximumContainedStrict)
 400    {
 10401        ValidateCenteredCapsule(axisDirection, axisLength, radius, radiusExpansion);
 6402        if (!ValidateMaximum(
 6403                maxParameter,
 6404                out entryParameter,
 6405                out exitParameter,
 6406                out originContained,
 6407                out maximumContainedStrict))
 408        {
 1409            return false;
 410        }
 411
 5412        return WideFiniteAxisIntersection.TryGetCapsuleInterval(
 5413            this, maxParameter, center, axisDirection, axisLength, radius, radiusExpansion,
 5414            out entryParameter, out exitParameter,
 5415            out originContained, out maximumContainedStrict);
 416    }
 417
 418    /// <summary>
 419    /// Gets the closed parameter interval where this ray overlaps a finite
 420    /// cylinder, clipped to <c>[0, <paramref name="maxParameter"/>]</c>.
 421    /// </summary>
 422    public readonly bool TryGetFiniteCylinderIntersectionInterval(
 423        FixedSegment cylinderAxis,
 424        Fixed64 radius,
 425        Fixed64 maxParameter,
 426        out Fixed64 entryParameter,
 427        out Fixed64 exitParameter) =>
 1428        TryGetFiniteCylinderIntersectionInterval(
 1429            cylinderAxis, radius, Fixed64.Zero, maxParameter,
 1430            out entryParameter, out exitParameter, out _, out _);
 431
 432    /// <summary>
 433    /// Gets the closed parameter interval where this ray overlaps a radially
 434    /// expanded finite cylinder and reports exact endpoint containment.
 435    /// </summary>
 436    public readonly bool TryGetFiniteCylinderIntersectionInterval(
 437        FixedSegment cylinderAxis,
 438        Fixed64 radius,
 439        Fixed64 radiusExpansion,
 440        Fixed64 maxParameter,
 441        out Fixed64 entryParameter,
 442        out Fixed64 exitParameter,
 443        out bool originContained,
 444        out bool maximumContainedStrict)
 445    {
 7446        if (cylinderAxis.Start == cylinderAxis.End)
 1447            throw new ArgumentException("A finite cylinder axis must have nonzero length.", nameof(cylinderAxis));
 6448        if (radius < Fixed64.Zero)
 1449            throw new ArgumentOutOfRangeException(nameof(radius));
 5450        if (radiusExpansion < Fixed64.Zero)
 1451            throw new ArgumentOutOfRangeException(nameof(radiusExpansion));
 4452        if (!ValidateMaximum(
 4453                maxParameter,
 4454                out entryParameter,
 4455                out exitParameter,
 4456                out originContained,
 4457                out maximumContainedStrict))
 458        {
 1459            return false;
 460        }
 461
 3462        return WideFiniteAxisIntersection.TryGetFiniteCylinderInterval(
 3463            this, maxParameter, cylinderAxis, radius, radiusExpansion,
 3464            out entryParameter, out exitParameter,
 3465            out originContained, out maximumContainedStrict);
 466    }
 467
 468    /// <summary>
 469    /// Gets the closed parameter interval where this ray overlaps a centered,
 470    /// affinely expanded finite cylinder.
 471    /// </summary>
 472    public readonly bool TryGetFiniteCylinderIntersectionInterval(
 473        Vector3d center,
 474        Vector3d axisDirection,
 475        Fixed64 axisLength,
 476        Fixed64 radius,
 477        Fixed64 radiusExpansion,
 478        Fixed64 axialExpansion,
 479        Fixed64 maxParameter,
 480        out Fixed64 entryParameter,
 481        out Fixed64 exitParameter) =>
 2482        TryGetFiniteCylinderIntersectionInterval(
 2483            center, axisDirection, axisLength,
 2484            radius, radiusExpansion, axialExpansion, maxParameter,
 2485            out entryParameter, out exitParameter, out _, out _);
 486
 487    /// <summary>
 488    /// Gets the closed parameter interval where this ray overlaps a centered,
 489    /// affinely expanded finite cylinder and reports exact endpoint containment.
 490    /// </summary>
 491    public readonly bool TryGetFiniteCylinderIntersectionInterval(
 492        Vector3d center,
 493        Vector3d axisDirection,
 494        Fixed64 axisLength,
 495        Fixed64 radius,
 496        Fixed64 radiusExpansion,
 497        Fixed64 axialExpansion,
 498        Fixed64 maxParameter,
 499        out Fixed64 entryParameter,
 500        out Fixed64 exitParameter,
 501        out bool originContained,
 502        out bool maximumContainedStrict)
 503    {
 11504        if (!axisDirection.IsNormalized())
 1505            throw new ArgumentException("Finite cylinder axis direction must be normalized.", nameof(axisDirection));
 10506        if (axisLength <= Fixed64.Zero)
 1507            throw new ArgumentOutOfRangeException(nameof(axisLength));
 9508        ValidateCylinderExpansions(radius, radiusExpansion, axialExpansion);
 6509        if (!ValidateMaximum(
 6510                maxParameter,
 6511                out entryParameter,
 6512                out exitParameter,
 6513                out originContained,
 6514                out maximumContainedStrict))
 515        {
 1516            return false;
 517        }
 518
 5519        return WideFiniteAxisIntersection.TryGetFiniteCylinderInterval(
 5520            this, maxParameter, center, axisDirection, axisLength,
 5521            radius, radiusExpansion, axialExpansion,
 5522            out entryParameter, out exitParameter,
 5523            out originContained, out maximumContainedStrict);
 524    }
 525
 526    private static void ValidateCenteredCapsule(
 527        Vector3d axisDirection,
 528        Fixed64 axisLength,
 529        Fixed64 radius,
 530        Fixed64 radiusExpansion)
 531    {
 10532        if (!axisDirection.IsNormalized())
 1533            throw new ArgumentException("Capsule axis direction must be normalized.", nameof(axisDirection));
 9534        if (axisLength < Fixed64.Zero)
 1535            throw new ArgumentOutOfRangeException(nameof(axisLength));
 8536        if (radius < Fixed64.Zero)
 1537            throw new ArgumentOutOfRangeException(nameof(radius));
 7538        if (radiusExpansion < Fixed64.Zero)
 1539            throw new ArgumentOutOfRangeException(nameof(radiusExpansion));
 6540    }
 541
 542    private static void ValidateCylinderExpansions(
 543        Fixed64 radius,
 544        Fixed64 radiusExpansion,
 545        Fixed64 axialExpansion)
 546    {
 9547        if (radius < Fixed64.Zero)
 1548            throw new ArgumentOutOfRangeException(nameof(radius));
 8549        if (radiusExpansion < Fixed64.Zero)
 1550            throw new ArgumentOutOfRangeException(nameof(radiusExpansion));
 7551        if (axialExpansion < Fixed64.Zero)
 1552            throw new ArgumentOutOfRangeException(nameof(axialExpansion));
 6553    }
 554
 555    private static bool ValidateMaximum(
 556        Fixed64 maxParameter,
 557        out Fixed64 entryParameter,
 558        out Fixed64 exitParameter,
 559        out bool originContained,
 560        out bool maximumContainedStrict)
 561    {
 23562        entryParameter = default;
 23563        exitParameter = default;
 23564        originContained = false;
 23565        maximumContainedStrict = false;
 23566        return maxParameter >= Fixed64.Zero;
 567    }
 568}

Methods/Properties

.ctor(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d)
GetPoint(FixedMathSharp.Fixed64)
TryGetPoint(FixedMathSharp.Fixed64,FixedMathSharp.Vector3d&)
Intersects(FixedMathSharp.Geometry.FixedPlane)
Intersects(FixedMathSharp.Geometry.FixedBoundBox)
Intersects(FixedMathSharp.Geometry.FixedBoundSphere)
Intersects(FixedMathSharp.Geometry.FixedBoundSphere,FixedMathSharp.Fixed64)
Intersects(FixedMathSharp.Geometry.FixedBoundSphere,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
TryGetIntersectionInterval(FixedMathSharp.Geometry.FixedBoundSphere,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&)
TryGetIntersectionInterval(FixedMathSharp.Geometry.FixedBoundSphere,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&)
Intersects(FixedMathSharp.Geometry.FixedBoundFrustum)
IntersectsBoxLike(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d)
ClipAxis(FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&)
IsNearlyZero(FixedMathSharp.Fixed64)
Deconstruct(FixedMathSharp.Vector3d&,FixedMathSharp.Vector3d&)
op_Equality(FixedMathSharp.Geometry.FixedRay,FixedMathSharp.Geometry.FixedRay)
op_Inequality(FixedMathSharp.Geometry.FixedRay,FixedMathSharp.Geometry.FixedRay)
Equals(System.Object)
Equals(FixedMathSharp.Geometry.FixedRay)
GetHashCode()
TryGetCapsuleIntersectionInterval(FixedMathSharp.Geometry.FixedSegment,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&)
TryGetCapsuleIntersectionInterval(FixedMathSharp.Geometry.FixedSegment,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,System.Boolean&,System.Boolean&)
TryGetCapsuleIntersectionInterval(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&)
TryGetCapsuleIntersectionInterval(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,System.Boolean&,System.Boolean&)
TryGetFiniteCylinderIntersectionInterval(FixedMathSharp.Geometry.FixedSegment,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&)
TryGetFiniteCylinderIntersectionInterval(FixedMathSharp.Geometry.FixedSegment,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,System.Boolean&,System.Boolean&)
TryGetFiniteCylinderIntersectionInterval(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&)
TryGetFiniteCylinderIntersectionInterval(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,System.Boolean&,System.Boolean&)
ValidateCenteredCapsule(FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
ValidateCylinderExpansions(FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
ValidateMaximum(FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,System.Boolean&,System.Boolean&)