mirror of
https://github.com/g-truc/glm.git
synced 2024-11-23 09:14:34 +00:00
Fixed literals in dual quaternion implementation
This commit is contained in:
parent
161c6c474b
commit
3c7989486e
27
glm/glm.cpp
27
glm/glm.cpp
@ -28,6 +28,7 @@
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/quaternion.hpp>
|
||||
#include <glm/gtx/dual_quaternion.hpp>
|
||||
|
||||
namespace glm{
|
||||
namespace detail
|
||||
@ -514,6 +515,32 @@ template struct tmat4x4<float16, highp>;
|
||||
template struct tmat4x4<float32, highp>;
|
||||
template struct tmat4x4<float64, highp>;
|
||||
|
||||
// tquat type explicit instantiation
|
||||
template struct tquat<float16, lowp>;
|
||||
template struct tquat<float32, lowp>;
|
||||
template struct tquat<float64, lowp>;
|
||||
|
||||
template struct tquat<float16, mediump>;
|
||||
template struct tquat<float32, mediump>;
|
||||
template struct tquat<float64, mediump>;
|
||||
|
||||
template struct tquat<float16, highp>;
|
||||
template struct tquat<float32, highp>;
|
||||
template struct tquat<float64, highp>;
|
||||
|
||||
//tdualquat type explicit instantiation
|
||||
template struct tdualquat<float16, lowp>;
|
||||
template struct tdualquat<float32, lowp>;
|
||||
template struct tdualquat<float64, lowp>;
|
||||
|
||||
template struct tdualquat<float16, mediump>;
|
||||
template struct tdualquat<float32, mediump>;
|
||||
template struct tdualquat<float64, mediump>;
|
||||
|
||||
template struct tdualquat<float16, highp>;
|
||||
template struct tdualquat<float32, highp>;
|
||||
template struct tdualquat<float64, highp>;
|
||||
|
||||
}//namespace detail
|
||||
}//namespace glm
|
||||
|
||||
|
@ -70,10 +70,10 @@ namespace detail
|
||||
) :
|
||||
real(q),
|
||||
dual(
|
||||
-0.5f*( p.x*q.x + p.y*q.y + p.z*q.z),
|
||||
0.5f*( p.x*q.w + p.y*q.z - p.z*q.y),
|
||||
0.5f*(-p.x*q.z + p.y*q.w + p.z*q.x),
|
||||
0.5f*( p.x*q.y - p.y*q.x + p.z*q.w))
|
||||
T(-0.5) * ( p.x*q.x + p.y*q.y + p.z*q.z),
|
||||
T(+0.5) * ( p.x*q.w + p.y*q.z - p.z*q.y),
|
||||
T(+0.5) * (-p.x*q.z + p.y*q.w + p.z*q.x),
|
||||
T(+0.5) * ( p.x*q.y - p.y*q.x + p.z*q.w))
|
||||
{}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
@ -378,20 +378,20 @@ namespace detail
|
||||
detail::tquat<T, P> real;
|
||||
|
||||
T const trace = x[0].x + x[1].y + x[2].z;
|
||||
if(trace > detail::tdualquat<T, P>::value_type(0))
|
||||
if(trace > T(0))
|
||||
{
|
||||
T const r = sqrt(detail::tdualquat<T, P>::value_type(1) + trace);
|
||||
T const invr = detail::tdualquat<T, P>::value_type(0.5) / r;
|
||||
real.w = detail::tdualquat<T, P>::value_type(0.5) * r;
|
||||
T const r = sqrt(T(1) + trace);
|
||||
T const invr = T(0.5) / r;
|
||||
real.w = T(0.5) * r;
|
||||
real.x = (x[2].y - x[1].z) * invr;
|
||||
real.y = (x[0].z - x[2].x) * invr;
|
||||
real.z = (x[1].x - x[0].y) * invr;
|
||||
}
|
||||
else if(x[0].x > x[1].y && x[0].x > x[2].z)
|
||||
{
|
||||
T const r = sqrt(detail::tdualquat<T, P>::value_type(1) + x[0].x - x[1].y - x[2].z);
|
||||
T const invr = detail::tdualquat<T, P>::value_type(0.5) / r;
|
||||
real.x = detail::tdualquat<T, P>::value_type(0.5)*r;
|
||||
T const r = sqrt(T(1) + x[0].x - x[1].y - x[2].z);
|
||||
T const invr = T(0.5) / r;
|
||||
real.x = T(0.5)*r;
|
||||
real.y = (x[1].x + x[0].y) * invr;
|
||||
real.z = (x[0].z + x[2].x) * invr;
|
||||
real.w = (x[2].y - x[1].z) * invr;
|
||||
|
Loading…
Reference in New Issue
Block a user