This lets us use the code for non-float variable types. I also got rid of the mat4-to-quat code so that users are forced to use the mat3-to-quat code and possibly discover places where their code is suboptimal.undefined
| @@ -1,8 +1,14 @@ | |||||
| // | // | ||||
| // BtPhysTest | |||||
| // BtPhysTest | |||||
| // | // | ||||
| // Copyright: (c) 2009-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // (c) 2012-2013 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
| // © 2012—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // | |||||
| // This program is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | // | ||||
| #if HAVE_CONFIG_H | #if HAVE_CONFIG_H | ||||
| @@ -558,7 +564,7 @@ void BtPhysTest::TickGame(float seconds) | |||||
| GroundMat = CenterMx * | GroundMat = CenterMx * | ||||
| mat4(quat::fromeuler_xyz(vec3(.0f, 20.f, 20.0f) * seconds)) | mat4(quat::fromeuler_xyz(vec3(.0f, 20.f, 20.0f) * seconds)) | ||||
| * GroundMat; | * GroundMat; | ||||
| PhysObj->SetTransform(GroundMat[3].xyz, quat(GroundMat)); | |||||
| PhysObj->SetTransform(GroundMat[3].xyz, quat(mat3(GroundMat))); | |||||
| } | } | ||||
| } | } | ||||
| #endif //USE_ROTATION | #endif //USE_ROTATION | ||||
| @@ -573,14 +579,14 @@ void BtPhysTest::TickGame(float seconds) | |||||
| if (i == 0) | if (i == 0) | ||||
| { | { | ||||
| GroundMat = GroundMat * mat4(quat::fromeuler_xyz(vec3(20.f, .0f, .0f) * seconds)); | GroundMat = GroundMat * mat4(quat::fromeuler_xyz(vec3(20.f, .0f, .0f) * seconds)); | ||||
| PhysObj->SetTransform(GroundMat[3].xyz, quat(GroundMat)); | |||||
| PhysObj->SetTransform(GroundMat[3].xyz, quat(mat3(GroundMat))); | |||||
| } | } | ||||
| else if (i == 1) | else if (i == 1) | ||||
| { | { | ||||
| GroundMat = | GroundMat = | ||||
| mat4::translate(vec3(-15.0f, 5.0f, lol::cos(m_loop_value) * 8.f)) * | mat4::translate(vec3(-15.0f, 5.0f, lol::cos(m_loop_value) * 8.f)) * | ||||
| mat4(quat::fromeuler_xyz(vec3(.0f, lol::cos(m_loop_value) * 20.f, .0f))); | mat4(quat::fromeuler_xyz(vec3(.0f, lol::cos(m_loop_value) * 20.f, .0f))); | ||||
| PhysObj->SetTransform(GroundMat[3].xyz, quat(GroundMat)); | |||||
| PhysObj->SetTransform(GroundMat[3].xyz, quat(mat3(GroundMat))); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,9 +1,11 @@ | |||||
| // | // | ||||
| // Orbital | |||||
| // Orbital | |||||
| // | // | ||||
| // Copyright: (c) 2009-2013 Cédric Lecacheur <jordx@free.fr> | |||||
| // (c) 2009-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // (c) 2012 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2009—2013 Cédric Lecacheur <jordx@free.fr> | |||||
| // © 2009—2013 Benjamin “Touky� Huet <huet.benjamin@gmail.com> | |||||
| // © 2012—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // | |||||
| // No licensing terms yet. All rights reserved. | |||||
| // | // | ||||
| #pragma once | #pragma once | ||||
| @@ -355,7 +357,7 @@ public: | |||||
| m_physics->AddToSimulation(new_sim); | m_physics->AddToSimulation(new_sim); | ||||
| } | } | ||||
| void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f))) | |||||
| void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation = lol::quat(lol::mat3(1.0f))) | |||||
| { | { | ||||
| if (m_is_character) | if (m_is_character) | ||||
| m_character->SetTransform(base_location, base_rotation); | m_character->SetTransform(base_location, base_rotation); | ||||
| @@ -1,12 +1,14 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // Lol Engine | |||||
| // | // | ||||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
| // (c) 2009-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
| // | |||||
| // This library is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | // | ||||
| #pragma once | #pragma once | ||||
| @@ -90,8 +92,8 @@ private: | |||||
| void CustomInitConstraintToHinge() | void CustomInitConstraintToHinge() | ||||
| { | { | ||||
| m_hinge_constraint = new btHingeConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body, | m_hinge_constraint = new btHingeConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body, | ||||
| btTransform(LOL2BT_QUAT(quat(m_a_transform)), LOL2BT_VEC3(m_a_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(m_b_transform)), LOL2BT_VEC3(m_b_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(mat3(m_a_transform))), LOL2BT_VEC3(m_a_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(mat3(m_b_transform))), LOL2BT_VEC3(m_b_transform[3].xyz * LOL2BT_UNIT)), | |||||
| m_using_ref_a); | m_using_ref_a); | ||||
| m_typed_constraint = m_hinge_constraint; | m_typed_constraint = m_hinge_constraint; | ||||
| } | } | ||||
| @@ -99,8 +101,8 @@ private: | |||||
| void CustomInitConstraintToSlider() | void CustomInitConstraintToSlider() | ||||
| { | { | ||||
| m_slider_constraint = new btSliderConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body, | m_slider_constraint = new btSliderConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body, | ||||
| btTransform(LOL2BT_QUAT(quat(m_a_transform)), LOL2BT_VEC3(m_a_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(m_b_transform)), LOL2BT_VEC3(m_b_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(mat3(m_a_transform))), LOL2BT_VEC3(m_a_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(mat3(m_b_transform))), LOL2BT_VEC3(m_b_transform[3].xyz * LOL2BT_UNIT)), | |||||
| m_using_ref_a); | m_using_ref_a); | ||||
| m_typed_constraint = m_slider_constraint; | m_typed_constraint = m_slider_constraint; | ||||
| } | } | ||||
| @@ -108,16 +110,16 @@ private: | |||||
| void CustomInitConstraintToConeTwist() | void CustomInitConstraintToConeTwist() | ||||
| { | { | ||||
| m_cone_twist_constraint = new btConeTwistConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body, | m_cone_twist_constraint = new btConeTwistConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body, | ||||
| btTransform(LOL2BT_QUAT(quat(m_a_transform)), LOL2BT_VEC3(m_a_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(m_b_transform)), LOL2BT_VEC3(m_b_transform[3].xyz * LOL2BT_UNIT))); | |||||
| btTransform(LOL2BT_QUAT(quat(mat3(m_a_transform))), LOL2BT_VEC3(m_a_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(mat3(m_b_transform))), LOL2BT_VEC3(m_b_transform[3].xyz * LOL2BT_UNIT))); | |||||
| m_typed_constraint = m_cone_twist_constraint; | m_typed_constraint = m_cone_twist_constraint; | ||||
| } | } | ||||
| void CustomInitConstraintTo6Dof() | void CustomInitConstraintTo6Dof() | ||||
| { | { | ||||
| m_6dof_constraint = new btGeneric6DofConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body, | m_6dof_constraint = new btGeneric6DofConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body, | ||||
| btTransform(LOL2BT_QUAT(quat(m_a_transform)), LOL2BT_VEC3(m_a_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(m_b_transform)), LOL2BT_VEC3(m_b_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(mat3(m_a_transform))), LOL2BT_VEC3(m_a_transform[3].xyz * LOL2BT_UNIT)), | |||||
| btTransform(LOL2BT_QUAT(quat(mat3(m_b_transform))), LOL2BT_VEC3(m_b_transform[3].xyz * LOL2BT_UNIT)), | |||||
| m_using_ref_a); | m_using_ref_a); | ||||
| m_typed_constraint = m_6dof_constraint; | m_typed_constraint = m_6dof_constraint; | ||||
| } | } | ||||
| @@ -1,13 +1,15 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // Lol Engine | |||||
| // | // | ||||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
| // (c) 2009-2013 Cédric Lecacheur <jordx@free.fr> | |||||
| // (c) 2009-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2009—2013 Cédric Lecacheur <jordx@free.fr> | |||||
| // © 2009—2013 Benjamin “Touky� Huet <huet.benjamin@gmail.com> | |||||
| // | |||||
| // This library is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | // | ||||
| #if HAVE_CONFIG_H | #if HAVE_CONFIG_H | ||||
| @@ -158,15 +160,15 @@ void EasyPhysic::SetTransform(const lol::vec3& base_location, const lol::quat& b | |||||
| void EasyPhysic::BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix) | void EasyPhysic::BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix) | ||||
| { | { | ||||
| mat4 PreviousMatrixLoc = ((m_base_lock_location)?(PreviousMatrix):(lol::mat4::translate(PreviousMatrix[3].xyz))); | mat4 PreviousMatrixLoc = ((m_base_lock_location)?(PreviousMatrix):(lol::mat4::translate(PreviousMatrix[3].xyz))); | ||||
| mat4 PreviousMatrixRot = ((m_base_lock_rotation)?(lol::mat4(lol::quat(PreviousMatrix))):(lol::mat4(1.f))); | |||||
| mat4 PreviousMatrixRot = ((m_base_lock_rotation)?(lol::mat4(lol::quat(lol::mat3(PreviousMatrix)))):(lol::mat4(1.f))); | |||||
| mat4 NewMatrixLoc = ((m_base_lock_location)?(NewMatrix):(lol::mat4::translate(NewMatrix[3].xyz))); | mat4 NewMatrixLoc = ((m_base_lock_location)?(NewMatrix):(lol::mat4::translate(NewMatrix[3].xyz))); | ||||
| mat4 NewMatrixRot = ((m_base_lock_rotation)?(lol::mat4(lol::quat(NewMatrix))):(lol::mat4(1.f))); | |||||
| mat4 NewMatrixRot = ((m_base_lock_rotation)?(lol::mat4(lol::quat(lol::mat3(NewMatrix)))):(lol::mat4(1.f))); | |||||
| if (m_ghost_object || (m_rigid_body->getCollisionFlags() & btCollisionObject::CF_KINEMATIC_OBJECT)) | if (m_ghost_object || (m_rigid_body->getCollisionFlags() & btCollisionObject::CF_KINEMATIC_OBJECT)) | ||||
| { | { | ||||
| mat4 ThisMatrixLoc = NewMatrixLoc * inverse(PreviousMatrixLoc) * lol::mat4::translate(m_local_to_world[3].xyz); | mat4 ThisMatrixLoc = NewMatrixLoc * inverse(PreviousMatrixLoc) * lol::mat4::translate(m_local_to_world[3].xyz); | ||||
| mat4 ThisMatrixRot = NewMatrixRot * inverse(PreviousMatrixRot) * lol::mat4(lol::quat(m_local_to_world)); | |||||
| SetTransform(ThisMatrixLoc[3].xyz, lol::quat(ThisMatrixRot)); | |||||
| mat4 ThisMatrixRot = NewMatrixRot * inverse(PreviousMatrixRot) * lol::mat4(lol::quat(lol::mat3(m_local_to_world))); | |||||
| SetTransform(ThisMatrixLoc[3].xyz, lol::quat(lol::mat3(ThisMatrixRot))); | |||||
| } | } | ||||
| } | } | ||||
| @@ -247,7 +249,7 @@ void EasyPhysic::InitBodyToGhost() | |||||
| m_collision_object = m_ghost_object; | m_collision_object = m_ghost_object; | ||||
| m_collision_object->setUserPointer(this); | m_collision_object->setUserPointer(this); | ||||
| SetTransform(m_local_to_world[3].xyz, lol::quat(m_local_to_world)); | |||||
| SetTransform(m_local_to_world[3].xyz, lol::quat(lol::mat3(m_local_to_world))); | |||||
| m_ghost_object->setCollisionFlags(m_ghost_object->getCollisionFlags()); | m_ghost_object->setCollisionFlags(m_ghost_object->getCollisionFlags()); | ||||
| } | } | ||||
| @@ -1,12 +1,14 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // Lol Engine | |||||
| // | // | ||||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
| // (c) 2009-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
| // | |||||
| // This library is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | // | ||||
| #pragma once | #pragma once | ||||
| @@ -46,9 +48,9 @@ public: | |||||
| virtual bool CanChangeCollisionChannel() { return (m_rigid_body == NULL); } | virtual bool CanChangeCollisionChannel() { return (m_rigid_body == NULL); } | ||||
| virtual mat4 GetTransform(); | virtual mat4 GetTransform(); | ||||
| virtual void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f))); | |||||
| virtual void SetTransform(const vec3& base_location, const quat& base_rotation = quat(mat3(1.0f))); | |||||
| protected: | protected: | ||||
| virtual void BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix); | |||||
| virtual void BaseTransformChanged(const mat4& PreviousMatrix, const mat4& NewMatrix); | |||||
| public: | public: | ||||
| virtual void SetMass(float mass); | virtual void SetMass(float mass); | ||||
| virtual float GetMass() { return m_mass; } | virtual float GetMass() { return m_mass; } | ||||
| @@ -1,12 +1,14 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // Lol Engine | |||||
| // | // | ||||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
| // 2012-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
| // | |||||
| // This library is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | // | ||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| @@ -215,7 +217,7 @@ vec3 Camera::GetRotationEuler() const | |||||
| quat Camera::GetRotation() const | quat Camera::GetRotation() const | ||||
| { | { | ||||
| return quat(inverse(m_view_matrix)); | |||||
| return quat(inverse(mat3(m_view_matrix))); | |||||
| } | } | ||||
| // Calculate the frustum height at a given distance from the camera. | // Calculate the frustum height at a given distance from the camera. | ||||
| @@ -1,11 +1,13 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // Lol Engine | |||||
| // | // | ||||
| // Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // | |||||
| // This library is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | // | ||||
| #pragma once | #pragma once | ||||
| @@ -97,8 +99,37 @@ struct quat_t : public linear_ops::base<T> | |||||
| explicit inline constexpr quat_t(T W) | explicit inline constexpr quat_t(T W) | ||||
| : w(W), x(0), y(0), z(0) {} | : w(W), x(0), y(0), z(0) {} | ||||
| explicit quat_t(mat_t<T,3,3> const &m); | |||||
| explicit quat_t(mat_t<T,4,4> const &m); | |||||
| /* Construct a unit quaternion from a pure rotation matrix */ | |||||
| explicit quat_t(mat_t<T,3,3> const &m) | |||||
| { | |||||
| T tr = m[0][0] + m[1][1] + m[2][2]; | |||||
| if (tr > T(0)) | |||||
| { | |||||
| T const p = T(0.5) * std::sqrt(T(1) + tr); | |||||
| T const q = T(0.25) / p; | |||||
| w = p; | |||||
| x = q * (m[1][2] - m[2][1]); | |||||
| y = q * (m[2][0] - m[0][2]); | |||||
| z = q * (m[0][1] - m[1][0]); | |||||
| } | |||||
| else | |||||
| { | |||||
| int i = (m[0][0] > m[1][1] && m[0][0] > m[2][2]) ? 0 | |||||
| : (m[1][1] > m[2][2]) ? 1 | |||||
| : 2; | |||||
| int j = (i + 1) % 3, k = (i + 2) % 3; | |||||
| T const p = T(0.5) * lol::sqrt(T(1) - tr + m[i][i] + m[i][i]); | |||||
| T const q = T(0.25) / p; | |||||
| w = q * (m[j][k] - m[k][j]); | |||||
| (*this)[1 + i] = p; | |||||
| (*this)[1 + j] = q * (m[i][j] + m[j][i]); | |||||
| (*this)[1 + k] = q * (m[k][i] + m[i][k]); | |||||
| } | |||||
| } | |||||
| LOL_COMMON_MEMBER_OPS(w) | LOL_COMMON_MEMBER_OPS(w) | ||||
| @@ -1,11 +1,13 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // Lol Engine | |||||
| // | // | ||||
| // Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // | |||||
| // This library is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | // | ||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| @@ -13,47 +15,6 @@ | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| static inline void mat_to_quat(quat &that, mat3 const &m) | |||||
| { | |||||
| float tr = m[0][0] + m[1][1] + m[2][2]; | |||||
| if (tr > 0) | |||||
| { | |||||
| float const p = 0.5f * std::sqrt(1.0f + tr); | |||||
| float const q = 0.25f / p; | |||||
| that.w = p; | |||||
| that.x = q * (m[1][2] - m[2][1]); | |||||
| that.y = q * (m[2][0] - m[0][2]); | |||||
| that.z = q * (m[0][1] - m[1][0]); | |||||
| } | |||||
| else | |||||
| { | |||||
| int i = (m[0][0] > m[1][1] && m[0][0] > m[2][2]) ? 0 | |||||
| : (m[1][1] > m[2][2]) ? 1 | |||||
| : 2; | |||||
| int j = (i + 1) % 3, k = (i + 2) % 3; | |||||
| float const p = 0.5f * std::sqrt(1.0f - tr + 2.f * m[i][i]); | |||||
| float const q = 0.25f / p; | |||||
| that.w = q * (m[j][k] - m[k][j]); | |||||
| that[1 + i] = p; | |||||
| that[1 + j] = q * (m[i][j] + m[j][i]); | |||||
| that[1 + k] = q * (m[k][i] + m[i][k]); | |||||
| } | |||||
| } | |||||
| template<> quat::quat_t(mat3 const &m) | |||||
| { | |||||
| mat_to_quat(*this, m); | |||||
| } | |||||
| template<> quat::quat_t(mat4 const &m) | |||||
| { | |||||
| mat_to_quat(*this, mat3(m)); | |||||
| } | |||||
| template<> quat quat::rotate(float degrees, vec3 const &v) | template<> quat quat::rotate(float degrees, vec3 const &v) | ||||
| { | { | ||||
| float half_angle = radians(degrees) * 0.5f; | float half_angle = radians(degrees) * 0.5f; | ||||
| @@ -2,7 +2,7 @@ | |||||
| // Lol Engine — Unit tests | // Lol Engine — Unit tests | ||||
| // | // | ||||
| // Copyright © 2010—2014 Sam Hocevar <sam@hocevar.net> | // Copyright © 2010—2014 Sam Hocevar <sam@hocevar.net> | ||||
| // © 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // © 2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
| // | // | ||||
| // This program is free software. It comes without any warranty, to | // This program is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -40,7 +40,7 @@ lolunit_declare_fixture(CameraTest) | |||||
| target = vec3::zero; | target = vec3::zero; | ||||
| up = vec3::axis_y; | up = vec3::axis_y; | ||||
| m_lookat = mat4::lookat(eye, target, up); | m_lookat = mat4::lookat(eye, target, up); | ||||
| q_lookat = quat(m_lookat); | |||||
| q_lookat = quat(mat3(m_lookat)); | |||||
| v_lookat = vec3::toeuler_zyx(q_lookat); | v_lookat = vec3::toeuler_zyx(q_lookat); | ||||
| fov = 90.f; | fov = 90.f; | ||||
| screen_size = 800.f; | screen_size = 800.f; | ||||