KiCad PCB EDA Suite
camera.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2015-2016 Mario Luzeiro <[email protected]>
5 * Copyright (C) 2015-2020 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
30#ifndef CAMERA_H
31#define CAMERA_H
32
33#include "../3d_rendering/raytracing/ray.h"
34#include <wx/gdicmn.h> // for wxSize
35#include <vector>
36
38{
39 ORTHO = 0,
41};
42
48{
60 float nw, nh, fw, fh;
61};
62
63
65{
66 LINEAR,
67 EASING_IN_OUT, // Quadratic
68 BEZIER,
69};
70
71
77class CAMERA
78{
79public:
80 static const float DEFAULT_MIN_ZOOM;
81 static const float DEFAULT_MAX_ZOOM;
82
88 explicit CAMERA( float aInitialDistance );
89
90 virtual ~CAMERA()
91 {
92 }
93
99 glm::mat4 GetRotationMatrix() const;
100
101 const glm::mat4& GetViewMatrix() const;
102 const glm::mat4& GetViewMatrix_Inv() const;
103
104 const glm::mat4& GetProjectionMatrix() const;
105 const glm::mat4& GetProjectionMatrixInv() const;
106
107 const SFVEC3F& GetRight() const { return m_right; }
108 const SFVEC3F& GetUp() const { return m_up; }
109 const SFVEC3F& GetDir() const { return m_dir; }
110 const SFVEC3F& GetPos() const { return m_pos; }
111 const SFVEC2F& GetFocalLen() const { return m_focalLen; }
112 float GetNear() const { return m_frustum.nearD; }
113 float GetFar() const { return m_frustum.farD; }
114 const CAMERA_FRUSTUM& GetFrustum() const { return m_frustum; }
115 const SFVEC3F& GetLookAtPos() const { return m_lookat_pos; }
116
123 void SetRotationMatrix( const glm::mat4& aRotation );
124
132 void SetViewMatrix( glm::mat4 aViewMatrix );
133
134 void SetBoardLookAtPos( const SFVEC3F& aBoardPos );
135
136 void SetLookAtPos_T1( const SFVEC3F& aLookAtPos )
137 {
138 m_lookat_pos_t1 = aLookAtPos;
139 }
140
141 const SFVEC3F& GetLookAtPos_T1() const { return m_lookat_pos_t1; }
142
143 const SFVEC3F& GetCameraPos() const { return m_camera_pos; }
144 const SFVEC3F& GetCameraInitPos() const { return m_camera_pos_init; }
145
146 float GetCameraMinDimension() const;
147
151 virtual void Drag( const wxPoint& aNewMousePosition ) = 0;
152
153 virtual void Pan( const wxPoint& aNewMousePosition ) = 0;
154
155 virtual void Pan( const SFVEC3F& aDeltaOffsetInc ) = 0;
156
157 virtual void Pan_T1( const SFVEC3F& aDeltaOffsetInc ) = 0;
158
162 virtual void Reset();
163 virtual void Reset_T1();
164
165 void ResetXYpos();
166 void ResetXYpos_T1();
167
171 const wxPoint& GetCurMousePosition() { return m_lastPosition; }
172
176 void SetCurMousePosition( const wxPoint& aPosition );
177
178 void ToggleProjection();
180 void SetProjection( PROJECTION_TYPE aProjection ) { m_projectionType = aProjection; }
181
187 bool SetCurWindowSize( const wxSize& aSize );
188
189 void ZoomReset();
190
191 bool Zoom( float aFactor );
192
193 bool Zoom_T1( float aFactor );
194
195 float GetZoom() const { return m_zoom; }
196
197 float GetMinZoom() { return m_minZoom; }
198 void SetMinZoom( float minZoom )
199 {
200 m_minZoom = minZoom;
201 zoomChanged();
202 }
203
204 float GetMaxZoom() { return m_maxZoom; }
205 void SetMaxZoom( float maxZoom )
206 {
207 m_maxZoom = maxZoom;
208 zoomChanged();
209 }
210
211 void RotateX( float aAngleInRadians );
212 void RotateY( float aAngleInRadians );
213 void RotateZ( float aAngleInRadians );
214
215 void RotateX_T1( float aAngleInRadians );
216 void RotateY_T1( float aAngleInRadians );
217 void RotateZ_T1( float aAngleInRadians );
218
222 virtual void SetT0_and_T1_current_T();
223
229 virtual void Interpolate( float t );
230
232 {
233 m_interpolation_mode = aInterpolateMode;
234 }
235
239 bool ParametersChanged();
240
245
253 void MakeRay( const SFVEC2I& aWindowPos, SFVEC3F& aOutOrigin, SFVEC3F& aOutDirection ) const;
254
263 void MakeRay( const SFVEC2F& aWindowPos, SFVEC3F& aOutOrigin, SFVEC3F& aOutDirection ) const;
264
271 void MakeRayAtCurrentMousePosition( SFVEC3F& aOutOrigin, SFVEC3F& aOutDirection ) const;
272
276 void Update() { updateFrustum(); }
277
278protected:
279 void zoomChanged();
280 void rebuildProjection();
281 void updateFrustum();
282 void updateViewMatrix();
283
285
289 float m_zoom;
292
298
303
308
311 glm::mat4 m_viewMatrix;
316
318
323
325
330
335
339
341
345 std::vector< float > m_scr_nX;
346 std::vector< float > m_scr_nY;
347
352 std::vector< SFVEC3F > m_right_nX;
353 std::vector< SFVEC3F > m_up_nY;
354
359
367 static const wxChar* m_logTrace;
368};
369
370#endif // CAMERA_H
CAMERA_INTERPOLATION
Definition: camera.h:65
PROJECTION_TYPE
Definition: camera.h:38
Generic cubic Bezier representation.
Definition: bezier_curves.h:78
A class used to derive camera objects from.
Definition: camera.h:78
glm::mat4 GetRotationMatrix() const
Get the rotation matrix to be applied in a transformation camera.
Definition: camera.cpp:182
const SFVEC3F & GetRight() const
Definition: camera.h:107
float m_zoom_t0
Definition: camera.h:290
bool m_parametersChanged
Set to true if any of the parameters in the camera was changed.
Definition: camera.h:358
void RotateY(float aAngleInRadians)
Definition: camera.cpp:598
glm::mat4 m_projectionMatrixInv
Definition: camera.h:314
void RotateX(float aAngleInRadians)
Definition: camera.cpp:591
const CAMERA_FRUSTUM & GetFrustum() const
Definition: camera.h:114
SFVEC3F m_lookat_pos
Definition: camera.h:331
const glm::mat4 & GetProjectionMatrix() const
Definition: camera.cpp:414
bool ParametersChangedQuery() const
Definition: camera.h:244
void SetMinZoom(float minZoom)
Definition: camera.h:198
void SetBoardLookAtPos(const SFVEC3F &aBoardPos)
Definition: camera.cpp:123
void SetProjection(PROJECTION_TYPE aProjection)
Definition: camera.h:180
bool Zoom(float aFactor)
Definition: camera.cpp:538
SFVEC3F m_camera_pos_t0
Definition: camera.h:328
const SFVEC3F & GetPos() const
Definition: camera.h:110
float GetMaxZoom()
Definition: camera.h:204
void RotateY_T1(float aAngleInRadians)
Definition: camera.cpp:618
virtual void Pan(const wxPoint &aNewMousePosition)=0
virtual void Reset()
Reset the camera to initial state.
Definition: camera.cpp:70
SFVEC3F m_right
Definition: camera.h:319
float GetNear() const
Definition: camera.h:112
glm::mat4 m_projectionMatrix
Definition: camera.h:313
CAMERA_INTERPOLATION m_interpolation_mode
Definition: camera.h:340
SFVEC3F m_rotate_aux_t1
Definition: camera.h:338
wxPoint m_lastPosition
The last mouse position in the screen.
Definition: camera.h:307
void ZoomReset()
Definition: camera.cpp:527
void ResetXYpos()
Definition: camera.cpp:432
const glm::mat4 & GetViewMatrix_Inv() const
Definition: camera.cpp:488
PROJECTION_TYPE GetProjection()
Definition: camera.h:179
bool Zoom_T1(float aFactor)
Definition: camera.cpp:569
static const float DEFAULT_MIN_ZOOM
Definition: camera.h:80
void updateRotationMatrix()
Definition: camera.cpp:161
SFVEC3F m_rotate_aux_t0
Definition: camera.h:337
virtual void Reset_T1()
Definition: camera.cpp:102
void MakeRay(const SFVEC2I &aWindowPos, SFVEC3F &aOutOrigin, SFVEC3F &aOutDirection) const
Make a ray based on a windows screen position.
Definition: camera.cpp:348
static const float DEFAULT_MAX_ZOOM
Definition: camera.h:81
virtual void Pan_T1(const SFVEC3F &aDeltaOffsetInc)=0
virtual void Interpolate(float t)
It will update the matrix to interpolate between T0 and T1 values.
Definition: camera.cpp:644
const SFVEC3F & GetUp() const
Definition: camera.h:108
SFVEC3F m_dir
Definition: camera.h:321
virtual ~CAMERA()
Definition: camera.h:90
virtual void Drag(const wxPoint &aNewMousePosition)=0
Calculate a new mouse drag position.
bool SetCurWindowSize(const wxSize &aSize)
Update the windows size of the camera.
Definition: camera.cpp:511
void SetInterpolateMode(CAMERA_INTERPOLATION aInterpolateMode)
Definition: camera.h:231
float GetZoom() const
Definition: camera.h:195
SFVEC3F m_camera_pos_init
Definition: camera.h:326
CAMERA(float aInitialDistance)
Initialize a camera.
Definition: camera.cpp:53
const glm::mat4 & GetProjectionMatrixInv() const
Definition: camera.cpp:420
void ResetXYpos_T1()
Definition: camera.cpp:443
float m_minZoom
Possible 3D zoom range.
Definition: camera.h:296
float GetCameraMinDimension() const
Definition: camera.cpp:426
float GetFar() const
Definition: camera.h:113
virtual void Pan(const SFVEC3F &aDeltaOffsetInc)=0
float m_maxZoom
Definition: camera.h:297
const SFVEC3F & GetLookAtPos() const
Definition: camera.h:115
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:352
void rebuildProjection()
Definition: camera.cpp:196
float m_zoom_t1
Definition: camera.h:291
float GetMinZoom()
Definition: camera.h:197
SFVEC3F m_lookat_pos_t1
Definition: camera.h:333
CAMERA_FRUSTUM m_frustum
Definition: camera.h:317
void updateFrustum()
Definition: camera.cpp:289
SFVEC3F m_lookat_pos_t0
Definition: camera.h:332
void RotateZ(float aAngleInRadians)
Definition: camera.cpp:605
const SFVEC2F & GetFocalLen() const
Definition: camera.h:111
virtual void SetT0_and_T1_current_T()
This will set T0 and T1 with the current values.
Definition: camera.cpp:630
SFVEC3F m_camera_pos
Definition: camera.h:327
PROJECTION_TYPE m_projectionType
Definition: camera.h:315
SFVEC3F m_pos
Definition: camera.h:322
void ToggleProjection()
Definition: camera.cpp:500
SFVEC2I m_windowSize
The window size that this camera is working.
Definition: camera.h:302
void MakeRayAtCurrentMousePosition(SFVEC3F &aOutOrigin, SFVEC3F &aOutDirection) const
Make a ray based on the latest mouse position.
Definition: camera.cpp:402
SFVEC2F m_focalLen
Definition: camera.h:324
void updateViewMatrix()
Definition: camera.cpp:153
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:345
void RotateX_T1(float aAngleInRadians)
Definition: camera.cpp:612
const glm::mat4 & GetViewMatrix() const
Definition: camera.cpp:450
void SetLookAtPos_T1(const SFVEC3F &aLookAtPos)
Definition: camera.h:136
glm::mat4 m_viewMatrixInverse
Definition: camera.h:312
const SFVEC3F & GetLookAtPos_T1() const
Definition: camera.h:141
const wxPoint & GetCurMousePosition()
Get the current mouse position.
Definition: camera.h:171
const SFVEC3F & GetCameraPos() const
Definition: camera.h:143
SFVEC3F m_up
Definition: camera.h:320
const SFVEC3F & GetDir() const
Definition: camera.h:109
SFVEC3F m_rotate_aux
Stores the rotation angle auxiliary.
Definition: camera.h:336
glm::mat4 m_rotationMatrixAux
Definition: camera.h:310
glm::mat4 m_rotationMatrix
Definition: camera.h:309
std::vector< float > m_scr_nY
Definition: camera.h:346
void SetViewMatrix(glm::mat4 aViewMatrix)
Set the affine matrix to be applied to a transformation camera.
Definition: camera.cpp:456
void RotateZ_T1(float aAngleInRadians)
Definition: camera.cpp:624
glm::mat4 m_viewMatrix
Definition: camera.h:311
void SetMaxZoom(float maxZoom)
Definition: camera.h:205
SFVEC3F m_board_lookat_pos_init
Default boardlookat position (the board center).
Definition: camera.h:334
const SFVEC3F & GetCameraInitPos() const
Definition: camera.h:144
std::vector< SFVEC3F > m_up_nY
Definition: camera.h:353
bool ParametersChanged()
Definition: camera.cpp:662
void SetRotationMatrix(const glm::mat4 &aRotation)
Set the rotation matrix to be applied in a transformation camera, without making any new calculations...
Definition: camera.cpp:188
SFVEC3F m_camera_pos_t1
Definition: camera.h:329
float m_zoom
3D zoom value – Z-distance is scaled by it
Definition: camera.h:289
void Update()
Update the camera.
Definition: camera.h:276
void zoomChanged()
Definition: camera.cpp:138
void SetCurMousePosition(const wxPoint &aPosition)
Update the current mouse position without make any new calculations on camera.
Definition: camera.cpp:494
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
Definition: camera.h:367
Frustum is a implementation based on a tutorial by http://www.lighthouse3d.com/tutorials/view-frustum...
Definition: camera.h:48
SFVEC3F ntr
Near Top Right.
Definition: camera.h:52
SFVEC3F ntl
Near Top Left.
Definition: camera.h:51
SFVEC3F fc
Definition: camera.h:50
float angle
Definition: camera.h:59
float ratio
Definition: camera.h:59
float fh
Definition: camera.h:60
float nh
Definition: camera.h:60
SFVEC3F ftl
Far Top Left.
Definition: camera.h:55
SFVEC3F fbr
Far Bottom Right.
Definition: camera.h:58
float fw
Definition: camera.h:60
float farD
Definition: camera.h:59
SFVEC3F nbl
Near Bottom Left.
Definition: camera.h:53
SFVEC3F nc
Definition: camera.h:49
SFVEC3F nbr
Near Bottom Right.
Definition: camera.h:54
float nw
Definition: camera.h:60
SFVEC3F fbl
Far Bottom Left.
Definition: camera.h:57
float tang
Definition: camera.h:59
float nearD
Definition: camera.h:59
SFVEC3F ftr
Far Top Right.
Definition: camera.h:56
glm::ivec2 SFVEC2I
Definition: xv3d_types.h:39
glm::vec2 SFVEC2F
Definition: xv3d_types.h:42
glm::vec3 SFVEC3F
Definition: xv3d_types.h:44