KiCad PCB EDA Suite
TRACK_BALL Class Reference

#include <track_ball.h>

Inheritance diagram for TRACK_BALL:
CAMERA

Public Member Functions

 TRACK_BALL (float aInitialDistance)
 
virtual ~TRACK_BALL ()
 
void Drag (const wxPoint &aNewMousePosition) override
 Calculate a new mouse drag position. More...
 
void Pan (const wxPoint &aNewMousePosition) override
 
void Pan (const SFVEC3F &aDeltaOffsetInc) override
 
void Pan_T1 (const SFVEC3F &aDeltaOffsetInc) override
 
void SetLookAtPos (const SFVEC3F &aLookAtPos) override
 
void Reset () override
 Reset the camera to initial state. More...
 
void Reset_T1 () override
 
void SetT0_and_T1_current_T () override
 This will set T0 and T1 with the current values. More...
 
void Interpolate (float t) override
 It will update the matrix to interpolate between T0 and T1 values. More...
 
const glm::mat4 GetRotationMatrix () const
 Get the rotation matrix to be applied in a transformation camera. More...
 
const glm::mat4 & GetViewMatrix () const
 
const glm::mat4 & GetViewMatrix_Inv () const
 
const glm::mat4 & GetProjectionMatrix () const
 
const glm::mat4 & GetProjectionMatrixInv () const
 
const SFVEC3FGetRight () const
 
const SFVEC3FGetUp () const
 
const SFVEC3FGetDir () const
 
const SFVEC3FGetPos () const
 
const SFVEC2FGetFocalLen () const
 
float GetNear () const
 
float GetFar () const
 
void SetBoardLookAtPos (const SFVEC3F &aBoardPos)
 
void SetLookAtPos_T1 (const SFVEC3F &aLookAtPos)
 
const SFVEC3FGetLookAtPos_T1 () const
 
const SFVEC3FGetCameraPos () const
 
const SFVEC3FGetCameraInitPos () const
 
float GetCameraMinDimension () const
 
void ResetXYpos ()
 
void ResetXYpos_T1 ()
 
void SetCurMousePosition (const wxPoint &aPosition)
 Update the current mouse position without make any new calculations on camera. More...
 
void ToggleProjection ()
 
PROJECTION_TYPE GetProjection ()
 
void SetProjection (PROJECTION_TYPE aProjection)
 
bool SetCurWindowSize (const wxSize &aSize)
 Update the windows size of the camera. More...
 
void ZoomReset ()
 
bool Zoom (float aFactor)
 
bool Zoom_T1 (float aFactor)
 
float GetZoom () const
 
float GetMinZoom ()
 
void SetMinZoom (float minZoom)
 
float GetMaxZoom ()
 
void SetMaxZoom (float maxZoom)
 
void RotateX (float aAngleInRadians)
 
void RotateY (float aAngleInRadians)
 
void RotateZ (float aAngleInRadians)
 
void RotateX_T1 (float aAngleInRadians)
 
void RotateY_T1 (float aAngleInRadians)
 
void RotateZ_T1 (float aAngleInRadians)
 
void SetInterpolateMode (CAMERA_INTERPOLATION aInterpolateMode)
 
bool ParametersChanged ()
 
bool ParametersChangedQuery () const
 
void MakeRay (const SFVEC2I &aWindowPos, SFVEC3F &aOutOrigin, SFVEC3F &aOutDirection) const
 Make a ray based on a windows screen position. More...
 
void MakeRay (const SFVEC2F &aWindowPos, SFVEC3F &aOutOrigin, SFVEC3F &aOutDirection) const
 Make a ray based on a windows screen position, it will interpolate based on the aWindowPos. More...
 
void MakeRayAtCurrrentMousePosition (SFVEC3F &aOutOrigin, SFVEC3F &aOutDirection) const
 Make a ray based on the latest mouse position. More...
 

Protected Member Functions

void zoomChanged ()
 
void rebuildProjection ()
 
void updateFrustum ()
 
void updateViewMatrix ()
 
void updateRotationMatrix ()
 

Protected Attributes

float m_zoom
 3D zoom value – Z-distance is scaled by it More...
 
float m_zoom_t0
 
float m_zoom_t1
 
float m_minZoom
 Possible 3D zoom range. More...
 
float m_maxZoom
 
SFVEC2I m_windowSize
 The window size that this camera is working. More...
 
wxPoint m_lastPosition
 The last mouse position in the screen. More...
 
glm::mat4 m_rotationMatrix
 
glm::mat4 m_rotationMatrixAux
 
glm::mat4 m_viewMatrix
 
glm::mat4 m_viewMatrixInverse
 
glm::mat4 m_projectionMatrix
 
glm::mat4 m_projectionMatrixInv
 
PROJECTION_TYPE m_projectionType
 
CAMERA_FRUSTUM m_frustum
 
SFVEC3F m_right
 
SFVEC3F m_up
 
SFVEC3F m_dir
 
SFVEC3F m_pos
 
SFVEC2F m_focalLen
 
SFVEC3F m_camera_pos_init
 
SFVEC3F m_camera_pos
 
SFVEC3F m_camera_pos_t0
 
SFVEC3F m_camera_pos_t1
 
SFVEC3F m_lookat_pos
 
SFVEC3F m_lookat_pos_t0
 
SFVEC3F m_lookat_pos_t1
 
SFVEC3F m_board_lookat_pos_init
 Default boardlookat position (the board center). More...
 
SFVEC3F m_rotate_aux
 Stores the rotation angle auxiliary. More...
 
SFVEC3F m_rotate_aux_t0
 
SFVEC3F m_rotate_aux_t1
 
CAMERA_INTERPOLATION m_interpolation_mode
 
std::vector< float > m_scr_nX
 Precalc values array used to calc ray for each pixel (constant for the same window size). More...
 
std::vector< float > m_scr_nY
 
std::vector< SFVEC3Fm_right_nX
 Precalc values array used to calc ray for each pixel, for X and Y axis of each new camera position. More...
 
std::vector< SFVEC3Fm_up_nY
 
bool m_parametersChanged
 Set to true if any of the parameters in the camera was changed. More...
 

Static Protected Attributes

static const wxChar * m_logTrace = wxT( "KI_TRACE_CAMERA" )
 Trace mask used to enable or disable the trace output of this class. More...
 

Private Attributes

double m_quat [4]
 quarternion of the trackball More...
 
double m_quat_t0 [4]
 
double m_quat_t1 [4]
 

Detailed Description

Definition at line 36 of file track_ball.h.

Constructor & Destructor Documentation

◆ TRACK_BALL()

TRACK_BALL::TRACK_BALL ( float  aInitialDistance)
explicit

Definition at line 37 of file track_ball.cpp.

37  :
38  CAMERA( aInitialDistance )
39 {
40  wxLogTrace( m_logTrace, wxT( "TRACK_BALL::TRACK_BALL" ) );
41 
42  memset( m_quat, 0, sizeof( m_quat ) );
43  memset( m_quat_t0, 0, sizeof( m_quat_t0 ) );
44  memset( m_quat_t1, 0, sizeof( m_quat_t1 ) );
45 
46  trackball( m_quat, 0.0, 0.0, 0.0, 0.0 );
47  trackball( m_quat_t0, 0.0, 0.0, 0.0, 0.0 );
48  trackball( m_quat_t1, 0.0, 0.0, 0.0, 0.0 );
49 }
double m_quat_t1[4]
Definition: track_ball.h:69
CAMERA(float aInitialDistance)
Initialize a camera.
Definition: camera.cpp:54
double m_quat_t0[4]
Definition: track_ball.h:68
void trackball(double q[4], double p1x, double p1y, double p2x, double p2y)
Definition: trackball.cpp:155
double m_quat[4]
quarternion of the trackball
Definition: track_ball.h:67
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
Definition: camera.h:344

References CAMERA::m_logTrace, m_quat, m_quat_t0, m_quat_t1, and trackball().

◆ ~TRACK_BALL()

virtual TRACK_BALL::~TRACK_BALL ( )
inlinevirtual

Definition at line 41 of file track_ball.h.

42  {
43  }

Member Function Documentation

◆ Drag()

void TRACK_BALL::Drag ( const wxPoint &  aNewMousePosition)
overridevirtual

Calculate a new mouse drag position.

Implements CAMERA.

Definition at line 52 of file track_ball.cpp.

