Overrides - Further work on camera data

It *should* be ready to be used with the overrides system now.
This commit is contained in:
Emmanuel BENOîT 2017-11-20 08:38:22 +01:00
parent bebf54cfee
commit 1078ff67b5
2 changed files with 50 additions and 5 deletions

View file

@ -2,6 +2,8 @@
#include "camera.hh" #include "camera.hh"
#include "utilities.hh" #include "utilities.hh"
#include <glm/gtc/matrix_access.hpp>
/*= T_Camera =================================================================*/ /*= T_Camera =================================================================*/
@ -13,6 +15,28 @@ T_Camera::T_Camera( ) noexcept
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
void T_Camera::camera(
glm::vec3 const& lookAt ,
glm::vec3 const& angles ,
const float distance ) noexcept
{
lookAt_ = lookAt;
angles_ = angles;
distance_ = distance;
cvtAnglesToVectors( );
}
void T_Camera::camera(
glm::vec3 const& position ,
glm::vec3 const& target ,
glm::vec3 const& up ) noexcept
{
pos_ = position;
up_ = up;
lookAt_ = target;
cvtVectorsToAngles( );
}
void T_Camera::cvtAnglesToVectors( ) noexcept void T_Camera::cvtAnglesToVectors( ) noexcept
{ {
anglesToMatrix( &angles_.x , &rotMat_[ 0 ].x ); anglesToMatrix( &angles_.x , &rotMat_[ 0 ].x );
@ -23,7 +47,31 @@ void T_Camera::cvtAnglesToVectors( ) noexcept
void T_Camera::cvtVectorsToAngles( ) noexcept void T_Camera::cvtVectorsToAngles( ) noexcept
{ {
#warning implement the fuck dir_ = lookAt_ - pos_;
distance_ = dir_.length( );
if ( distance_ == 0 ) {
angles_ = glm::vec3( 0 );
return;
}
const glm::vec3 nDir{ - dir_ / distance_ };
const glm::vec3 side{ normalize( cross( normalize( up_ ) , nDir ) ) };
const glm::vec3 up{ normalize( cross( nDir , side ) ) };
column( rotMat_ , 0 ) = side;
column( rotMat_ , 1 ) = up;
column( rotMat_ , 2 ) = nDir;
glm::vec3 nAngles;
nAngles.x = atan2f( nDir.y , nDir.z );
const float c2{ sqrtf( side.x * side.x + side.y * side.y ) };
nAngles.y = atan2f( -side.z , c2 );
const float s1{ sinf( nAngles.x ) } , c1{ cosf( nAngles.x ) };
nAngles.z = atan2f( s1 * nDir.x - c1 * up.x ,
c1 * up.y - s1 * nDir.y );
angles_ = nAngles * 360.f / float( M_PI );
} }
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
@ -76,9 +124,6 @@ void T_Camera::handleWheel(
void T_Camera::makeUI( ) noexcept void T_Camera::makeUI( ) noexcept
{ {
using namespace ImGui; using namespace ImGui;
if ( !CollapsingHeader( "Camera" ) ) {
return;
}
const bool changed[] = { const bool changed[] = {
DragFloat3( "Target" , &lookAt_.x ) , DragFloat3( "Target" , &lookAt_.x ) ,

View file

@ -63,7 +63,7 @@ struct T_Camera
glm::vec3 const& angles , glm::vec3 const& angles ,
float distance ) noexcept; float distance ) noexcept;
void camera( glm::vec3 const& position , void camera( glm::vec3 const& position ,
glm::vec3 const& direction , glm::vec3 const& directionOrTarget ,
glm::vec3 const& up ) noexcept; glm::vec3 const& up ) noexcept;
private: private: