///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2008 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-04-19
// Updated : 2006-11-13
// Licence : This source is under MIT License
// File    : glm/gtx/matrix_major_storage.h
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
///////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef glm_gtx_matrix_major_storage
#define glm_gtx_matrix_major_storage

// Dependency:
#include "../../glm.h"

namespace glm
{
    template <typename T> detail::tmat2x2<T> rowMajor2GTX(const detail::tvec2<T>& v1, const detail::tvec2<T>& v2);
    template <typename T> detail::tmat2x2<T> rowMajor2GTX(const detail::tmat2x2<T>& m);
    template <typename T> detail::tmat3x3<T> rowMajor3GTX(const detail::tvec3<T>& v1, const detail::tvec3<T>& v2, const detail::tvec3<T>& v3);
    template <typename T> detail::tmat3x3<T> rowMajor3GTX(const detail::tmat3x3<T>& m);
    template <typename T> detail::tmat4x4<T> rowMajor4GTX(const detail::tvec4<T>& v1, const detail::tvec4<T>& v2, const detail::tvec4<T>& v3, const detail::tvec4<T>& v4);
    template <typename T> detail::tmat4x4<T> rowMajor4GTX(const detail::tmat4x4<T>& m);

    template <typename T> detail::tmat2x2<T> colMajor2GTX(const detail::tvec2<T>& v1, const detail::tvec2<T>& v2);
    template <typename T> detail::tmat2x2<T> colMajor2GTX(const detail::tmat2x2<T>& m);
    template <typename T> detail::tmat3x3<T> colMajor3GTX(const detail::tvec3<T>& v1, const detail::tvec3<T>& v2, const detail::tvec3<T>& v3);
    template <typename T> detail::tmat3x3<T> colMajor3GTX(const detail::tmat3x3<T>& m);
    template <typename T> detail::tmat4x4<T> colMajor4GTX(const detail::tvec4<T>& v1, const detail::tvec4<T>& v2, const detail::tvec4<T>& v3, const detail::tvec4<T>& v4);
    template <typename T> detail::tmat4x4<T> colMajor4GTX(const detail::tmat4x4<T>& m);

    namespace gtx
    {
		//! GLM_GTX_matrix_cross_product: Build matrices with specific matrix order, row or column
        namespace matrix_major_storage
        {
            template <typename T> inline detail::tmat2x2<T> rowMajor2(const detail::tvec2<T>& v1, const detail::tvec2<T>& v2){return rowMajor2GTX(v1, v2);}																	//!< \brief Build a row major matrix from row vectors (From GLM_GTX_matrix_major_storage extension)
            template <typename T> inline detail::tmat2x2<T> rowMajor2(const detail::tmat2x2<T>& m){return rowMajor2GTX(m);}																										//!< \brief Build a row major matrix from other matrix (From GLM_GTX_matrix_major_storage extension)
            template <typename T> inline detail::tmat3x3<T> rowMajor3(const detail::tvec3<T>& v1, const detail::tvec3<T>& v2, const detail::tvec3<T>& v3){return rowMajor3GTX(v1, v2, v3);}									//!< \brief Build a row major matrix from row vectors (From GLM_GTX_matrix_major_storage extension)
            template <typename T> inline detail::tmat3x3<T> rowMajor3(const detail::tmat3x3<T>& m){return rowMajor3GTX(m);}																										//!< \brief Build a row major matrix from other matrix (From GLM_GTX_matrix_major_storage extension)
            template <typename T> inline detail::tmat4x4<T> rowMajor4(const detail::tvec4<T>& v1, const detail::tvec4<T>& v2, const detail::tvec4<T>& v3, const detail::tvec4<T>& v4){return rowMajor4GTX(v1, v2, v3, v4);}  //!< \brief Build a row major matrix from row vectors (From GLM_GTX_matrix_major_storage extension)
            template <typename T> inline detail::tmat4x4<T> rowMajor4(const detail::tmat4x4<T>& m){return rowMajor4GTX(m);}																										//!< \brief Build a row major matrix from other matrix (From GLM_GTX_matrix_major_storage extension)

            template <typename T> inline detail::tmat2x2<T> colMajor2(const detail::tvec2<T>& v1, const detail::tvec2<T>& v2){return colMajor2GTX(v1, v2);}																	//!< \brief Build a column major matrix from column vectors (From GLM_GTX_matrix_major_storage extension)
            template <typename T> inline detail::tmat2x2<T> colMajor2(const detail::tmat2x2<T>& m){return colMajor2GTX(m);}																										//!< \brief Build a column major matrix from other matrix (From GLM_GTX_matrix_major_storage extension)
            template <typename T> inline detail::tmat3x3<T> colMajor3(const detail::tvec3<T>& v1, const detail::tvec3<T>& v2, const detail::tvec3<T>& v3){return colMajor2GTX(v1, v2, v3);}									//!< \brief Build a column major matrix from column vectors (From GLM_GTX_matrix_major_storage extension)                   
            template <typename T> inline detail::tmat3x3<T> colMajor3(const detail::tmat3x3<T>& m){return colMajor3GTX(m);}																										//!< \brief Build a column major matrix from other matrix (From GLM_GTX_matrix_major_storage extension)
            template <typename T> inline detail::tmat4x4<T> colMajor4(const detail::tvec4<T>& v1, const detail::tvec4<T>& v2, const detail::tvec4<T>& v3, const detail::tvec4<T>& v4){return colMajor2GTX(v1, v2, v3, v4);}  //!< \brief Build a column major matrix from column vectors (From GLM_GTX_matrix_major_storage extension)
            template <typename T> inline detail::tmat4x4<T> colMajor4(const detail::tmat4x4<T>& m){return colMajor4GTX(m);}																										//!< \brief Build a column major matrix from other matrix (From GLM_GTX_matrix_major_storage extension)
        }
    }
}

#define GLM_GTX_matrix_major_storage namespace gtx::matrix_major_storage

#include "matrix_major_storage.inl"

#endif//glm_gtx_matrix_major_storage