53 {
54  m_parametersChanged = true;
55 
56  double spin_quat[4];
57 
58  // "Pass the x and y coordinates of the last and current positions of
59  // the mouse, scaled so they are from (-1.0 ... 1.0)."
60  const float zoom = 1.0f;
61 
62  trackball( spin_quat, zoom * ( 2.0 * m_lastPosition.x - m_windowSize.x ) / m_windowSize.x,
63  zoom * ( m_windowSize.y - 2.0 * m_lastPosition.y ) / m_windowSize.y,
64  zoom * ( 2.0 * aNewMousePosition.x - m_windowSize.x ) / m_windowSize.x,
65  zoom * ( m_windowSize.y - 2.0 * aNewMousePosition.y ) / m_windowSize.y );
66 
67  add_quats( spin_quat, m_quat, m_quat );
68 
69  float rotationMatrix[4][4];
70 
71  build_rotmatrix( rotationMatrix, m_quat );
72 
73  m_rotationMatrix = glm::make_mat4( &rotationMatrix[0][0] );
74 
76 
77  updateFrustum();
78 }
void build_rotmatrix(float m[4][4], double q[4])
Definition: trackball.cpp:306
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
Definition: camera.h:335
void trackball(double q[4], double p1x, double p1y, double p2x, double p2y)
Definition: trackball.cpp:155
double m_quat[4]
quarternion of the trackball
Definition: track_ball.h:67
wxPoint m_lastPosition
The last mouse position in the screen.
Definition: camera.h:284
void updateViewMatrix()
Definition: camera.cpp:139
glm::mat4 m_rotationMatrix
Definition: camera.h:286
SFVEC2I m_windowSize
The window size that this camera is working.
Definition: camera.h:279
void updateFrustum()
Definition: camera.cpp:265
void add_quats(double q1[4], double q2[4], double dest[4])
Definition: trackball.cpp:249

References add_quats(), build_rotmatrix(), CAMERA::m_lastPosition, CAMERA::m_parametersChanged, m_quat, CAMERA::m_rotationMatrix, CAMERA::m_windowSize, trackball(), CAMERA::updateFrustum(), CAMERA::updateViewMatrix(), and zoom.

Referenced by EDA_3D_MODEL_VIEWER::OnMouseMove().

◆ GetCameraInitPos()

const SFVEC3F& CAMERA::GetCameraInitPos ( ) const
inlineinherited

Definition at line 131 of file camera.h.

131 { return m_camera_pos_init; }
SFVEC3F m_camera_pos_init
Definition: camera.h:303

References CAMERA::m_camera_pos_init.

Referenced by RENDER_3D_RAYTRACE::Reload().

◆ GetCameraMinDimension()

float CAMERA::GetCameraMinDimension ( ) const
inherited

Definition at line 403 of file camera.cpp.

404 {
405  return -m_camera_pos_init.z * m_frustum.tang;
406 }
float tang
Definition: camera.h:59
SFVEC3F m_camera_pos_init
Definition: camera.h:303
CAMERA_FRUSTUM m_frustum
Definition: camera.h:294

References CAMERA::m_camera_pos_init, CAMERA::m_frustum, and CAMERA_FRUSTUM::tang.

◆ GetCameraPos()

const SFVEC3F& CAMERA::GetCameraPos ( ) const
inlineinherited

Definition at line 130 of file camera.h.

130 { return m_camera_pos; }
SFVEC3F m_camera_pos
Definition: camera.h:304

References CAMERA::m_camera_pos.

Referenced by EDA_3D_CANVAS::DisplayStatus().

◆ GetDir()

const SFVEC3F& CAMERA::GetDir ( ) const
inlineinherited

Definition at line 106 of file camera.h.

106 { return m_dir; }
SFVEC3F m_dir
Definition: camera.h:298

References CAMERA::m_dir.

Referenced by RENDER_3D_RAYTRACE::Redraw(), and RENDER_3D_RAYTRACE::render().

◆ GetFar()

float CAMERA::GetFar ( ) const
inlineinherited

Definition at line 110 of file camera.h.

110 { return m_frustum.farD; }
float farD
Definition: camera.h:59
CAMERA_FRUSTUM m_frustum
Definition: camera.h:294

References CAMERA_FRUSTUM::farD, and CAMERA::m_frustum.

◆ GetFocalLen()

const SFVEC2F& CAMERA::GetFocalLen ( ) const
inlineinherited

Definition at line 108 of file camera.h.

108 { return m_focalLen; }
SFVEC2F m_focalLen
Definition: camera.h:301

References CAMERA::m_focalLen.

◆ GetLookAtPos_T1()

const SFVEC3F& CAMERA::GetLookAtPos_T1 ( ) const
inlineinherited

Definition at line 128 of file camera.h.

128 { return m_lookat_pos_t1; }
SFVEC3F m_lookat_pos_t1
Definition: camera.h:310

References CAMERA::m_lookat_pos_t1.

Referenced by EDA_3D_CANVAS::render_pivot().

◆ GetMaxZoom()

float CAMERA::GetMaxZoom ( )
inlineinherited

Definition at line 186 of file camera.h.

186 { return m_maxZoom; }
float m_maxZoom
Definition: camera.h:274

References CAMERA::m_maxZoom.

Referenced by RENDER_3D_RAYTRACE::Reload().

◆ GetMinZoom()

float CAMERA::GetMinZoom ( )
inlineinherited

Definition at line 179 of file camera.h.

179 { return m_minZoom; }
float m_minZoom
Possible 3D zoom range.
Definition: camera.h:273

References CAMERA::m_minZoom.

◆ GetNear()

float CAMERA::GetNear ( ) const
inlineinherited

Definition at line 109 of file camera.h.

109 { return m_frustum.nearD; }
float nearD
Definition: camera.h:59
CAMERA_FRUSTUM m_frustum
Definition: camera.h:294

References CAMERA::m_frustum, and CAMERA_FRUSTUM::nearD.

◆ GetPos()

const SFVEC3F& CAMERA::GetPos ( ) const
inlineinherited

Definition at line 107 of file camera.h.

107 { return m_pos; }
SFVEC3F m_pos
Definition: camera.h:299

References CAMERA::m_pos.

Referenced by RENDER_3D_OPENGL::Redraw(), and RENDER_3D_OPENGL::renderSolderMaskLayer().

◆ GetProjection()

PROJECTION_TYPE CAMERA::GetProjection ( )
inlineinherited

Definition at line 161 of file camera.h.

161 { return m_projectionType; }
PROJECTION_TYPE m_projectionType
Definition: camera.h:292

References CAMERA::m_projectionType.

Referenced by EDA_3D_CANVAS::GetProjectionMode(), and EDA_3D_VIEWER_FRAME::setupUIConditions().

◆ GetProjectionMatrix()

const glm::mat4 & CAMERA::GetProjectionMatrix ( ) const
inherited

Definition at line 391 of file camera.cpp.

392 {
393  return m_projectionMatrix;
394 }
glm::mat4 m_projectionMatrix
Definition: camera.h:290

References CAMERA::m_projectionMatrix.

Referenced by EDA_3D_MODEL_VIEWER::OnPaint(), RENDER_3D_OPENGL::Redraw(), and EDA_3D_CANVAS::render_pivot().

◆ GetProjectionMatrixInv()

const glm::mat4 & CAMERA::GetProjectionMatrixInv ( ) const
inherited

Definition at line 397 of file camera.cpp.

398 {
399  return m_projectionMatrixInv;
400 }
glm::mat4 m_projectionMatrixInv
Definition: camera.h:291

References CAMERA::m_projectionMatrixInv.

◆ GetRight()

const SFVEC3F& CAMERA::GetRight ( ) const
inlineinherited

Definition at line 104 of file camera.h.

104 { return m_right; }
SFVEC3F m_right
Definition: camera.h:296

References CAMERA::m_right.

◆ GetRotationMatrix()

const glm::mat4 CAMERA::GetRotationMatrix ( ) const
inherited

Get the rotation matrix to be applied in a transformation camera.

Returns
the rotation matrix of the camera

Definition at line 168 of file camera.cpp.

169 {
171 }
glm::mat4 m_rotationMatrix
Definition: camera.h:286
glm::mat4 m_rotationMatrixAux
Definition: camera.h:287

References CAMERA::m_rotationMatrix, and CAMERA::m_rotationMatrixAux.

Referenced by EDA_3D_MODEL_VIEWER::OnPaint(), and RENDER_3D_OPENGL::render3dArrows().

◆ GetUp()

const SFVEC3F& CAMERA::GetUp ( ) const
inlineinherited

Definition at line 105 of file camera.h.

105 { return m_up; }
SFVEC3F m_up
Definition: camera.h:297

References CAMERA::m_up.

◆ GetViewMatrix()

const glm::mat4 & CAMERA::GetViewMatrix ( ) const
inherited

Definition at line 427 of file camera.cpp.

428 {
429  return m_viewMatrix;
430 }
glm::mat4 m_viewMatrix
Definition: camera.h:288

References CAMERA::m_viewMatrix.

