Skip to content

Commit 15b0cbf

Browse files
authored
SimpleMath changes to improve debug performance of Vector2/3 (#539)
1 parent f3f0a6d commit 15b0cbf

File tree

2 files changed

+43
-491
lines changed

2 files changed

+43
-491
lines changed

Inc/SimpleMath.h

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#endif
1616

1717
#include <cassert>
18+
#include <cmath>
1819
#include <cstddef>
1920
#include <cstring>
2021
#include <functional>
@@ -146,16 +147,16 @@ namespace DirectX
146147
operator XMVECTOR() const noexcept { return XMLoadFloat2(this); }
147148

148149
// Comparison operators
149-
bool operator == (const Vector2& V) const noexcept;
150-
bool operator != (const Vector2& V) const noexcept;
150+
bool operator == (const Vector2& V) const noexcept { return ((x == V.x) && (y == V.y)); }
151+
bool operator != (const Vector2& V) const noexcept { return ((x != V.x) || (y != V.y)); }
151152

152153
// Assignment operators
153154
Vector2& operator= (const XMVECTORF32& F) noexcept { x = F.f[0]; y = F.f[1]; return *this; }
154-
Vector2& operator+= (const Vector2& V) noexcept;
155-
Vector2& operator-= (const Vector2& V) noexcept;
156-
Vector2& operator*= (const Vector2& V) noexcept;
157-
Vector2& operator*= (float S) noexcept;
158-
Vector2& operator/= (float S) noexcept;
155+
Vector2& operator+= (const Vector2& V) noexcept { x += V.x; y += V.y; return *this; }
156+
Vector2& operator-= (const Vector2& V) noexcept { x -= V.x; y -= V.y; return *this; }
157+
Vector2& operator*= (const Vector2& V) noexcept { x *= V.x; y *= V.y; return *this; }
158+
Vector2& operator*= (float S) noexcept { x *= S; y *= S; return *this; }
159+
Vector2& operator/= (float S) noexcept { x /= S; y /= S; return *this; }
159160

160161
// Unary operators
161162
Vector2 operator+ () const noexcept { return *this; }
@@ -164,12 +165,12 @@ namespace DirectX
164165
// Vector operations
165166
bool InBounds(const Vector2& Bounds) const noexcept;
166167

167-
float Length() const noexcept;
168-
float LengthSquared() const noexcept;
168+
float Length() const noexcept { return std::sqrt((x * x) + (y * y)); }
169+
float LengthSquared() const noexcept { return (x * x) + (y * y); }
169170

170-
float Dot(const Vector2& V) const noexcept;
171-
void Cross(const Vector2& V, Vector2& result) const noexcept;
172-
Vector2 Cross(const Vector2& V) const noexcept;
171+
float Dot(const Vector2& V) const noexcept { return (x * V.x) + (y * V.y); }
172+
void Cross(const Vector2& V, Vector2& result) const noexcept { result.x = result.y = (x * V.y) - (y * V.x); }
173+
Vector2 Cross(const Vector2& V) const noexcept { float c = (x * V.y) - (y * V.x); return Vector2(c, c); }
173174

174175
void Normalize() noexcept;
175176
void Normalize(Vector2& result) const noexcept;
@@ -230,13 +231,13 @@ namespace DirectX
230231
};
231232

