From 0f2c4816169b021f90d7a7cc384de1645a89bc31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sat, 22 May 2021 15:08:14 +0200 Subject: [PATCH] Fixed vector indexed access --- GlitchyEngine/src/Math/Vector2.bf | 51 ++++++++++++++++++++++++++++--- GlitchyEngine/src/Math/Vector3.bf | 39 ++++++++++++++++++----- GlitchyEngine/src/Math/Vector4.bf | 42 ++++++++++++++++++++----- 3 files changed, 114 insertions(+), 18 deletions(-) diff --git a/GlitchyEngine/src/Math/Vector2.bf b/GlitchyEngine/src/Math/Vector2.bf index 08d9b45..010aee9 100644 --- a/GlitchyEngine/src/Math/Vector2.bf +++ b/GlitchyEngine/src/Math/Vector2.bf @@ -29,6 +29,21 @@ namespace GlitchyEngine.Math } public ref float this[int index] + { + [Checked] + get mut + { + if(index < 0 || index >= Length) + Internal.ThrowIndexOutOfRange(1); + + return ref (&X)[index]; + } + + [Inline] + get mut => ref (&X)[index]; + } + + public float this[int index] { [Checked] get @@ -36,13 +51,41 @@ namespace GlitchyEngine.Math if(index < 0 || index >= Length) Internal.ThrowIndexOutOfRange(1); -#unwarn - return ref (&X)[index]; + if(index == 0) + return X; + else + return Y; } [Inline] -#unwarn - get => ref (&X)[index]; + get + { + if(index == 0) + return X; + else + return Y; + } + + [Checked] + set mut + { + if(index < 0 || index >= Length) + Internal.ThrowIndexOutOfRange(1); + + if(index == 0) + X = value; + else + Y = value; + } + + [Inline] + set mut + { + if(index == 0) + X = value; + else + Y = value; + } } /** diff --git a/GlitchyEngine/src/Math/Vector3.bf b/GlitchyEngine/src/Math/Vector3.bf index 111c0e1..500e44c 100644 --- a/GlitchyEngine/src/Math/Vector3.bf +++ b/GlitchyEngine/src/Math/Vector3.bf @@ -17,6 +17,8 @@ namespace GlitchyEngine.Math public const Vector3 Right = .(1f, 0f, 0f); public const Vector3 Up = .(0f, 1f, 0f); public const Vector3 Down = .(0f, -1f, 0f); + + public const int Length = 3; public float X, Y, Z; @@ -42,22 +44,45 @@ namespace GlitchyEngine.Math Y = y; Z = z; } - + public ref float this[int index] { [Checked] - get + get mut { - if(index < 0 || index > 2) - Internal.ThrowIndexOutOfRange(); + if(index < 0 || index >= Length) + Internal.ThrowIndexOutOfRange(1); -#unwarn return ref (&X)[index]; } [Inline] -#unwarn - get => ref (&X)[index]; + get mut => ref (&X)[index]; + } + + public float this[int index] + { + get + { + switch(index) + { + case 0: return X; + case 1: return Y; + case 2: return Z; + default: Internal.ThrowIndexOutOfRange(); + } + } + + set mut + { + switch(index) + { + case 0: X = value; + case 1: Y = value; + case 2: Z = value; + default: Internal.ThrowIndexOutOfRange(); + } + } } /** diff --git a/GlitchyEngine/src/Math/Vector4.bf b/GlitchyEngine/src/Math/Vector4.bf index 8b389f6..428e9f8 100644 --- a/GlitchyEngine/src/Math/Vector4.bf +++ b/GlitchyEngine/src/Math/Vector4.bf @@ -11,6 +11,8 @@ namespace GlitchyEngine.Math public const Vector4 UnitZ = .(0f, 0f, 1f, 0f); public const Vector4 UnitW = .(0f, 0f, 0f, 1f); public const Vector4 One = .(1f, 1f, 1f, 1f); + + public const int Length = 4; public float X, Y, Z, W; @@ -55,21 +57,47 @@ namespace GlitchyEngine.Math Z = z; W = w; } - + public ref float this[int index] { [Checked] - get + get mut { - if(index < 0 || index > 3) - Internal.ThrowIndexOutOfRange(); -#unwarn + if(index < 0 || index >= Length) + Internal.ThrowIndexOutOfRange(1); + return ref (&X)[index]; } [Inline] -#unwarn - get => ref (&X)[index]; + get mut => ref (&X)[index]; + } + + public float this[int index] + { + get + { + switch(index) + { + case 0: return X; + case 1: return Y; + case 2: return Z; + case 3: return W; + default: Internal.ThrowIndexOutOfRange(); + } + } + + set mut + { + switch(index) + { + case 0: X = value; + case 1: Y = value; + case 2: Z = value; + case 3: W = value; + default: Internal.ThrowIndexOutOfRange(); + } + } } /**