Referenced by EDA_3D_MODEL_VIEWER::OnPaint(), RENDER_3D_OPENGL::Redraw(), and EDA_3D_CANVAS::render_pivot().

◆ GetViewMatrix_Inv()

const glm::mat4 & CAMERA::GetViewMatrix_Inv ( ) const
inherited

Definition at line 433 of file camera.cpp.

434 {
435  return m_viewMatrixInverse;
436 }
glm::mat4 m_viewMatrixInverse
Definition: camera.h:289

References CAMERA::m_viewMatrixInverse.

◆ GetZoom()

float CAMERA::GetZoom ( ) const
inlineinherited

Definition at line 177 of file camera.h.

177 { return m_zoom; }
float m_zoom
3D zoom value – Z-distance is scaled by it
Definition: camera.h:266

References CAMERA::m_zoom.

Referenced by EDA_3D_CANVAS::DoRePaint(), EDA_3D_CANVAS::OnMouseWheel(), and EDA_3D_CANVAS::SetView3D().

◆ Interpolate()

void TRACK_BALL::Interpolate ( float  t)
overridevirtual

It will update the matrix to interpolate between T0 and T1 values.

Parameters
tthe interpolation time, between 0.0f and 1.0f (it will clamp if >1).

Reimplemented from CAMERA.

Definition at line 164 of file track_ball.cpp.

165 {
166  wxASSERT( t >= 0.0f );
167 
168  // Limit t o 1.0
169  t = ( t > 1.0f ) ? 1.0f : t;
170 
171  switch( m_interpolation_mode )
172  {
174  t = BezierBlend( t );
175  break;
176 
178  t = QuadricEasingInOut( t );
179  break;
180 
182  default:
183  break;
184  }
185 
186  const float t0 = 1.0f - t;
187 
188  m_quat[0] = m_quat_t0[0] * t0 + m_quat_t1[0] * t;
189  m_quat[1] = m_quat_t0[1] * t0 + m_quat_t1[1] * t;
190  m_quat[2] = m_quat_t0[2] * t0 + m_quat_t1[2] * t;
191  m_quat[3] = m_quat_t0[3] * t0 + m_quat_t1[3] * t;
192 
193  float rotationMatrix[4][4];
194 
195  build_rotmatrix( rotationMatrix, m_quat );
196 
197  m_rotationMatrix = glm::make_mat4( &rotationMatrix[0][0] );
198 
199  CAMERA::Interpolate( t );
200 }
double m_quat_t1[4]
Definition: track_ball.h:69
void build_rotmatrix(float m[4][4], double q[4])
Definition: trackball.cpp:306
float BezierBlend(float t)
Definition: 3d_math.h:179
double m_quat_t0[4]
Definition: track_ball.h:68
float QuadricEasingInOut(float t)
Definition: 3d_math.h:163
double m_quat[4]
quarternion of the trackball
Definition: track_ball.h:67
glm::mat4 m_rotationMatrix
Definition: camera.h:286
CAMERA_INTERPOLATION m_interpolation_mode
Definition: camera.h:317
virtual void Interpolate(float t)
It will update the matrix to interpolate between T0 and T1 values.
Definition: camera.cpp:572

References BEZIER, BezierBlend(), build_rotmatrix(), EASING_IN_OUT, CAMERA::Interpolate(), LINEAR, CAMERA::m_interpolation_mode, m_quat, m_quat_t0, m_quat_t1, CAMERA::m_rotationMatrix, and QuadricEasingInOut().

◆ MakeRay() [1/2]

void CAMERA::MakeRay ( const SFVEC2I aWindowPos,
SFVEC3F aOutOrigin,
SFVEC3F aOutDirection 
) const
inherited

Make a ray based on a windows screen position.

Parameters
aWindowPosthe windows buffer position.
aOutOriginout origin position of the ray.
aOutDirectionout direction

Definition at line 323 of file camera.cpp.

325 {
326  wxASSERT( aWindowPos.x < m_windowSize.x );
327  wxASSERT( aWindowPos.y < m_windowSize.y );
328 
329  const SFVEC3F up_plus_right = m_up_nY[aWindowPos.y] + m_right_nX[aWindowPos.x];
330 
331  switch( m_projectionType )
332  {
333  default:
335  aOutOrigin = up_plus_right + m_frustum.nc;
336  aOutDirection = glm::normalize( aOutOrigin - m_pos );
337  break;
338 
340  aOutOrigin = up_plus_right * 0.5f + m_frustum.nc;
341  aOutDirection = -m_dir + SFVEC3F( FLT_EPSILON );
342  break;
343  }
344 }
SFVEC3F m_dir
Definition: camera.h:298
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.
Definition: camera.h:329
SFVEC3F m_pos
Definition: camera.h:299
PROJECTION_TYPE m_projectionType
Definition: camera.h:292
SFVEC2I m_windowSize
The window size that this camera is working.
Definition: camera.h:279
std::vector< SFVEC3F > m_up_nY
Definition: camera.h:330
CAMERA_FRUSTUM m_frustum
Definition: camera.h:294
glm::vec3 SFVEC3F
Definition: xv3d_types.h:44
SFVEC3F nc
Definition: camera.h:49

References CAMERA::m_dir, CAMERA::m_frustum, CAMERA::m_pos, CAMERA::m_projectionType, CAMERA::m_right_nX, CAMERA::m_up_nY, CAMERA::m_windowSize, CAMERA_FRUSTUM::nc, ORTHO, and PERSPECTIVE.

Referenced by CAMERA::MakeRayAtCurrrentMousePosition(), RAYPACKET::RAYPACKET(), RAYPACKET_InitRays(), and RAYPACKET_InitRays_with2DDisplacement().

◆ MakeRay() [2/2]

void CAMERA::MakeRay ( const SFVEC2F aWindowPos,
SFVEC3F aOutOrigin,
SFVEC3F aOutDirection 
) const
inherited

Make a ray based on a windows screen position, it will interpolate based on the aWindowPos.

Parameters
aWindowPosthe windows buffer position (float value).
aOutOriginout origin position of the ray.
aOutDirectionout direction.

Definition at line 347 of file camera.cpp.

349 {
350  wxASSERT( aWindowPos.x < (float)m_windowSize.x );
351  wxASSERT( aWindowPos.y < (float)m_windowSize.y );
352 
353  const SFVEC2F floorWinPos_f = glm::floor( aWindowPos );
354  const SFVEC2I floorWinPos_i = (SFVEC2I)floorWinPos_f;
355  const SFVEC2F relativeWinPos = aWindowPos - floorWinPos_f;
356 
357  // Note: size of vectors m_up and m_right are m_windowSize + 1
358  const SFVEC3F up_plus_right = m_up_nY[floorWinPos_i.y] * (1.0f - relativeWinPos.y) +
359  m_up_nY[floorWinPos_i.y + 1] * relativeWinPos.y +
360  m_right_nX[floorWinPos_i.x] * (1.0f - relativeWinPos.x) +
361  m_right_nX[floorWinPos_i.x + 1] * relativeWinPos.x;
362 
363  switch( m_projectionType )
364  {
365  default:
367  aOutOrigin = up_plus_right + m_frustum.nc;
368  aOutDirection = glm::normalize( aOutOrigin - m_pos );
369  break;
370 
372  aOutOrigin = up_plus_right * 0.5f + m_frustum.nc;
373  aOutDirection = -m_dir + SFVEC3F( FLT_EPSILON );
374  break;
375  }
376 }
SFVEC3F m_dir
Definition: camera.h:298
glm::ivec2 SFVEC2I
Definition: xv3d_types.h:39
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.
Definition: camera.h:329
SFVEC3F m_pos
Definition: camera.h:299
PROJECTION_TYPE m_projectionType
Definition: camera.h:292
glm::vec2 SFVEC2F
Definition: xv3d_types.h:42
SFVEC2I m_windowSize
The window size that this camera is working.
Definition: camera.h:279
std::vector< SFVEC3F > m_up_nY
Definition: camera.h:330
CAMERA_FRUSTUM m_frustum
Definition: camera.h:294
glm::vec3 SFVEC3F
Definition: xv3d_types.h:44
SFVEC3F nc
Definition: camera.h:49

References CAMERA::m_dir, CAMERA::m_frustum, CAMERA::m_pos, CAMERA::m_projectionType, CAMERA::m_right_nX, CAMERA::m_up_nY, CAMERA::m_windowSize, CAMERA_FRUSTUM::nc, ORTHO, and PERSPECTIVE.

◆ MakeRayAtCurrrentMousePosition()

void CAMERA::MakeRayAtCurrrentMousePosition ( SFVEC3F aOutOrigin,
SFVEC3F aOutDirection 
) const
inherited