232233
// Binary operators
233-
DIRECTX_TOOLKIT_API Vector2 operator+ (const Vector2& V1, const Vector2& V2) noexcept;
234-
DIRECTX_TOOLKIT_API Vector2 operator- (const Vector2& V1, const Vector2& V2) noexcept;
235-
DIRECTX_TOOLKIT_API Vector2 operator* (const Vector2& V1, const Vector2& V2) noexcept;
236-
DIRECTX_TOOLKIT_API Vector2 operator* (const Vector2& V, float S) noexcept;
237-
DIRECTX_TOOLKIT_API Vector2 operator/ (const Vector2& V1, const Vector2& V2) noexcept;
238-
DIRECTX_TOOLKIT_API Vector2 operator/ (const Vector2& V, float S) noexcept;
239-
DIRECTX_TOOLKIT_API Vector2 operator* (float S, const Vector2& V) noexcept;
234+
DIRECTX_TOOLKIT_API inline Vector2 operator+ (const Vector2& V1, const Vector2& V2) noexcept { return Vector2(V1.x + V2.x, V1.y + V2.y); }
235+
DIRECTX_TOOLKIT_API inline Vector2 operator- (const Vector2& V1, const Vector2& V2) noexcept { return Vector2(V1.x - V2.x, V1.y - V2.y); }
236+
DIRECTX_TOOLKIT_API inline Vector2 operator* (const Vector2& V1, const Vector2& V2) noexcept { return Vector2(V1.x * V2.x, V1.y * V2.y); }
237+
DIRECTX_TOOLKIT_API inline Vector2 operator* (const Vector2& V, float S) noexcept { return Vector2(V.x * S, V.y * S); }
238+
DIRECTX_TOOLKIT_API inline Vector2 operator/ (const Vector2& V1, const Vector2& V2) noexcept { return Vector2(V1.x / V2.x, V1.y / V2.y); }
239+
DIRECTX_TOOLKIT_API inline Vector2 operator/ (const Vector2& V, float S) noexcept { return Vector2(V.x / S, V.y / S); }
240+
DIRECTX_TOOLKIT_API inline Vector2 operator* (float S, const Vector2& V) noexcept { return Vector2(S / V.x, S / V.y); };
240241

241242
//------------------------------------------------------------------------------
242243
// 3D vector
@@ -259,30 +260,30 @@ namespace DirectX
259260
operator XMVECTOR() const noexcept { return XMLoadFloat3(this); }
260261

261262
// Comparison operators
262-
bool operator == (const Vector3& V) const noexcept;
263-
bool operator != (const Vector3& V) const noexcept;
263+
bool operator == (const Vector3& V) const noexcept { return ((x == V.x) && (y == V.y) && (z == V.z)); }
264+
bool operator != (const Vector3& V) const noexcept { return ((x != V.x) || (y != V.y) || (z != V.z)); }
264265

265266
// Assignment operators
266267
Vector3& operator= (const XMVECTORF32& F) noexcept { x = F.f[0]; y = F.f[1]; z = F.f[2]; return *this; }
267-
Vector3& operator+= (const Vector3& V) noexcept;
268-
Vector3& operator-= (const Vector3& V) noexcept;
269-
Vector3& operator*= (const Vector3& V) noexcept;
270-
Vector3& operator*= (float S) noexcept;
271-
Vector3& operator/= (float S) noexcept;
268+
Vector3& operator+= (const Vector3& V) noexcept { x += V.x; y += V.y; z += V.z; return *this; }
269+
Vector3& operator-= (const Vector3& V) noexcept { x -= V.x; y -= V.y; z -= V.z; return *this; }
270+
Vector3& operator*= (const Vector3& V) noexcept { x *= V.x; y *= V.y; z *= V.z; return *this; }
271+
Vector3& operator*= (float S) noexcept { x *= S; y *= S; z *= S; return *this; }
272+
Vector3& operator/= (float S) noexcept { x /= S; y /= S; z /= S; return *this; }
272273

273274
// Unary operators
274275
Vector3 operator+ () const noexcept { return *this; }
275-
Vector3 operator- () const noexcept;
276+
Vector3 operator- () const noexcept { return Vector3(-x, -y, -z); }
276277

277278
// Vector operations
278279
bool InBounds(const Vector3& Bounds) const noexcept;
279280

280-
float Length() const noexcept;
281-
float LengthSquared() const noexcept;
281+
float Length() const noexcept { return std::sqrt((x * x) + (y * y) + (z * z)); }
282+
float LengthSquared() const noexcept { return (x * x) + (y * y) + (z * z); }
282283

283-
float Dot(const Vector3& V) const noexcept;
284-
void Cross(const Vector3& V, Vector3& result) const noexcept;
285-
Vector3 Cross(const Vector3& V) const noexcept;
284+
float Dot(const Vector3& V) const noexcept { return (x * V.x) + (y * V.y) + (z * V.z); }
285+
void Cross(const Vector3& V, Vector3& result) const noexcept { result.x = y * V.z - z * V.y; result.y = z * V.x - x * V.z; result.z = x * V.y - y * V.x; }
286+
Vector3 Cross(const Vector3& V) const noexcept { return Vector3(y * V.z - z * V.y, z * V.x - x * V.z, x * V.y - y * V.x); }
286287

