mirror of
https://github.com/JoeyDeVries/LearnOpenGL.git
synced 2026-01-07 17:23:22 +08:00
Updated GLM version w/ now standard radians as angles.
This commit is contained in:
@@ -1,40 +1,81 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Created : 2009-05-19
|
||||
// Updated : 2009-05-19
|
||||
// Licence : This source is under MIT License
|
||||
// File : glm/gtx/simd_mat4.hpp
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_simd_mat4
|
||||
/// @file glm/gtx/simd_mat4.inl
|
||||
/// @date 2009-05-07 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
namespace detail{
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD::size_type fmat4x4SIMD::value_size()
|
||||
{
|
||||
return sizeof(value_type);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD::size_type fmat4x4SIMD::col_size()
|
||||
GLM_FUNC_QUALIFIER length_t fmat4x4SIMD::length() const
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD::size_type fmat4x4SIMD::row_size()
|
||||
//////////////////////////////////////
|
||||
// Accesses
|
||||
|
||||
GLM_FUNC_QUALIFIER fvec4SIMD & fmat4x4SIMD::operator[]
|
||||
(
|
||||
length_t i
|
||||
)
|
||||
{
|
||||
return 4;
|
||||
assert(i < this->length());
|
||||
|
||||
return this->Data[i];
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD()
|
||||
GLM_FUNC_QUALIFIER fvec4SIMD const & fmat4x4SIMD::operator[]
|
||||
(
|
||||
length_t i
|
||||
) const
|
||||
{
|
||||
#ifndef GLM_SIMD_ENABLE_DEFAULT_INIT
|
||||
this->Data[0] = fvec4SIMD(1.0f, 0, 0, 0);
|
||||
this->Data[1] = fvec4SIMD(0, 1.0f, 0, 0);
|
||||
this->Data[2] = fvec4SIMD(0, 0, 1.0f, 0);
|
||||
this->Data[3] = fvec4SIMD(0, 0, 0, 1.0f);
|
||||
#endif
|
||||
assert(i < this->length());
|
||||
|
||||
return this->Data[i];
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
// Constructors
|
||||
|
||||
#if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT)
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD()
|
||||
{
|
||||
# ifndef GLM_FORCE_NO_CTOR_INIT
|
||||
this->Data[0] = fvec4SIMD(1, 0, 0, 0);
|
||||
this->Data[1] = fvec4SIMD(0, 1, 0, 0);
|
||||
this->Data[2] = fvec4SIMD(0, 0, 1, 0);
|
||||
this->Data[3] = fvec4SIMD(0, 0, 0, 1);
|
||||
# endif
|
||||
}
|
||||
# endif//!GLM_HAS_DEFAULTED_FUNCTIONS
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(float const & s)
|
||||
{
|
||||
this->Data[0] = fvec4SIMD(s, 0, 0, 0);
|
||||
@@ -73,7 +114,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
|
||||
(
|
||||
tmat4x4<float> const & m
|
||||
mat4 const & m
|
||||
)
|
||||
{
|
||||
this->Data[0] = fvec4SIMD(m[0]);
|
||||
@@ -84,56 +125,31 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
|
||||
(
|
||||
__m128 const in[4]
|
||||
__m128 const in[4]
|
||||
)
|
||||
{
|
||||
this->Data[0] = in[0];
|
||||
this->Data[1] = in[1];
|
||||
this->Data[2] = in[2];
|
||||
this->Data[3] = in[3];
|
||||
}
|
||||
|
||||
//////////////////////////////////////
|
||||
// Accesses
|
||||
|
||||
GLM_FUNC_QUALIFIER fvec4SIMD & fmat4x4SIMD::operator[]
|
||||
(
|
||||
fmat4x4SIMD::size_type i
|
||||
)
|
||||
{
|
||||
assert(
|
||||
//i >= fmat4x4SIMD::size_type(0) &&
|
||||
i < fmat4x4SIMD::col_size());
|
||||
|
||||
return this->Data[i];
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fvec4SIMD const & fmat4x4SIMD::operator[]
|
||||
(
|
||||
fmat4x4SIMD::size_type i
|
||||
) const
|
||||
{
|
||||
assert(
|
||||
//i >= fmat4x4SIMD::size_type(0) &&
|
||||
i < fmat4x4SIMD::col_size());
|
||||
|
||||
return this->Data[i];
|
||||
this->Data[0] = in[0];
|
||||
this->Data[1] = in[1];
|
||||
this->Data[2] = in[2];
|
||||
this->Data[3] = in[3];
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
// mat4 operators
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD& fmat4x4SIMD::operator=
|
||||
(
|
||||
fmat4x4SIMD const & m
|
||||
)
|
||||
{
|
||||
this->Data[0] = m[0];
|
||||
this->Data[1] = m[1];
|
||||
this->Data[2] = m[2];
|
||||
this->Data[3] = m[3];
|
||||
return *this;
|
||||
}
|
||||
#if !GLM_HAS_DEFAULTED_FUNCTIONS
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD& fmat4x4SIMD::operator=
|
||||
(
|
||||
fmat4x4SIMD const & m
|
||||
)
|
||||
{
|
||||
this->Data[0] = m[0];
|
||||
this->Data[1] = m[1];
|
||||
this->Data[2] = m[2];
|
||||
this->Data[3] = m[3];
|
||||
return *this;
|
||||
}
|
||||
#endif//!GLM_HAS_DEFAULTED_FUNCTIONS
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+=
|
||||
(
|
||||
@@ -144,7 +160,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+=
|
||||
this->Data[1].Data = _mm_add_ps(this->Data[1].Data, m[1].Data);
|
||||
this->Data[2].Data = _mm_add_ps(this->Data[2].Data, m[2].Data);
|
||||
this->Data[3].Data = _mm_add_ps(this->Data[3].Data, m[3].Data);
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-=
|
||||
@@ -157,7 +173,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-=
|
||||
this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, m[2].Data);
|
||||
this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, m[3].Data);
|
||||
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*=
|
||||
@@ -166,7 +182,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*=
|
||||
)
|
||||
{
|
||||
sse_mul_ps(&this->Data[0].Data, &m.Data[0].Data, &this->Data[0].Data);
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/=
|
||||
@@ -177,7 +193,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/=
|
||||
__m128 Inv[4];
|
||||
sse_inverse_ps(&m.Data[0].Data, Inv);
|
||||
sse_mul_ps(&this->Data[0].Data, Inv, &this->Data[0].Data);
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+=
|
||||
@@ -190,7 +206,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+=
|
||||
this->Data[1].Data = _mm_add_ps(this->Data[1].Data, Operand);
|
||||
this->Data[2].Data = _mm_add_ps(this->Data[2].Data, Operand);
|
||||
this->Data[3].Data = _mm_add_ps(this->Data[3].Data, Operand);
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-=
|
||||
@@ -203,7 +219,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-=
|
||||
this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, Operand);
|
||||
this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, Operand);
|
||||
this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, Operand);
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*=
|
||||
@@ -216,7 +232,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*=
|
||||
this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand);
|
||||
this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand);
|
||||
this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand);
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/=
|
||||
@@ -229,7 +245,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/=
|
||||
this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand);
|
||||
this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand);
|
||||
this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand);
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator++ ()
|
||||
@@ -238,7 +254,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator++ ()
|
||||
this->Data[1].Data = _mm_add_ps(this->Data[1].Data, one);
|
||||
this->Data[2].Data = _mm_add_ps(this->Data[2].Data, one);
|
||||
this->Data[3].Data = _mm_add_ps(this->Data[3].Data, one);
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-- ()
|
||||
@@ -247,7 +263,7 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-- ()
|
||||
this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, one);
|
||||
this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, one);
|
||||
this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, one);
|
||||
return *this;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
@@ -256,32 +272,32 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-- ()
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD operator+
|
||||
(
|
||||
const fmat4x4SIMD &m,
|
||||
float const & s
|
||||
const fmat4x4SIMD &m,
|
||||
float const & s
|
||||
)
|
||||
{
|
||||
return detail::fmat4x4SIMD
|
||||
(
|
||||
m[0] + s,
|
||||
m[1] + s,
|
||||
m[2] + s,
|
||||
m[3] + s
|
||||
);
|
||||
return detail::fmat4x4SIMD
|
||||
(
|
||||
m[0] + s,
|
||||
m[1] + s,
|
||||
m[2] + s,
|
||||
m[3] + s
|
||||
);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD operator+
|
||||
(
|
||||
float const & s,
|
||||
const fmat4x4SIMD &m
|
||||
float const & s,
|
||||
const fmat4x4SIMD &m
|
||||
)
|
||||
{
|
||||
return detail::fmat4x4SIMD
|
||||
(
|
||||
m[0] + s,
|
||||
m[1] + s,
|
||||
m[2] + s,
|
||||
m[3] + s
|
||||
);
|
||||
return detail::fmat4x4SIMD
|
||||
(
|
||||
m[0] + s,
|
||||
m[1] + s,
|
||||
m[2] + s,
|
||||
m[3] + s
|
||||
);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD operator+
|
||||
@@ -438,37 +454,44 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD operator/
|
||||
);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fvec4SIMD operator/
|
||||
(
|
||||
const fmat4x4SIMD &m,
|
||||
fvec4SIMD const & v
|
||||
)
|
||||
GLM_FUNC_QUALIFIER detail::fmat4x4SIMD inverse(detail::fmat4x4SIMD const & m)
|
||||
{
|
||||
return inverse(m) * v;
|
||||
detail::fmat4x4SIMD result;
|
||||
detail::sse_inverse_ps(&m[0].Data, &result[0].Data);
|
||||
return result;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fvec4SIMD operator/
|
||||
(
|
||||
fvec4SIMD const & v,
|
||||
const fmat4x4SIMD &m
|
||||
const fmat4x4SIMD & m,
|
||||
fvec4SIMD const & v
|
||||
)
|
||||
{
|
||||
return v * inverse(m);
|
||||
return inverse(m) * v;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fvec4SIMD operator/
|
||||
(
|
||||
fvec4SIMD const & v,
|
||||
const fmat4x4SIMD &m
|
||||
)
|
||||
{
|
||||
return v * inverse(m);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER fmat4x4SIMD operator/
|
||||
(
|
||||
const fmat4x4SIMD &m1,
|
||||
const fmat4x4SIMD &m2
|
||||
const fmat4x4SIMD &m1,
|
||||
const fmat4x4SIMD &m2
|
||||
)
|
||||
{
|
||||
__m128 result[4];
|
||||
__m128 inv[4];
|
||||
__m128 result[4];
|
||||
__m128 inv[4];
|
||||
|
||||
sse_inverse_ps(&m2.Data[0].Data, inv);
|
||||
sse_mul_ps(&m1.Data[0].Data, inv, result);
|
||||
|
||||
return fmat4x4SIMD(result);
|
||||
return fmat4x4SIMD(result);
|
||||
}
|
||||
|
||||
|
||||
@@ -520,12 +543,12 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD const operator++
|
||||
|
||||
}//namespace detail
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<float> mat4_cast
|
||||
GLM_FUNC_QUALIFIER mat4 mat4_cast
|
||||
(
|
||||
detail::fmat4x4SIMD const & x
|
||||
)
|
||||
{
|
||||
GLM_ALIGN(16) detail::tmat4x4<float> Result;
|
||||
GLM_ALIGN(16) mat4 Result;
|
||||
_mm_store_ps(&Result[0][0], x.Data[0].Data);
|
||||
_mm_store_ps(&Result[1][0], x.Data[1].Data);
|
||||
_mm_store_ps(&Result[2][0], x.Data[2].Data);
|
||||
@@ -558,7 +581,7 @@ GLM_FUNC_QUALIFIER detail::fmat4x4SIMD outerProduct
|
||||
__m128 Shu2 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(2, 2, 2, 2));
|
||||
__m128 Shu3 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(3, 3, 3, 3));
|
||||
|
||||
detail::fmat4x4SIMD result(detail::fmat4x4SIMD::null);
|
||||
detail::fmat4x4SIMD result(uninitialize);
|
||||
result[0].Data = _mm_mul_ps(c.Data, Shu0);
|
||||
result[1].Data = _mm_mul_ps(c.Data, Shu1);
|
||||
result[2].Data = _mm_mul_ps(c.Data, Shu2);
|
||||
@@ -580,11 +603,4 @@ GLM_FUNC_QUALIFIER float determinant(detail::fmat4x4SIMD const & m)
|
||||
return Result;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::fmat4x4SIMD inverse(detail::fmat4x4SIMD const & m)
|
||||
{
|
||||
detail::fmat4x4SIMD result;
|
||||
detail::sse_inverse_ps(&m[0].Data, &result[0].Data);
|
||||
return result;
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
|
||||
Reference in New Issue
Block a user