Make a ray based on the latest mouse position.

Parameters
aOutOriginout origin position of the ray.
aOutDirectionout direction.

Definition at line 379 of file camera.cpp.

380 {
381  const SFVEC2I windowPos = SFVEC2I( m_lastPosition.x, m_windowSize.y - m_lastPosition.y );
382 
383  if( ( 0 < windowPos.x ) && ( windowPos.x < m_windowSize.x ) &&
384  ( 0 < windowPos.y ) && ( windowPos.y < m_windowSize.y ) )
385  {
386  MakeRay( windowPos, aOutOrigin, aOutDirection );
387  }
388 }
glm::ivec2 SFVEC2I
Definition: xv3d_types.h:39
wxPoint m_lastPosition
The last mouse position in the screen.
Definition: camera.h:284
void MakeRay(const SFVEC2I &aWindowPos, SFVEC3F &aOutOrigin, SFVEC3F &aOutDirection) const
Make a ray based on a windows screen position.
Definition: camera.cpp:323
SFVEC2I m_windowSize
The window size that this camera is working.
Definition: camera.h:279

References CAMERA::m_lastPosition, CAMERA::m_windowSize, and CAMERA::MakeRay().

Referenced by EDA_3D_CANVAS::getRayAtCurrrentMousePosition().

◆ Pan() [1/2]

void TRACK_BALL::Pan ( const wxPoint &  aNewMousePosition)
overridevirtual

Implements CAMERA.

Definition at line 95 of file track_ball.cpp.

96 {
97  m_parametersChanged = true;
98 
100  {
101  m_camera_pos.x -= m_frustum.nw *
102  ( m_lastPosition.x - aNewMousePosition.x ) / m_windowSize.x;
103  m_camera_pos.y -= m_frustum.nh *
104  ( aNewMousePosition.y - m_lastPosition.y ) / m_windowSize.y;
105  }
106  else // PROJECTION_TYPE::PERSPECTIVE
107  {
108  // Unproject the coordinates using the precomputed frustum tangent (zoom level dependent)
109  const float panFactor = -m_camera_pos.z * m_frustum.tang * 2;
110  m_camera_pos.x -= panFactor * m_frustum.ratio *
111  ( m_lastPosition.x - aNewMousePosition.x ) / m_windowSize.x;
112  m_camera_pos.y -= panFactor * ( aNewMousePosition.y - m_lastPosition.y ) / m_windowSize.y;
113  }
114 
116  updateFrustum();
117 }
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
Definition: camera.h:335
float ratio
Definition: camera.h:59
float nw
Definition: camera.h:60
float tang
Definition: camera.h:59
PROJECTION_TYPE m_projectionType
Definition: camera.h:292
wxPoint m_lastPosition
The last mouse position in the screen.
Definition: camera.h:284
void updateViewMatrix()
Definition: camera.cpp:139
SFVEC2I m_windowSize
The window size that this camera is working.
Definition: camera.h:279
SFVEC3F m_camera_pos
Definition: camera.h:304
void updateFrustum()
Definition: camera.cpp:265
CAMERA_FRUSTUM m_frustum
Definition: camera.h:294
float nh
Definition: camera.h:60

References CAMERA::m_camera_pos, CAMERA::m_frustum, CAMERA::m_lastPosition, CAMERA::m_parametersChanged, CAMERA::m_projectionType, CAMERA::m_windowSize, CAMERA_FRUSTUM::nh, CAMERA_FRUSTUM::nw, ORTHO, CAMERA_FRUSTUM::ratio, CAMERA_FRUSTUM::tang, CAMERA::updateFrustum(), and CAMERA::updateViewMatrix().

◆ Pan() [2/2]

void TRACK_BALL::Pan ( const SFVEC3F aDeltaOffsetInc)
overridevirtual

Implements CAMERA.

Definition at line 120 of file track_ball.cpp.

121 {
122  m_parametersChanged = true;
123 
124  m_camera_pos += aDeltaOffsetInc;
125 
127  updateFrustum();
128 }
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
Definition: camera.h:335
void updateViewMatrix()
Definition: camera.cpp:139
SFVEC3F m_camera_pos
Definition: camera.h:304
void updateFrustum()
Definition: camera.cpp:265

References CAMERA::m_camera_pos, CAMERA::m_parametersChanged, CAMERA::updateFrustum(), and CAMERA::updateViewMatrix().

◆ Pan_T1()

void TRACK_BALL::Pan_T1 ( const SFVEC3F aDeltaOffsetInc)
overridevirtual

Implements CAMERA.

Definition at line 131 of file track_ball.cpp.

132 {
133  m_camera_pos_t1 = m_camera_pos + aDeltaOffsetInc;
134 }
SFVEC3F m_camera_pos_t1
Definition: camera.h:306
SFVEC3F m_camera_pos
Definition: camera.h:304

References CAMERA::m_camera_pos, and CAMERA::m_camera_pos_t1.

◆ ParametersChanged()

bool CAMERA::ParametersChanged ( )
inherited
Returns
true if some of the parameters in camera was changed, it will reset the flag.

Definition at line 590 of file camera.cpp.

591 {
592  const bool parametersChanged = m_parametersChanged;
593 
594  m_parametersChanged = false;
595 
596  return parametersChanged;
597 }
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
Definition: camera.h:335

References CAMERA::m_parametersChanged.

Referenced by EDA_3D_CANVAS::DoRePaint(), and RENDER_3D_RAYTRACE::Redraw().

◆ ParametersChangedQuery()

bool CAMERA::ParametersChangedQuery ( ) const
inlineinherited
Returns
true if some of the parameters in camera was changed, it will NOT reset the flag.

Definition at line 226 of file camera.h.

226 { return m_parametersChanged; }
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
Definition: camera.h:335

References CAMERA::m_parametersChanged.

◆ rebuildProjection()

void CAMERA::rebuildProjection ( )
protectedinherited

Definition at line 174 of file camera.cpp.