287288
void Normalize() noexcept;
288289
void Normalize(Vector3& result) const noexcept;
@@ -350,13 +351,13 @@ namespace DirectX
350351
};
351352

352353
// Binary operators
353-
DIRECTX_TOOLKIT_API Vector3 operator+ (const Vector3& V1, const Vector3& V2) noexcept;
354-
DIRECTX_TOOLKIT_API Vector3 operator- (const Vector3& V1, const Vector3& V2) noexcept;
355-
DIRECTX_TOOLKIT_API Vector3 operator* (const Vector3& V1, const Vector3& V2) noexcept;
356-
DIRECTX_TOOLKIT_API Vector3 operator* (const Vector3& V, float S) noexcept;
357-
DIRECTX_TOOLKIT_API Vector3 operator/ (const Vector3& V1, const Vector3& V2) noexcept;
358-
DIRECTX_TOOLKIT_API Vector3 operator/ (const Vector3& V, float S) noexcept;
359-
DIRECTX_TOOLKIT_API Vector3 operator* (float S, const Vector3& V) noexcept;
354+
DIRECTX_TOOLKIT_API inline Vector3 operator+ (const Vector3& V1, const Vector3& V2) noexcept { return Vector3(V1.x + V2.x, V1.y + V2.y, V1.z + V2.z); }
355+
DIRECTX_TOOLKIT_API inline Vector3 operator- (const Vector3& V1, const Vector3& V2) noexcept { return Vector3(V1.x - V2.x, V1.y - V2.y, V1.z - V2.z); }
356+
DIRECTX_TOOLKIT_API inline Vector3 operator* (const Vector3& V1, const Vector3& V2) noexcept { return Vector3(V1.x * V2.x, V1.y * V2.y, V1.z * V2.z); }
357+
DIRECTX_TOOLKIT_API inline Vector3 operator* (const Vector3& V, float S) noexcept { return Vector3(V.x * S, V.y * S, V.z * S); }
358+
DIRECTX_TOOLKIT_API inline Vector3 operator/ (const Vector3& V1, const Vector3& V2) noexcept { return Vector3(V1.x / V2.x, V1.y / V2.y, V1.z / V2.z); }
359+
DIRECTX_TOOLKIT_API inline Vector3 operator/ (const Vector3& V, float S) noexcept { return Vector3(V.x / S, V.y / S, V.z / S); }
360+
DIRECTX_TOOLKIT_API inline Vector3 operator* (float S, const Vector3& V) noexcept { return Vector3(S / V.x, S / V.y, S / V.z); }
360361

361362
//------------------------------------------------------------------------------
362363
// 4D vector
@@ -392,7 +393,7 @@ namespace DirectX
392393

393394
// Unary operators
394395
Vector4 operator+ () const noexcept { return *this; }
395-
Vector4 operator- () const noexcept;
396+
Vector4 operator- () const noexcept { return Vector4(-x, -y, -z, -w); }
396397

397398
// Vector operations
398399
bool InBounds(const Vector4& Bounds) const noexcept;
@@ -730,7 +731,7 @@ namespace DirectX
730731

731732
// Unary operators
732733
Quaternion operator+ () const noexcept { return *this; }
733-
Quaternion operator- () const noexcept;
734+
Quaternion operator- () const noexcept { return Quaternion(-x, -y, -z, -w); }
734735

735736
// Quaternion operations
736737
float Length() const noexcept;
@@ -837,7 +838,7 @@ namespace DirectX
837838

838839
// Unary operators
839840
Color operator+ () const noexcept { return *this; }
840-
Color operator- () const noexcept;
841+
Color operator- () const noexcept { return Color(-x, -y, -z, -w); }
841842

842843
// Properties
843844
float R() const noexcept { return x; }

0 commit comments

Comments
 (0)