#pragma once #include "Types.h" #include "UTF.h" #include "Str.h" #include "Math.h" #include "Vec2.h" #include "Vec3.h" #include "Log.h" namespace ehs { template class Vec4 { public: T x; T y; T z; T w; Vec4(const T scalar = 0) : x(scalar), y(scalar), z(scalar), w(scalar) { } Vec4(const T x, const T y, const T z, const T w) : x(x), y(y), z(z), w(w) { } template Vec4(const Vec2& vec, const T z = 0, const T w = 0) : x((T)vec.x), y((T)vec.y), z(z), w(w) { } template Vec4(const Vec3& vec, const T w = 1) : x((T)vec.x), y((T)vec.y), z((T)vec.z), w(w) { } template Vec4(const Vec4& vec) : x((T)vec.x), y((T)vec.y), z((T)vec.z), w((T)vec.w) { } template Vec4& operator=(const Vec2& vec) { x = (T)vec.x; y = (T)vec.y; z = (T)0; w = (T)0; return*this; } template Vec4& operator=(const Vec3& vec) { x = (T)vec.x; y = (T)vec.y; z = (T)vec.z; w = (T)0; return*this; } template Vec4& operator=(const Vec4& vec) { x = (T)vec.x; y = (T)vec.y; z = (T)vec.z; w = (T)vec.w; return*this; } bool operator==(const Vec4& vec) { return Math::ComCmp(x, vec.x) && Math::ComCmp(y, vec.y) && Math::ComCmp(z, vec.z) && Math::ComCmp(w, vec.w); } bool operator!=(const Vec4& vec) { return !Math::ComCmp(z, vec.z) || !Math::ComCmp(y, vec.y) || !Math::ComCmp(z, vec.z) || !Math::ComCmp(w, vec.w); } Vec4& operator+=(const Vec4& vec) { x += vec.x; y += vec.y; z += vec.z; w += vec.w; return *this; } Vec4 operator+(const Vec4& vec) { Vec4 tmp; tmp.x = x + vec.x; tmp.y = y + vec.y; tmp.z = z + vec.z; tmp.w = w + vec.w; return tmp; } Vec4& operator+=(const T scalar) { x += scalar; y += scalar; z += scalar; w += scalar; return *this; } Vec4 operator+(const T scalar) { Vec4 tmp; tmp.x = x + scalar; tmp.y = y + scalar; tmp.z = z + scalar; tmp.w = w + scalar; return tmp; } Vec4& operator-=(const Vec4& vec) { x -= vec.x; y -= vec.y; z -= vec.z; w -= vec.w; return *this; } Vec4 operator-(const Vec4& vec) { Vec4 tmp; tmp.x = x - vec.x; tmp.y = y - vec.y; tmp.z = z - vec.z; tmp.w = w - vec.w; return tmp; } Vec4& operator-=(const T scalar) { x -= scalar; y -= scalar; z -= scalar; w -= scalar; return *this; } Vec4 operator-(const T scalar) { Vec4 tmp; tmp.x = x - scalar; tmp.y = y - scalar; tmp.z = z - scalar; tmp.w = w - scalar; return tmp; } Vec4& operator*=(const Vec4& vec) { x *= vec.x; y *= vec.y; z *= vec.z; w *= vec.w; return *this; } Vec4 operator*(const Vec4& vec) { Vec4 tmp; tmp.x = x * vec.x; tmp.y = y * vec.y; tmp.z = z * vec.z; tmp.w = w * vec.w; return tmp; } Vec4& operator*=(const T scalar) { x *= scalar; y *= scalar; z *= scalar; w *= scalar; return *this; } Vec4 operator*(const T scalar) { Vec4 tmp; tmp.x = x * scalar; tmp.y = y * scalar; tmp.z = z * scalar; tmp.w = w * scalar; return tmp; } Vec4& operator/=(const Vec4& vec) { x /= vec.x; y /= vec.y; z /= vec.z; w /= vec.w; return *this; } Vec4 operator/(const Vec4& vec) { Vec4 tmp; tmp.x = x / vec.x; tmp.y = y / vec.y; tmp.z = z / vec.z; tmp.w = w / vec.w; return tmp; } Vec4& operator/=(const T scalar) { x /= scalar; y /= scalar; z /= scalar; w /= scalar; return *this; } Vec4 operator/(const T scalar) { Vec4 tmp; tmp.x = x / scalar; tmp.y = y / scalar; tmp.z = z / scalar; tmp.w = w / scalar; return tmp; } T operator[](const UInt_64 index) const { switch (index) { case 0: return x; case 1: return y; case 2: return z; case 3: return w; default: EHS_LOG_INT("Error", 0, "Index of, \"" + Str_8::FromNum(index) + "\" is out of range for a Vector 4."); return x; } } T& operator[](const UInt_64 index) { switch (index) { case 0: return x; case 1: return y; case 2: return z; case 3: return w; default: EHS_LOG_INT("Error", 0, "Index of, \"" + Str_8::FromNum(index) + "\" is out of range for a Vector 4."); return x; } } operator Vec3() { return Vec3(x, y, z); } operator Vec2() { return Vec2(x, y); } T GetDotProduct(const Vec4& vec) const { return x * vec.x + y * vec.y + z * vec.z + w * vec.w; } T GetMagnitude() const { return Math::Sqrt(x * x + y * y + z * z + w * w); } T GetMagnitude2() const { return x * x + y * y + z * z + w * w; } }; typedef Vec4 Vec4_u64; typedef Vec4 Vec4_s64; typedef Vec4 Vec4_64; typedef Vec4 Vec4_u32; typedef Vec4 Vec4_s32; typedef Vec4 Vec4_32; typedef Vec4 Vec4_u16; typedef Vec4 Vec4_s16; typedef Vec4 Vec4_16; typedef Vec4 Vec4_u8; typedef Vec4 Vec4_s8; typedef Vec4 Vec4_8; typedef Vec4 Vec4_f; typedef Vec4 Vec4_d; }