175 {
176  if( ( m_windowSize.x == 0 ) || ( m_windowSize.y == 0 ) )
177  return;
178 
179  m_frustum.ratio = (float) m_windowSize.x / (float)m_windowSize.y;
180  m_frustum.farD = glm::length( m_camera_pos_init ) * m_maxZoom * 2.0f;
181 
182  switch( m_projectionType )
183  {
184  default:
186 
187  m_frustum.nearD = 0.10f;
188 
189  // Ratio width / height of the window display
190  m_frustum.angle = 45.0f;
191 
192  m_projectionMatrix = glm::perspective( glm::radians( m_frustum.angle ), m_frustum.ratio,
194 
195  m_projectionMatrixInv = glm::inverse( m_projectionMatrix );
196 
197  m_frustum.tang = glm::tan( glm::radians( m_frustum.angle ) * 0.5f );
198 
199  m_focalLen.x = ( (float)m_windowSize.y / (float)m_windowSize.x ) / m_frustum.tang;
200  m_focalLen.y = 1.0f / m_frustum.tang;
201 
206  break;
207 
209 
210  m_frustum.nearD = -m_frustum.farD; // Use a symmetrical clip plane for ortho projection
211 
212  // This formula was found by trial and error
213  const float orthoReductionFactor = glm::length( m_camera_pos_init ) *
214  m_zoom * m_zoom * 0.5f;
215 
216  // Initialize Projection Matrix for Orthographic View
217  m_projectionMatrix = glm::ortho( -m_frustum.ratio * orthoReductionFactor,
218  m_frustum.ratio * orthoReductionFactor,
219  -orthoReductionFactor,
220  orthoReductionFactor,
222 
223  m_projectionMatrixInv = glm::inverse( m_projectionMatrix );
224 
225  m_frustum.nw = orthoReductionFactor * 2.0f * m_frustum.ratio;
226  m_frustum.nh = orthoReductionFactor * 2.0f;
229 
230  break;
231  }
232 
233  if( ( m_windowSize.x > 0 ) && ( m_windowSize.y > 0 ) )
234  {
235  m_scr_nX.resize( m_windowSize.x + 1 );
236  m_scr_nY.resize( m_windowSize.y + 1 );
237 
238  // Precalc X values for camera -> ray generation
239  for( unsigned int x = 0; x < (unsigned int)m_windowSize.x + 1; ++x )
240  {
241  // Converts 0.0 .. 1.0
242  const float xNormalizedDeviceCoordinates = ( ( (float)x + 0.5f ) /
243  (m_windowSize.x - 0.0f) );
244 
245  // Converts -1.0 .. 1.0
246  m_scr_nX[x] = 2.0f * xNormalizedDeviceCoordinates - 1.0f;
247  }
248 
249  // Precalc Y values for camera -> ray generation
250  for( unsigned int y = 0; y < (unsigned int)m_windowSize.y + 1 ; ++y )
251  {
252  // Converts 0.0 .. 1.0
253  const float yNormalizedDeviceCoordinates = ( ( (float)y + 0.5f ) /
254  (m_windowSize.y - 0.0f) );
255 
256  // Converts -1.0 .. 1.0
257  m_scr_nY[y] = 2.0f * yNormalizedDeviceCoordinates - 1.0f;
258  }
259 
260  updateFrustum();
261  }
262 }
float m_zoom
3D zoom value – Z-distance is scaled by it
Definition: camera.h:266
float ratio
Definition: camera.h:59
SFVEC2F m_focalLen
Definition: camera.h:301
float nw
Definition: camera.h:60
float fw
Definition: camera.h:60
float tang
Definition: camera.h:59
float fh
Definition: camera.h:60
SFVEC3F m_camera_pos_init
Definition: camera.h:303
PROJECTION_TYPE m_projectionType
Definition: camera.h:292
float farD
Definition: camera.h:59
float m_maxZoom
Definition: camera.h:274
SFVEC2I m_windowSize
The window size that this camera is working.
Definition: camera.h:279
glm::mat4 m_projectionMatrix
Definition: camera.h:290
float nearD
Definition: camera.h:59
void updateFrustum()
Definition: camera.cpp:265
CAMERA_FRUSTUM m_frustum
Definition: camera.h:294
std::vector< float > m_scr_nY
Definition: camera.h:323
std::vector< float > m_scr_nX
Precalc values array used to calc ray for each pixel (constant for the same window size).
Definition: camera.h:322
glm::mat4 m_projectionMatrixInv
Definition: camera.h:291
float nh
Definition: camera.h:60
float angle
Definition: camera.h:59

References CAMERA_FRUSTUM::angle, CAMERA_FRUSTUM::farD, CAMERA_FRUSTUM::fh, CAMERA_FRUSTUM::fw, CAMERA::m_camera_pos_init, CAMERA::m_focalLen, CAMERA::m_frustum, CAMERA::m_maxZoom, CAMERA::m_projectionMatrix, CAMERA::m_projectionMatrixInv, CAMERA::m_projectionType, CAMERA::m_scr_nX, CAMERA::m_scr_nY, CAMERA::m_windowSize, CAMERA::m_zoom, CAMERA_FRUSTUM::nearD, CAMERA_FRUSTUM::nh, CAMERA_FRUSTUM::nw, ORTHO, PERSPECTIVE, CAMERA_FRUSTUM::ratio, CAMERA_FRUSTUM::tang, and CAMERA::updateFrustum().

Referenced by CAMERA::Interpolate(), CAMERA::Reset(), CAMERA::SetCurWindowSize(), CAMERA::ToggleProjection(), CAMERA::zoomChanged(), and CAMERA::ZoomReset().

◆ Reset()

void TRACK_BALL::Reset ( )
overridevirtual

Reset the camera to initial state.

Reimplemented from CAMERA.

Definition at line 137 of file track_ball.cpp.

138 {
139  CAMERA::Reset();
140 
141  memset( m_quat, 0, sizeof( m_quat ) );
142  trackball( m_quat, 0.0, 0.0, 0.0, 0.0 );
143 }
virtual void Reset()
Reset the camera to initial state.
Definition: camera.cpp:71
void trackball(double q[4], double p1x, double p1y, double p2x, double p2y)
Definition: trackball.cpp:155
double m_quat[4]
quarternion of the trackball
Definition: track_ball.h:67

References m_quat, CAMERA::Reset(), and trackball().

◆ Reset_T1()

void TRACK_BALL::Reset_T1 ( )
overridevirtual

Reimplemented from CAMERA.

Definition at line 146 of file track_ball.cpp.

147 {
149 
150  memset( m_quat_t1, 0, sizeof( m_quat_t1 ) );
151  trackball( m_quat_t1, 0.0, 0.0, 0.0, 0.0 );
152 }
double m_quat_t1[4]
Definition: track_ball.h:69
void trackball(double q[4], double p1x, double p1y, double p2x, double p2y)
Definition: trackball.cpp:155
virtual void Reset_T1()
Definition: camera.cpp:103

References m_quat_t1, CAMERA::Reset_T1(), and trackball().

◆ ResetXYpos()

void CAMERA::ResetXYpos ( )
inherited

Definition at line 409 of file camera.cpp.

410 {
411  m_parametersChanged = true;
412  m_camera_pos.x = 0.0f;
413  m_camera_pos.y = 0.0f;
414 
416  updateFrustum();
417 }
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
Definition: camera.h:335
void updateViewMatrix()
Definition: camera.cpp:139
SFVEC3F m_camera_pos
Definition: camera.h:304
void updateFrustum()
Definition: camera.cpp:265

References CAMERA::m_camera_pos, CAMERA::m_parametersChanged, CAMERA::updateFrustum(), and CAMERA::updateViewMatrix().

◆ ResetXYpos_T1()

void CAMERA::ResetXYpos_T1 ( )
inherited

Definition at line 420 of file camera.cpp.

421 {
422  m_camera_pos_t1.x = 0.0f;
423  m_camera_pos_t1.y = 0.0f;
424 }
SFVEC3F m_camera_pos_t1
Definition: camera.h:306

References CAMERA::m_camera_pos_t1.

Referenced by EDA_3D_CANVAS::move_pivot_based_on_cur_mouse_position().

◆ RotateX()

void CAMERA::RotateX ( float  aAngleInRadians)
inherited

Definition at line 519 of file camera.cpp.

520 {
521  m_rotate_aux.x += aAngleInRadians;
523 }
SFVEC3F m_rotate_aux
Stores the rotation angle auxiliary.
Definition: camera.h:313
void updateRotationMatrix()
Definition: camera.cpp:147

References CAMERA::m_rotate_aux, and CAMERA::updateRotationMatrix().

Referenced by EDA_3D_CONTROLLER::RotateView().

◆ RotateX_T1()

void CAMERA::RotateX_T1 ( float  aAngleInRadians)
inherited

Definition at line 540 of file camera.cpp.

541 {
542  m_rotate_aux_t1.x += aAngleInRadians;
543 }
SFVEC3F m_rotate_aux_t1
Definition: camera.h:315

References CAMERA::m_rotate_aux_t1.

Referenced by EDA_3D_CANVAS::SetView3D().

◆ RotateY()

void CAMERA::RotateY ( float  aAngleInRadians)
inherited

Definition at line 526 of file camera.cpp.

527 {
528  m_rotate_aux.y += aAngleInRadians;
530 }
SFVEC3F m_rotate_aux
Stores the rotation angle auxiliary.
Definition: camera.h:313
void updateRotationMatrix()
Definition: camera.cpp:147

References CAMERA::m_rotate_aux, and CAMERA::updateRotationMatrix().

Referenced by EDA_3D_CONTROLLER::RotateView().

◆ RotateY_T1()

void CAMERA::RotateY_T1 ( float  aAngleInRadians)
inherited

Definition at line 546 of file camera.cpp.

547 {
548  m_rotate_aux_t1.y += aAngleInRadians;
549 }
SFVEC3F m_rotate_aux_t1
Definition: camera.h:315

References CAMERA::m_rotate_aux_t1.

Referenced by EDA_3D_CANVAS::SetView3D().

◆ RotateZ()

void CAMERA::RotateZ ( float  aAngleInRadians)
inherited

Definition at line 533 of file camera.cpp.

534 {
535  m_rotate_aux.z += aAngleInRadians;
537 }
SFVEC3F m_rotate_aux
Stores the rotation angle auxiliary.
Definition: camera.h:313
void updateRotationMatrix()
Definition: camera.cpp:147

References CAMERA::m_rotate_aux, and CAMERA::updateRotationMatrix().

Referenced by EDA_3D_CONTROLLER::RotateView().

◆ RotateZ_T1()

void CAMERA::RotateZ_T1 ( float  aAngleInRadians)
inherited

Definition at line 552 of file camera.cpp.

553 {
554  m_rotate_aux_t1.z += aAngleInRadians;
555 }
SFVEC3F m_rotate_aux_t1
Definition: camera.h:315

References CAMERA::m_rotate_aux_t1.

Referenced by EDA_3D_CANVAS::SetView3D().

◆ SetBoardLookAtPos()

void CAMERA::SetBoardLookAtPos ( const SFVEC3F aBoardPos)
inlineinherited

Definition at line 112 of file camera.h.

113  {
114  if( m_board_lookat_pos_init != aBoardPos )
115  {
116  m_board_lookat_pos_init = aBoardPos;
117  SetLookAtPos( aBoardPos );
118  }
119  }
virtual void SetLookAtPos(const SFVEC3F &aLookAtPos)=0
SFVEC3F m_board_lookat_pos_init
Default boardlookat position (the board center).
Definition: camera.h:311

References CAMERA::m_board_lookat_pos_init, and CAMERA::SetLookAtPos().

Referenced by RENDER_3D_RAYTRACE::Reload(), and RENDER_3D_OPENGL::reload().

◆ SetCurMousePosition()

void CAMERA::SetCurMousePosition ( const wxPoint &  aPosition)
inherited

Update the current mouse position without make any new calculations on camera.

Definition at line 439 of file camera.cpp.

440 {
441  m_lastPosition = aNewMousePosition;
442 }
wxPoint m_lastPosition
The last mouse position in the screen.
Definition: camera.h:284

References CAMERA::m_lastPosition.

Referenced by EDA_3D_MODEL_VIEWER::OnMouseMove(), EDA_3D_CANVAS::OnMouseMove(), EDA_3D_MODEL_VIEWER::OnMouseWheel(), and EDA_3D_CANVAS::OnMouseWheel().

◆ SetCurWindowSize()

bool CAMERA::SetCurWindowSize ( const wxSize &  aSize)
inherited

Update the windows size of the camera.

Returns
true if the windows size changed since last time.

Definition at line 456 of file camera.cpp.

457 {
458  const SFVEC2I newSize = SFVEC2I( aSize.x, aSize.y );
459 
460  if( m_windowSize != newSize )
461  {
462  m_windowSize = newSize;
464 
465  return true;
466  }
467 
468  return false;
469 }
glm::ivec2 SFVEC2I
Definition: xv3d_types.h:39
void rebuildProjection()
Definition: camera.cpp:174
SFVEC2I m_windowSize
The window size that this camera is working.
Definition: camera.h:279

References CAMERA::m_windowSize, and CAMERA::rebuildProjection().

Referenced by EDA_3D_CANVAS::DoRePaint(), EDA_3D_MODEL_VIEWER::OnMouseMove(), EDA_3D_CANVAS::OnMouseMove(), and EDA_3D_MODEL_VIEWER::OnPaint().

◆ SetInterpolateMode()

void CAMERA::SetInterpolateMode ( CAMERA_INTERPOLATION  aInterpolateMode)
inlineinherited

Definition at line 213 of file camera.h.

214  {
215  m_interpolation_mode = aInterpolateMode;
216  }
CAMERA_INTERPOLATION m_interpolation_mode
Definition: camera.h:317

References CAMERA::m_interpolation_mode.

Referenced by EDA_3D_CANVAS::move_pivot_based_on_cur_mouse_position(), and EDA_3D_CANVAS::SetView3D().

◆ SetLookAtPos()

void TRACK_BALL::SetLookAtPos ( const SFVEC3F aLookAtPos)
overridevirtual

Implements CAMERA.

Definition at line 81 of file track_ball.cpp.

82 {
83  if( m_lookat_pos != aLookAtPos )
84  {
85  m_lookat_pos = aLookAtPos;
86 
88  updateFrustum();
89 
90  m_parametersChanged = true;
91  }
92 }
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
Definition: camera.h:335
void updateViewMatrix()
Definition: camera.cpp:139
SFVEC3F m_lookat_pos
Definition: camera.h:308
void updateFrustum()
Definition: camera.cpp:265

References CAMERA::m_lookat_pos, CAMERA::m_parametersChanged, CAMERA::updateFrustum(), and CAMERA::updateViewMatrix().

◆ SetLookAtPos_T1()

void CAMERA::SetLookAtPos_T1 ( const SFVEC3F aLookAtPos)
inlineinherited

Definition at line 123 of file camera.h.

124  {
125  m_lookat_pos_t1 = aLookAtPos;
126  }
SFVEC3F m_lookat_pos_t1
Definition: camera.h:310

References CAMERA::m_lookat_pos_t1.

Referenced by EDA_3D_CANVAS::move_pivot_based_on_cur_mouse_position().

◆ SetMaxZoom()

void CAMERA::SetMaxZoom ( float  maxZoom)
inlineinherited

Definition at line 187 of file camera.h.

188  {
189  m_maxZoom = maxZoom;
190  zoomChanged();
191  }
void zoomChanged()
Definition: camera.cpp:124
float m_maxZoom
Definition: camera.h:274

References CAMERA::m_maxZoom, and CAMERA::zoomChanged().

Referenced by RENDER_3D_RAYTRACE::Reload().

◆ SetMinZoom()

void CAMERA::SetMinZoom ( float  minZoom)
inlineinherited

Definition at line 180 of file camera.h.

181  {
182  m_minZoom = minZoom;
183  zoomChanged();
184  }
void zoomChanged()
Definition: camera.cpp:124
float m_minZoom
Possible 3D zoom range.
Definition: camera.h:273

References CAMERA::m_minZoom, and CAMERA::zoomChanged().

Referenced by RENDER_3D_RAYTRACE::Reload().

◆ SetProjection()

void CAMERA::SetProjection ( PROJECTION_TYPE  aProjection)
inlineinherited

Definition at line 162 of file camera.h.

162 { m_projectionType = aProjection; }
PROJECTION_TYPE m_projectionType
Definition: camera.h:292

References CAMERA::m_projectionType.

Referenced by EDA_3D_CANVAS::SetProjectionMode().

◆ SetT0_and_T1_current_T()

void TRACK_BALL::SetT0_and_T1_current_T ( )
overridevirtual

This will set T0 and T1 with the current values.

Reimplemented from CAMERA.

Definition at line 155 of file track_ball.cpp.

156 {
158 
159  memcpy( m_quat_t0, m_quat, sizeof( m_quat ) );
160  memcpy( m_quat_t1, m_quat, sizeof( m_quat ) );
161 }
double m_quat_t1[4]
Definition: track_ball.h:69
double m_quat_t0[4]
Definition: track_ball.h:68
double m_quat[4]
quarternion of the trackball
Definition: track_ball.h:67
virtual void SetT0_and_T1_current_T()
This will set T0 and T1 with the current values.
Definition: camera.cpp:558

References m_quat, m_quat_t0, m_quat_t1, and CAMERA::SetT0_and_T1_current_T().

◆ ToggleProjection()

void CAMERA::ToggleProjection ( )
inherited

◆ updateFrustum()

void CAMERA::updateFrustum ( )
protectedinherited

Definition at line 265 of file camera.cpp.

266 {
267  // Update matrix and vectors
268  m_viewMatrixInverse = glm::inverse( m_viewMatrix );
269 
270  m_right = glm::normalize( SFVEC3F( m_viewMatrixInverse *
271  glm::vec4( SFVEC3F( 1.0, 0.0, 0.0 ), 0.0 ) ) );
272 
273  m_up = glm::normalize( SFVEC3F( m_viewMatrixInverse *
274  glm::vec4( SFVEC3F( 0.0, 1.0, 0.0 ), 0.0 ) ) );
275 
276  m_dir = glm::normalize( SFVEC3F( m_viewMatrixInverse *
277  glm::vec4( SFVEC3F( 0.0, 0.0, 1.0 ), 0.0 ) ) );
278 
279  m_pos = SFVEC3F( m_viewMatrixInverse * glm::vec4( SFVEC3F( 0.0, 0.0, 0.0 ), 1.0 ) );
280 
281  /*
282  * Frustum is a implementation based on a tutorial by
283  * http://www.lighthouse3d.com/tutorials/view-frustum-culling/
284  */
285 
286  // compute the centers of the near and far planes
289 
290  // compute the 4 corners of the frustum on the near plane
295 
296  // compute the 4 corners of the frustum on the far plane
301 
302  if( ( m_windowSize.x > 0 ) && ( m_windowSize.y > 0 ) )
303  {
304  // Reserve size for precalc values
305  m_right_nX.resize( m_windowSize.x + 1 );
306  m_up_nY.resize( m_windowSize.y + 1 );
307 
308  // Precalc X values for camera -> ray generation
309  const SFVEC3F right_nw = m_right * m_frustum.nw;
310 
311  for( unsigned int x = 0; x < ( (unsigned int) m_windowSize.x + 1 ); ++x )
312  m_right_nX[x] = right_nw * m_scr_nX[x];
313 
314  // Precalc Y values for camera -> ray generation
315  const SFVEC3F up_nh = m_up * m_frustum.nh;
316 
317  for( unsigned int y = 0; y < ( (unsigned int) m_windowSize.y + 1 ); ++y )
318  m_up_nY[y] = up_nh * m_scr_nY[y];
319  }
320 }
SFVEC3F fbl
Far Bottom Left.
Definition: camera.h:57
SFVEC3F fc
Definition: camera.h:50
glm::mat4 m_viewMatrixInverse
Definition: camera.h:289
SFVEC3F ftl
Far Top Left.
Definition: camera.h:55
SFVEC3F m_dir
Definition: camera.h:298
SFVEC3F nbr
Near Bottom Right.
Definition: camera.h:54
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.
Definition: camera.h:329
glm::mat4 m_viewMatrix
Definition: camera.h:288
float nw
Definition: camera.h:60
SFVEC3F m_up
Definition: camera.h:297
float fw
Definition: camera.h:60
SFVEC3F fbr
Far Bottom Right.
Definition: camera.h:58
float fh
Definition: camera.h:60
SFVEC3F m_pos
Definition: camera.h:299
SFVEC3F nbl
Near Bottom Left.
Definition: camera.h:53
float farD
Definition: camera.h:59
SFVEC3F m_right
Definition: camera.h:296
SFVEC2I m_windowSize
The window size that this camera is working.
Definition: camera.h:279
float nearD
Definition: camera.h:59
std::vector< SFVEC3F > m_up_nY
Definition: camera.h:330
CAMERA_FRUSTUM m_frustum
Definition: camera.h:294
glm::vec3 SFVEC3F
Definition: xv3d_types.h:44
SFVEC3F ntl
Near Top Left.
Definition: camera.h:51
SFVEC3F ntr
Near Top Right.
Definition: camera.h:52
std::vector< float > m_scr_nY
Definition: camera.h:323
std::vector< float > m_scr_nX
Precalc values array used to calc ray for each pixel (constant for the same window size).
Definition: camera.h:322
SFVEC3F nc
Definition: camera.h:49
float nh
Definition: camera.h:60
SFVEC3F ftr
Far Top Right.
Definition: camera.h:56

References CAMERA_FRUSTUM::farD, CAMERA_FRUSTUM::fbl, CAMERA_FRUSTUM::fbr, CAMERA_FRUSTUM::fc, CAMERA_FRUSTUM::fh, CAMERA_FRUSTUM::ftl, CAMERA_FRUSTUM::ftr, CAMERA_FRUSTUM::fw, CAMERA::m_dir, CAMERA::m_frustum, CAMERA::m_pos, CAMERA::m_right, CAMERA::m_right_nX, CAMERA::m_scr_nX, CAMERA::m_scr_nY, CAMERA::m_up, CAMERA::m_up_nY, CAMERA::m_viewMatrix, CAMERA::m_viewMatrixInverse, CAMERA::m_windowSize, CAMERA_FRUSTUM::nbl, CAMERA_FRUSTUM::nbr, CAMERA_FRUSTUM::nc, CAMERA_FRUSTUM::nearD, CAMERA_FRUSTUM::nh, CAMERA_FRUSTUM::ntl, CAMERA_FRUSTUM::ntr, and CAMERA_FRUSTUM::nw.

Referenced by Drag(), Pan(), CAMERA::rebuildProjection(), CAMERA::ResetXYpos(), SetLookAtPos(), and CAMERA::updateRotationMatrix().

◆ updateRotationMatrix()

void CAMERA::updateRotationMatrix ( )
protectedinherited

Definition at line 147 of file camera.cpp.

148 {
149  m_rotationMatrixAux = glm::rotate( glm::mat4( 1.0f ), m_rotate_aux.x,
150  SFVEC3F( 1.0f, 0.0f, 0.0f ) );
152 
154  SFVEC3F( 0.0f, 1.0f, 0.0f ) );
156 
158  SFVEC3F( 0.0f, 0.0f, 1.0f ) );
160 
161  m_parametersChanged = true;
162 
164  updateFrustum();
165 }
SFVEC3F m_rotate_aux
Stores the rotation angle auxiliary.
Definition: camera.h:313
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
Definition: camera.h:335
void normalise2PI(float &aAngle)
Definition: camera.cpp:34
void updateViewMatrix()
Definition: camera.cpp:139
void updateFrustum()
Definition: camera.cpp:265
glm::vec3 SFVEC3F
Definition: xv3d_types.h:44
glm::mat4 m_rotationMatrixAux
Definition: camera.h:287

References CAMERA::m_parametersChanged, CAMERA::m_rotate_aux, CAMERA::m_rotationMatrixAux, normalise2PI(), CAMERA::updateFrustum(), and CAMERA::updateViewMatrix().

Referenced by CAMERA::Interpolate(), CAMERA::Reset(), CAMERA::RotateX(), CAMERA::RotateY(), and CAMERA::RotateZ().

◆ updateViewMatrix()

void CAMERA::updateViewMatrix ( )
protectedinherited

Definition at line 139 of file camera.cpp.

140 {
141  m_viewMatrix = glm::translate( glm::mat4( 1.0f ), m_camera_pos ) *
143  glm::translate( glm::mat4( 1.0f ), -m_lookat_pos );
144 }
glm::mat4 m_viewMatrix
Definition: camera.h:288
glm::mat4 m_rotationMatrix
Definition: camera.h:286
SFVEC3F m_lookat_pos
Definition: camera.h:308
SFVEC3F m_camera_pos
Definition: camera.h:304
glm::mat4 m_rotationMatrixAux
Definition: camera.h:287

References CAMERA::m_camera_pos, CAMERA::m_lookat_pos, CAMERA::m_rotationMatrix, CAMERA::m_rotationMatrixAux, and CAMERA::m_viewMatrix.

