| | | 1 | | //======================================================================= |
| | | 2 | | // SolverContactBuffer.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 | | |
| | | 8 | | using FixedMathSharp; |
| | | 9 | | using System.Runtime.CompilerServices; |
| | | 10 | | |
| | | 11 | | namespace Gravitas.CollisionHandling; |
| | | 12 | | |
| | | 13 | | /// <summary> |
| | | 14 | | /// A buffer for storing contact points and their associated impulses and velocities during collision resolution. |
| | | 15 | | /// </summary> |
| | | 16 | | internal struct SolverContactBuffer |
| | | 17 | | { |
| | | 18 | | private SolverContact _contact0; |
| | | 19 | | private SolverContact _contact1; |
| | | 20 | | private SolverContact _contact2; |
| | | 21 | | private SolverContact _contact3; |
| | | 22 | | private Fixed64 _normalImpulse0; |
| | | 23 | | private Fixed64 _normalImpulse1; |
| | | 24 | | private Fixed64 _normalImpulse2; |
| | | 25 | | private Fixed64 _normalImpulse3; |
| | | 26 | | private Fixed64 _tangentImpulse0; |
| | | 27 | | private Fixed64 _tangentImpulse1; |
| | | 28 | | private Fixed64 _tangentImpulse2; |
| | | 29 | | private Fixed64 _tangentImpulse3; |
| | | 30 | | private Fixed64 _secondaryTangentImpulse0; |
| | | 31 | | private Fixed64 _secondaryTangentImpulse1; |
| | | 32 | | private Fixed64 _secondaryTangentImpulse2; |
| | | 33 | | private Fixed64 _secondaryTangentImpulse3; |
| | | 34 | | private ContactNormalImpulseResult3D _normalResult0; |
| | | 35 | | private ContactNormalImpulseResult3D _normalResult1; |
| | | 36 | | private ContactNormalImpulseResult3D _normalResult2; |
| | | 37 | | private ContactNormalImpulseResult3D _normalResult3; |
| | | 38 | | |
| | | 39 | | public int Count { get; private set; } |
| | | 40 | | |
| | | 41 | | public void Add(SolverContact contact) |
| | | 42 | | { |
| | 9084 | 43 | | switch (Count) |
| | | 44 | | { |
| | | 45 | | case 0: |
| | 8844 | 46 | | _contact0 = contact; |
| | 8844 | 47 | | break; |
| | | 48 | | case 1: |
| | 82 | 49 | | _contact1 = contact; |
| | 82 | 50 | | break; |
| | | 51 | | case 2: |
| | 79 | 52 | | _contact2 = contact; |
| | 79 | 53 | | break; |
| | | 54 | | default: |
| | 79 | 55 | | _contact3 = contact; |
| | | 56 | | break; |
| | | 57 | | } |
| | | 58 | | |
| | 9084 | 59 | | Count++; |
| | 9084 | 60 | | } |
| | | 61 | | |
| | | 62 | | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
| | | 63 | | public SolverContact GetContact(int index) => |
| | 38247 | 64 | | index switch |
| | 38247 | 65 | | { |
| | 37107 | 66 | | 0 => _contact0, |
| | 392 | 67 | | 1 => _contact1, |
| | 374 | 68 | | 2 => _contact2, |
| | 374 | 69 | | _ => _contact3 |
| | 38247 | 70 | | }; |
| | | 71 | | |
| | | 72 | | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
| | | 73 | | public Fixed64 GetNormalImpulse(int index) => |
| | 18147 | 74 | | index switch |
| | 18147 | 75 | | { |
| | 17667 | 76 | | 0 => _normalImpulse0, |
| | 164 | 77 | | 1 => _normalImpulse1, |
| | 158 | 78 | | 2 => _normalImpulse2, |
| | 158 | 79 | | _ => _normalImpulse3 |
| | 18147 | 80 | | }; |
| | | 81 | | |
| | | 82 | | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
| | | 83 | | public ContactNormalImpulseResult3D GetNormalResult(int index) => |
| | 9075 | 84 | | index switch |
| | 9075 | 85 | | { |
| | 8835 | 86 | | 0 => _normalResult0, |
| | 82 | 87 | | 1 => _normalResult1, |
| | 79 | 88 | | 2 => _normalResult2, |
| | 79 | 89 | | _ => _normalResult3 |
| | 9075 | 90 | | }; |
| | | 91 | | |
| | | 92 | | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
| | | 93 | | public Fixed64 GetTangentImpulse(int index) => |
| | 9073 | 94 | | index switch |
| | 9073 | 95 | | { |
| | 8833 | 96 | | 0 => _tangentImpulse0, |
| | 82 | 97 | | 1 => _tangentImpulse1, |
| | 79 | 98 | | 2 => _tangentImpulse2, |
| | 79 | 99 | | _ => _tangentImpulse3 |
| | 9073 | 100 | | }; |
| | | 101 | | |
| | | 102 | | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
| | | 103 | | public Fixed64 GetSecondaryTangentImpulse(int index) => |
| | 9073 | 104 | | index switch |
| | 9073 | 105 | | { |
| | 8833 | 106 | | 0 => _secondaryTangentImpulse0, |
| | 82 | 107 | | 1 => _secondaryTangentImpulse1, |
| | 79 | 108 | | 2 => _secondaryTangentImpulse2, |
| | 79 | 109 | | _ => _secondaryTangentImpulse3 |
| | 9073 | 110 | | }; |
| | | 111 | | |
| | | 112 | | public void SetNormalImpulse( |
| | | 113 | | int index, |
| | | 114 | | Fixed64 impulse, |
| | | 115 | | ContactNormalImpulseResult3D normalResult) |
| | | 116 | | { |
| | | 117 | | switch (index) |
| | | 118 | | { |
| | | 119 | | case 0: |
| | 8835 | 120 | | _normalImpulse0 = impulse; |
| | 8835 | 121 | | _normalResult0 = normalResult; |
| | 8835 | 122 | | break; |
| | | 123 | | case 1: |
| | 82 | 124 | | _normalImpulse1 = impulse; |
| | 82 | 125 | | _normalResult1 = normalResult; |
| | 82 | 126 | | break; |
| | | 127 | | case 2: |
| | 79 | 128 | | _normalImpulse2 = impulse; |
| | 79 | 129 | | _normalResult2 = normalResult; |
| | 79 | 130 | | break; |
| | | 131 | | default: |
| | 79 | 132 | | _normalImpulse3 = impulse; |
| | 79 | 133 | | _normalResult3 = normalResult; |
| | | 134 | | break; |
| | | 135 | | } |
| | 79 | 136 | | } |
| | | 137 | | |
| | | 138 | | public void SetTangentImpulse(int index, Fixed64 impulse, Fixed64 secondaryImpulse) |
| | | 139 | | { |
| | | 140 | | switch (index) |
| | | 141 | | { |
| | | 142 | | case 0: |
| | 8833 | 143 | | _tangentImpulse0 = impulse; |
| | 8833 | 144 | | _secondaryTangentImpulse0 = secondaryImpulse; |
| | 8833 | 145 | | break; |
| | | 146 | | case 1: |
| | 82 | 147 | | _tangentImpulse1 = impulse; |
| | 82 | 148 | | _secondaryTangentImpulse1 = secondaryImpulse; |
| | 82 | 149 | | break; |
| | | 150 | | case 2: |
| | 79 | 151 | | _tangentImpulse2 = impulse; |
| | 79 | 152 | | _secondaryTangentImpulse2 = secondaryImpulse; |
| | 79 | 153 | | break; |
| | | 154 | | default: |
| | 79 | 155 | | _tangentImpulse3 = impulse; |
| | 79 | 156 | | _secondaryTangentImpulse3 = secondaryImpulse; |
| | | 157 | | break; |
| | | 158 | | } |
| | 79 | 159 | | } |
| | | 160 | | } |