// Copyright (C) 2012 Jérôme Leclercq // This file is part of the "Nazara Engine". // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_MATRIX4_HPP #define NAZARA_MATRIX4_HPP #include #define NAZARA_CLASS_MATRIX4 #include template class NzEulerAngles; template class NzQuaternion; template class NzVector2; template class NzVector3; template class NzVector4; template class NzMatrix4 { public: NzMatrix4(); NzMatrix4(T r11, T r12, T r13, T r14, T r21, T r22, T r23, T r24, T r31, T r32, T r33, T r34, T r41, T r42, T r43, T r44); NzMatrix4(T matrix[16]); //NzMatrix4(const NzMatrix3& matrix); template explicit NzMatrix4(const NzMatrix4& matrix); NzMatrix4(const NzMatrix4& matrix); NzMatrix4(NzMatrix4&& matrix); ~NzMatrix4(); T GetDeterminant() const; NzMatrix4 GetInverse() const; //NzMatrix3 GetRotationMatrix() const; NzVector3 GetScale() const; NzVector3 GetTranslation() const; NzMatrix4 GetTransposed() const; bool HasNegativeScale() const; bool HasScale() const; void Set(T r11, T r12, T r13, T r14, T r21, T r22, T r23, T r24, T r31, T r32, T r33, T r34, T r41, T r42, T r43, T r44); void Set(T matrix[16]); //NzMatrix4(const NzMatrix3& matrix); void Set(const NzMatrix4& matrix); void Set(NzMatrix4&& matrix); template void Set(const NzMatrix4& matrix); void SetIdentity(); void SetLookAt(const NzVector3& eye, const NzVector3& center, const NzVector3& up); void SetOrtho(T left, T top, T width, T height, T zNear = -1.0, T zFar = 1.0); void SetPerspective(T angle, T ratio, T zNear, T zFar); void SetRotation(const NzQuaternion& rotation); void SetScale(const NzVector3& scale); void SetTranslation(const NzVector3& translation); void SetZero(); NzString ToString() const; NzVector2 Transform(const NzVector2& vector, T z = 0.0, T w = 1.0) const; NzVector3 Transform(const NzVector3& vector, T w = 1.0) const; NzVector4 Transform(const NzVector4& vector) const; NzMatrix4& Transpose(); operator T*(); operator const T*() const; T& operator()(unsigned int x, unsigned int y); const T& operator()(unsigned int x, unsigned int y) const; NzMatrix4& operator=(const NzMatrix4& matrix); NzMatrix4& operator=(NzMatrix4&& matrix); NzMatrix4 operator*(const NzMatrix4& matrix) const; NzVector2 operator*(const NzVector2& vector) const; NzVector3 operator*(const NzVector3& vector) const; NzVector4 operator*(const NzVector4& vector) const; NzMatrix4 operator*(T scalar) const; NzMatrix4& operator*=(const NzMatrix4& matrix); NzMatrix4& operator*=(T scalar); static NzMatrix4 LookAt(const NzVector3& eye, const NzVector3& center, const NzVector3& up); static NzMatrix4 Ortho(T left, T top, T width, T height, T zNear = -1.0, T zFar = 1.0); static NzMatrix4 Perspective(T angle, T ratio, T zNear, T zFar); static NzMatrix4 Rotate(const NzQuaternion& rotation); static NzMatrix4 Scale(const NzVector3& scale); static NzMatrix4 Translate(const NzVector3& translation); struct SharedMatrix { T m11, m12, m13, m14; T m21, m22, m23, m24; T m31, m32, m33, m34; T m41, m42, m43, m44; unsigned short refCount = 1; NazaraMutex(mutex) }; private: void EnsureOwnership(); void ReleaseMatrix(); SharedMatrix* m_sharedMatrix; }; template std::ostream& operator<<(std::ostream& out, const NzMatrix4& matrix); typedef NzMatrix4 NzMatrix4d; typedef NzMatrix4 NzMatrix4f; #undef NAZARA_CLASS_MATRIX4 #include #endif // NAZARA_MATRIX4_HPP