Referenced by Drag(), Pan(), CAMERA::Reset(), CAMERA::ResetXYpos(), SetLookAtPos(), CAMERA::updateRotationMatrix(), CAMERA::zoomChanged(), and CAMERA::ZoomReset().

◆ Zoom()

bool CAMERA::Zoom ( float  aFactor)
inherited

Definition at line 482 of file camera.cpp.

483 {
484  if( ( m_zoom == m_minZoom && aFactor > 1 ) || ( m_zoom == m_maxZoom && aFactor < 1 )
485  || aFactor == 1 )
486  {
487  return false;
488  }
489 
490  m_zoom /= aFactor;
491 
492  zoomChanged();
493  return true;
494 }
float m_zoom
3D zoom value – Z-distance is scaled by it
Definition: camera.h:266
void zoomChanged()
Definition: camera.cpp:124
float m_maxZoom
Definition: camera.h:274
float m_minZoom
Possible 3D zoom range.
Definition: camera.h:273

References CAMERA::m_maxZoom, CAMERA::m_minZoom, CAMERA::m_zoom, and CAMERA::zoomChanged().

Referenced by EDA_3D_MODEL_VIEWER::OnMouseWheel(), and EDA_3D_CANVAS::OnMouseWheel().

◆ Zoom_T1()

bool CAMERA::Zoom_T1 ( float  aFactor)
inherited

Definition at line 497 of file camera.cpp.

498 {
499  if( ( m_zoom == m_minZoom && aFactor > 1 ) || ( m_zoom == m_maxZoom && aFactor < 1 )
500  || aFactor == 1 )
501  {
502  return false;
503  }
504 
505  m_zoom_t1 = m_zoom / aFactor;
506 
507  if( m_zoom_t1 < m_minZoom )
509 
510  if( m_zoom_t1 > m_maxZoom )
512 
514 
515  return true;
516 }
float m_zoom
3D zoom value – Z-distance is scaled by it
Definition: camera.h:266
float m_zoom_t1
Definition: camera.h:268
SFVEC3F m_camera_pos_init
Definition: camera.h:303
float m_maxZoom
Definition: camera.h:274
SFVEC3F m_camera_pos_t1
Definition: camera.h:306
float m_minZoom
Possible 3D zoom range.
Definition: camera.h:273

References CAMERA::m_camera_pos_init, CAMERA::m_camera_pos_t1, CAMERA::m_maxZoom, CAMERA::m_minZoom, CAMERA::m_zoom, and CAMERA::m_zoom_t1.

Referenced by EDA_3D_CANVAS::SetView3D().

◆ zoomChanged()

void CAMERA::zoomChanged ( )
protectedinherited

Definition at line 124 of file camera.cpp.

125 {
126  if( m_zoom < m_minZoom )
127  m_zoom = m_minZoom;
128 
129  if( m_zoom > m_maxZoom )
130  m_zoom = m_maxZoom;
131 
133 
136 }
float m_zoom
3D zoom value – Z-distance is scaled by it
Definition: camera.h:266
SFVEC3F m_camera_pos_init
Definition: camera.h:303
void rebuildProjection()
Definition: camera.cpp:174
void updateViewMatrix()
Definition: camera.cpp:139
float m_maxZoom
Definition: camera.h:274
SFVEC3F m_camera_pos
Definition: camera.h:304
float m_minZoom
Possible 3D zoom range.
Definition: camera.h:273

