38 aAngle -=
static_cast<float>( M_PI * 2.0f );
41 aAngle +=
static_cast<float>( M_PI * 2.0f );
63 wxLogTrace(
m_logTrace, wxT(
"CAMERA::CAMERA" ) );
112 switch( aRequestedView )
114 case VIEW3D_TYPE::VIEW3D_RIGHT:
121 case VIEW3D_TYPE::VIEW3D_LEFT:
127 case VIEW3D_TYPE::VIEW3D_FRONT:
132 case VIEW3D_TYPE::VIEW3D_BACK:
142 case VIEW3D_TYPE::VIEW3D_TOP:
146 case VIEW3D_TYPE::VIEW3D_BOTTOM:
151 case VIEW3D_TYPE::VIEW3D_FLIP:
266 case PROJECTION_TYPE::PERSPECTIVE:
288 case PROJECTION_TYPE::ORTHO:
297 const float orthoReductionFactor =
303 -orthoReductionFactor,
304 orthoReductionFactor,
323 for(
unsigned int x = 0; x < (
unsigned int)
m_windowSize.x + 1; ++x )
326 const float xNormalizedDeviceCoordinates = ( ( (float)x + 0.5f ) /
330 m_scr_nX[x] = 2.0f * xNormalizedDeviceCoordinates - 1.0f;
334 for(
unsigned int y = 0; y < (
unsigned int)
m_windowSize.y + 1 ; ++y )
337 const float yNormalizedDeviceCoordinates = ( ( (float)y + 0.5f ) /
341 m_scr_nY[y] = 2.0f * yNormalizedDeviceCoordinates - 1.0f;
355 glm::vec4(
SFVEC3F( 1.0, 0.0, 0.0 ), 0.0 ) ) );
358 glm::vec4(
SFVEC3F( 0.0, 1.0, 0.0 ), 0.0 ) ) );
361 glm::vec4(
SFVEC3F( 0.0, 0.0, 1.0 ), 0.0 ) ) );
398 for(
unsigned int x = 0; x < ( (
unsigned int)
m_windowSize.x + 1 ); ++x )
402 for(
unsigned int y = 0; y < ( (
unsigned int)
m_windowSize.y + 1 ); ++y )
419 case PROJECTION_TYPE::PERSPECTIVE:
420 aOutDirection = glm::normalize( aOutOrigin -
m_pos );
423 case PROJECTION_TYPE::ORTHO:
436 const SFVEC2F floorWinPos_f = glm::floor( aWindowPos );
438 const SFVEC2F relativeWinPos = aWindowPos - floorWinPos_f;
441 const SFVEC3F up_plus_right =
m_up_nY[floorWinPos_i.y] * (1.0f - relativeWinPos.y) +
442 m_up_nY[floorWinPos_i.y + 1] * relativeWinPos.y +
443 m_right_nX[floorWinPos_i.x] * (1.0f - relativeWinPos.x) +
444 m_right_nX[floorWinPos_i.x + 1] * relativeWinPos.x;
451 case PROJECTION_TYPE::PERSPECTIVE:
452 aOutDirection = glm::normalize( aOutOrigin -
m_pos );
455 case PROJECTION_TYPE::ORTHO:
466 if( ( 0 < windowPos.x ) && ( windowPos.x <
m_windowSize.x ) &&
467 ( 0 < windowPos.y ) && ( windowPos.y <
m_windowSize.y ) )
469 MakeRay( windowPos, aOutOrigin, aOutDirection );
521 glm::vec4 lookat = aViewMatrix * glm::vec4(
m_lookat_pos, 1.0f );
524 wxT(
"CAMERA::SetViewMatrix aViewMatrix[3].z =%f, old_zoom=%f, new_zoom=%f, "
544 * glm::translate( glm::mat4( 1.0f ), -
m_lookat_pos ) )[3];
600 if( ( m_zoom <= m_minZoom && aFactor > 1 ) || (
m_zoom >=
m_maxZoom && aFactor < 1 )
609 if( m_zoom <= m_minZoom && aFactor > 1 )
631 if( ( m_zoom <= m_minZoom && aFactor > 1 ) || (
m_zoom >=
m_maxZoom && aFactor < 1 )
714 wxASSERT( t >= 0.0f );
716 const float t0 = 1.0f - t;
736 return parametersChanged;
declared enumerations and flags
void normalise2PI(float &aAngle)
Define an abstract camera.
A class used to derive camera objects from.
glm::mat4 GetRotationMatrix() const
Get the rotation matrix to be applied in a transformation camera.
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
void RotateY(float aAngleInRadians)
glm::mat4 m_projectionMatrixInv
void RotateX(float aAngleInRadians)
const glm::mat4 & GetProjectionMatrix() const
void SetBoardLookAtPos(const SFVEC3F &aBoardPos)
void RotateY_T1(float aAngleInRadians)
virtual void Reset()
Reset the camera to initial state.
glm::mat4 m_projectionMatrix
CAMERA_INTERPOLATION m_interpolation_mode
wxPoint m_lastPosition
The last mouse position in the screen.
void RotateScreen(float aAngleInRadians)
Rotates the camera in screen plane.
const glm::mat4 & GetViewMatrix_Inv() const
bool Zoom_T1(float aFactor)
static const float DEFAULT_MIN_ZOOM
void updateRotationMatrix()
void MakeRay(const SFVEC2I &aWindowPos, SFVEC3F &aOutOrigin, SFVEC3F &aOutDirection) const
Make a ray based on a windows screen position.
static const float DEFAULT_MAX_ZOOM
virtual void Interpolate(float t)
It will update the matrix to interpolate between T0 and T1 values.
bool SetCurWindowSize(const wxSize &aSize)
Update the windows size of the camera.
SFVEC3F m_camera_pos_init
CAMERA(float aInitialDistance)
Initialize a camera.
const glm::mat4 & GetProjectionMatrixInv() const
float m_minZoom
Possible 3D zoom range.
float GetCameraMinDimension() const
bool ViewCommand_T1(VIEW3D_TYPE aRequestedView)
std::vector< SFVEC3F > m_right_nX
Precalc values array used to calc ray for each pixel, for X and Y axis of each new camera position.
void RotateZ(float aAngleInRadians)
virtual void SetT0_and_T1_current_T()
This will set T0 and T1 with the current values.
PROJECTION_TYPE m_projectionType
SFVEC2I m_windowSize
The window size that this camera is working.
void MakeRayAtCurrentMousePosition(SFVEC3F &aOutOrigin, SFVEC3F &aOutDirection) const
Make a ray based on the latest mouse position.
std::vector< float > m_scr_nX
Precalc values array used to calc ray for each pixel (constant for the same window size).
void RotateX_T1(float aAngleInRadians)
const glm::mat4 & GetViewMatrix() const
glm::mat4 m_viewMatrixInverse
const SFVEC3F & GetDir() const
SFVEC3F m_rotate_aux
Stores the rotation angle auxiliary.
glm::mat4 m_rotationMatrixAux
glm::mat4 m_rotationMatrix
std::vector< float > m_scr_nY
void SetViewMatrix(glm::mat4 aViewMatrix)
Set the affine matrix to be applied to a transformation camera.
void RotateZ_T1(float aAngleInRadians)
SFVEC3F m_board_lookat_pos_init
Default boardlookat position (the board center).
std::vector< SFVEC3F > m_up_nY
void SetRotationMatrix(const glm::mat4 &aRotation)
Set the rotation matrix to be applied in a transformation camera, without making any new calculations...
float m_zoom
3D zoom value – Z-distance is scaled by it
void SetCurMousePosition(const wxPoint &aPosition)
Update the current mouse position without make any new calculations on camera.
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
SFVEC3F ntr
Near Top Right.
SFVEC3F ntl
Near Top Left.
SFVEC3F fbr
Far Bottom Right.
SFVEC3F nbl
Near Bottom Left.
SFVEC3F nbr
Near Bottom Right.
SFVEC3F fbl
Far Bottom Left.
SFVEC3F ftr
Far Top Right.