// Copyright (C) 2013 Rémi Bèges - Jérôme Leclercq // This file is part of the "Nazara Engine - Mathematics module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_VECTOR4_HPP #define NAZARA_VECTOR4_HPP #include #include template class NzVector4 { public: NzVector4() = default; NzVector4(T X, T Y, T Z, T W = 1.0); explicit NzVector4(T scale); NzVector4(const T vec[4]); NzVector4(const NzVector3& vec, T W = 1.0); template explicit NzVector4(const NzVector4& vec); NzVector4(const NzVector4& vec) = default; ~NzVector4() = default; T AbsDotProduct(const NzVector4& vec) const; T DotProduct(const NzVector4& vec) const; NzVector4 GetNormal(T* length = nullptr) const; NzVector4& MakeUnitX(); NzVector4& MakeUnitY(); NzVector4& MakeUnitZ(); NzVector4& MakeZero(); NzVector4& Maximize(const NzVector4& vec); NzVector4& Minimize(const NzVector4& vec); NzVector4& Normalize(T* length = nullptr); NzVector4& Set(T X, T Y, T Z, T W = 1.0); NzVector4& Set(T scale); NzVector4& Set(const T vec[4]); NzVector4& Set(const NzVector3& vec, T W = 1.0); NzVector4& Set(const NzVector4& vec); template NzVector4& Set(const NzVector4& vec); NzString ToString() const; operator T*(); operator const T*() const; T& operator[](unsigned int i); T operator[](unsigned int i) const; const NzVector4& operator+() const; NzVector4 operator-() const; NzVector4 operator+(const NzVector4& vec) const; NzVector4 operator-(const NzVector4& vec) const; NzVector4 operator*(const NzVector4& vec) const; NzVector4 operator*(T scale) const; NzVector4 operator/(const NzVector4& vec) const; NzVector4 operator/(T scale) const; NzVector4& operator+=(const NzVector4& vec); NzVector4& operator-=(const NzVector4& vec); NzVector4& operator*=(const NzVector4& vec); NzVector4& operator*=(T scale); NzVector4& operator/=(const NzVector4& vec); NzVector4& operator/=(T scale); bool operator==(const NzVector4& vec) const; bool operator!=(const NzVector4& vec) const; bool operator<(const NzVector4& vec) const; bool operator<=(const NzVector4& vec) const; bool operator>(const NzVector4& vec) const; bool operator>=(const NzVector4& vec) const; static NzVector4 UnitX(); static NzVector4 UnitY(); static NzVector4 UnitZ(); static NzVector4 Zero(); T x, y, z, w; }; template std::ostream& operator<<(std::ostream& out, const NzVector4& vec); template NzVector4 operator*(T scale, const NzVector4& vec); template NzVector4 operator/(T scale, const NzVector4& vec); typedef NzVector4 NzVector4d; typedef NzVector4 NzVector4f; typedef NzVector4 NzVector4i; #include #endif // NAZARA_VECTOR4_HPP