References CAMERA::m_camera_pos, CAMERA::m_camera_pos_init, CAMERA::m_maxZoom, CAMERA::m_minZoom, CAMERA::m_zoom, CAMERA::rebuildProjection(), and CAMERA::updateViewMatrix().

Referenced by CAMERA::SetMaxZoom(), CAMERA::SetMinZoom(), and CAMERA::Zoom().

◆ ZoomReset()

void CAMERA::ZoomReset ( )
inherited

Definition at line 472 of file camera.cpp.

473 {
474  m_zoom = 1.0f;
475 
477 
480 }
float m_zoom
3D zoom value – Z-distance is scaled by it
Definition: camera.h:266
SFVEC3F m_camera_pos_init
Definition: camera.h:303
void rebuildProjection()
Definition: camera.cpp:174
void updateViewMatrix()
Definition: camera.cpp:139
SFVEC3F m_camera_pos
Definition: camera.h:304

References CAMERA::m_camera_pos, CAMERA::m_camera_pos_init, CAMERA::m_zoom, CAMERA::rebuildProjection(), and CAMERA::updateViewMatrix().

Member Data Documentation

◆ m_board_lookat_pos_init

SFVEC3F CAMERA::m_board_lookat_pos_init
protectedinherited

Default boardlookat position (the board center).

Definition at line 311 of file camera.h.

Referenced by CAMERA::CAMERA(), CAMERA::Reset(), CAMERA::Reset_T1(), and CAMERA::SetBoardLookAtPos().

◆ m_camera_pos

◆ m_camera_pos_init

◆ m_camera_pos_t0

SFVEC3F CAMERA::m_camera_pos_t0
protectedinherited

Definition at line 305 of file camera.h.

Referenced by CAMERA::Interpolate(), CAMERA::Reset(), and CAMERA::SetT0_and_T1_current_T().

◆ m_camera_pos_t1

SFVEC3F CAMERA::m_camera_pos_t1
protectedinherited

◆ m_dir

SFVEC3F CAMERA::m_dir
protectedinherited

Definition at line 298 of file camera.h.

Referenced by CAMERA::GetDir(), CAMERA::MakeRay(), and CAMERA::updateFrustum().

◆ m_focalLen

SFVEC2F CAMERA::m_focalLen
protectedinherited

Definition at line 301 of file camera.h.

Referenced by CAMERA::GetFocalLen(), and CAMERA::rebuildProjection().

◆ m_frustum

◆ m_interpolation_mode

CAMERA_INTERPOLATION CAMERA::m_interpolation_mode
protectedinherited

Definition at line 317 of file camera.h.

Referenced by CAMERA::CAMERA(), Interpolate(), and CAMERA::SetInterpolateMode().

◆ m_lastPosition

wxPoint CAMERA::m_lastPosition
protectedinherited

The last mouse position in the screen.

Definition at line 284 of file camera.h.

Referenced by Drag(), CAMERA::MakeRayAtCurrrentMousePosition(), Pan(), CAMERA::Reset(), and CAMERA::SetCurMousePosition().

◆ m_lookat_pos

SFVEC3F CAMERA::m_lookat_pos
protectedinherited

◆ m_lookat_pos_t0

SFVEC3F CAMERA::m_lookat_pos_t0
protectedinherited

Definition at line 309 of file camera.h.

Referenced by CAMERA::Interpolate(), CAMERA::Reset(), and CAMERA::SetT0_and_T1_current_T().

◆ m_lookat_pos_t1

SFVEC3F CAMERA::m_lookat_pos_t1
protectedinherited

◆ m_maxZoom

float CAMERA::m_maxZoom
protectedinherited

◆ m_minZoom

float CAMERA::m_minZoom
protectedinherited

Possible 3D zoom range.

Definition at line 273 of file camera.h.

Referenced by CAMERA::CAMERA(), CAMERA::GetMinZoom(), CAMERA::SetMinZoom(), CAMERA::Zoom(), CAMERA::Zoom_T1(), and CAMERA::zoomChanged().

◆ m_parametersChanged

bool CAMERA::m_parametersChanged
protectedinherited

Set to true if any of the parameters in the camera was changed.

Definition at line 335 of file camera.h.

Referenced by Drag(), CAMERA::Interpolate(), Pan(), CAMERA::ParametersChanged(), CAMERA::ParametersChangedQuery(), CAMERA::Reset(), CAMERA::ResetXYpos(), SetLookAtPos(), and CAMERA::updateRotationMatrix().

◆ m_pos

SFVEC3F CAMERA::m_pos
protectedinherited

Definition at line 299 of file camera.h.

Referenced by CAMERA::GetPos(), CAMERA::MakeRay(), and CAMERA::updateFrustum().

◆ m_projectionMatrix

glm::mat4 CAMERA::m_projectionMatrix
protectedinherited

Definition at line 290 of file camera.h.

Referenced by CAMERA::GetProjectionMatrix(), CAMERA::rebuildProjection(), and CAMERA::Reset().

◆ m_projectionMatrixInv

glm::mat4 CAMERA::m_projectionMatrixInv
protectedinherited

◆ m_projectionType

◆ m_quat

double TRACK_BALL::m_quat[4]
private

quarternion of the trackball

Definition at line 67 of file track_ball.h.

Referenced by Drag(), Interpolate(), Reset(), SetT0_and_T1_current_T(), and TRACK_BALL().

◆ m_quat_t0

double TRACK_BALL::m_quat_t0[4]
private

Definition at line 68 of file track_ball.h.

Referenced by Interpolate(), SetT0_and_T1_current_T(), and TRACK_BALL().

◆ m_quat_t1

double TRACK_BALL::m_quat_t1[4]
private

Definition at line 69 of file track_ball.h.

Referenced by Interpolate(), Reset_T1(), SetT0_and_T1_current_T(), and TRACK_BALL().

◆ m_right

SFVEC3F CAMERA::m_right
protectedinherited

Definition at line 296 of file camera.h.

Referenced by CAMERA::GetRight(), and CAMERA::updateFrustum().

◆ m_right_nX

std::vector< SFVEC3F > CAMERA::m_right_nX
protectedinherited

Precalc values array used to calc ray for each pixel, for X and Y axis of each new camera position.

Definition at line 329 of file camera.h.

Referenced by CAMERA::MakeRay(), and CAMERA::updateFrustum().

◆ m_rotate_aux

SFVEC3F CAMERA::m_rotate_aux
protectedinherited

◆ m_rotate_aux_t0

SFVEC3F CAMERA::m_rotate_aux_t0
protectedinherited

◆ m_rotate_aux_t1

◆ m_rotationMatrix

glm::mat4 CAMERA::m_rotationMatrix
protectedinherited

◆ m_rotationMatrixAux

glm::mat4 CAMERA::m_rotationMatrixAux
protectedinherited

◆ m_scr_nX

std::vector< float > CAMERA::m_scr_nX
protectedinherited

Precalc values array used to calc ray for each pixel (constant for the same window size).

Definition at line 322 of file camera.h.

Referenced by CAMERA::rebuildProjection(), CAMERA::Reset(), and CAMERA::updateFrustum().

◆ m_scr_nY

std::vector< float > CAMERA::m_scr_nY
protectedinherited

Definition at line 323 of file camera.h.

Referenced by CAMERA::rebuildProjection(), CAMERA::Reset(), and CAMERA::updateFrustum().

◆ m_up

SFVEC3F CAMERA::m_up
protectedinherited

Definition at line 297 of file camera.h.

Referenced by CAMERA::GetUp(), and CAMERA::updateFrustum().

◆ m_up_nY

std::vector< SFVEC3F > CAMERA::m_up_nY
protectedinherited

Definition at line 330 of file camera.h.

Referenced by CAMERA::MakeRay(), and CAMERA::updateFrustum().

◆ m_viewMatrix

glm::mat4 CAMERA::m_viewMatrix
protectedinherited

◆ m_viewMatrixInverse

glm::mat4 CAMERA::m_viewMatrixInverse
protectedinherited

Definition at line 289 of file camera.h.

Referenced by CAMERA::GetViewMatrix_Inv(), CAMERA::Reset(), and CAMERA::updateFrustum().

◆ m_windowSize

SFVEC2I CAMERA::m_windowSize
protectedinherited

◆ m_zoom

float CAMERA::m_zoom
protectedinherited

◆ m_zoom_t0

float CAMERA::m_zoom_t0
protectedinherited

Definition at line 267 of file camera.h.

Referenced by CAMERA::Interpolate(), CAMERA::Reset(), and CAMERA::SetT0_and_T1_current_T().

◆ m_zoom_t1

float CAMERA::m_zoom_t1
protectedinherited

The documentation for this class was generated from the following files: