16 #ifndef QGSCAMERACONTROLLER_H
17 #define QGSCAMERACONTROLLER_H
23 #include <Qt3DCore/QEntity>
24 #include <Qt3DInput/QMouseEvent>
30 class QKeyboardDevice;
31 class QKeyboardHandler;
50 class QgsTerrainEntity;
64 Q_PROPERTY( Qt3DRender::QCamera *camera READ camera WRITE setCamera NOTIFY cameraChanged )
65 Q_PROPERTY( QRect viewport READ viewport WRITE setViewport NOTIFY viewportChanged )
74 Q_ENUM( NavigationMode )
83 Q_ENUM( VerticalAxisInversion )
90 Qt3DRender::QCamera *
camera()
const {
return mCamera; }
110 void setCameraMovementSpeed(
double movementSpeed );
129 void setTerrainEntity( QgsTerrainEntity *te );
132 void setCamera( Qt3DRender::QCamera *camera );
134 void setViewport( QRect viewport );
136 void frameTriggered(
float dt );
139 void resetView(
float distance );
142 void setViewFromTop(
float worldX,
float worldY,
float distance,
float yaw = 0 );
153 void setLookingAtPoint(
const QgsVector3D &point,
float distance,
float pitch,
float yaw );
171 float distance()
const {
return mCameraPose.distanceFromCenterPoint(); }
178 float pitch()
const {
return mCameraPose.pitchAngle(); }
185 float yaw()
const {
return mCameraPose.headingAngle(); }
188 QDomElement writeXml( QDomDocument &doc )
const;
190 void readXml(
const QDomElement &elem );
193 void zoom(
float factor );
195 void tiltUpAroundViewCenter(
float deltaPitch );
197 void rotateAroundViewCenter(
float deltaYaw );
199 void setCameraHeadingAngle(
float angle );
201 void moveView(
float tx,
float ty );
208 bool willHandleKeyEvent( QKeyEvent *event );
222 void depthBufferCaptured(
const QImage &depthImage );
225 void rotateCamera(
float diffPitch,
float diffYaw );
226 void updateCameraFromPose();
227 void moveCameraPositionBy(
const QVector3D &posDiff );
261 void onPositionChanged( Qt3DInput::QMouseEvent *mouse );
262 void onWheel( Qt3DInput::QWheelEvent *wheel );
263 void onMousePressed( Qt3DInput::QMouseEvent *mouse );
264 void onMouseReleased( Qt3DInput::QMouseEvent *mouse );
265 void onKeyPressed( Qt3DInput::QKeyEvent *event );
266 void onKeyReleased( Qt3DInput::QKeyEvent *event );
267 void onPickerMousePressed( Qt3DRender::QPickEvent *pick );
268 void applyFlyModeKeyMovements();
271 void onKeyPressedFlyNavigation( Qt3DInput::QKeyEvent *event );
272 void onKeyPressedTerrainNavigation( Qt3DInput::QKeyEvent *event );
273 void onPositionChangedFlyNavigation( Qt3DInput::QMouseEvent *mouse );
274 void onPositionChangedTerrainNavigation( Qt3DInput::QMouseEvent *mouse );
276 void handleTerrainNavigationWheelZoom();
278 double cameraCenterElevation();
284 double sampleDepthBuffer(
const QImage &buffer,
int px,
int py );
288 Qt3DRender::QCamera *mCamera =
nullptr;
292 float mLastPressedHeight = 0;
294 QPointer<QgsTerrainEntity> mTerrainEntity;
301 bool mMousePressed =
false;
302 Qt3DInput::QMouseEvent::Buttons mPressedButton = Qt3DInput::QMouseEvent::Buttons::NoButton;
304 bool mDepthBufferIsReady =
false;
305 QImage mDepthBufferImage;
307 QPoint mMiddleButtonClickPos;
308 bool mRotationCenterCalculated =
false;
309 QVector3D mRotationCenter;
310 double mRotationDistanceFromCenter;
311 double mRotationPitch = 0;
312 double mRotationYaw = 0;
313 std::unique_ptr< Qt3DRender::QCamera > mCameraBeforeRotation;
315 QPoint mDragButtonClickPos;
316 std::unique_ptr< Qt3DRender::QCamera > mCameraBeforeDrag;
317 bool mDragPointCalculated =
false;
318 QVector3D mDragPoint;
321 bool mIsInZoomInState =
false;
322 std::unique_ptr< Qt3DRender::QCamera > mCameraBeforeZoom;
323 bool mZoomPointCalculated =
false;
324 QVector3D mZoomPoint;
327 Qt3DInput::QMouseDevice *mMouseDevice =
nullptr;
328 Qt3DInput::QKeyboardDevice *mKeyboardDevice =
nullptr;
330 Qt3DInput::QMouseHandler *mMouseHandler =
nullptr;
331 Qt3DInput::QKeyboardHandler *mKeyboardHandler =
nullptr;
332 NavigationMode mCameraNavigationMode = NavigationMode::TerrainBasedNavigation;
334 double mCameraMovementSpeed = 5.0;
336 QSet< int > mDepressedKeys;
337 bool mCaptureFpsMouseMovements =
false;
338 bool mIgnoreNextMouseMove =
false;
339 QTimer *mFpsNavTimer =
nullptr;
341 double mCumulatedWheelY = 0;
QgsCameraController::NavigationMode cameraNavigationMode() const
Returns the navigation mode used by the camera controller.
QgsCameraPose cameraPose() const
Returns camera pose.
QRect viewport() const
Returns viewport rectangle.
float pitch() const
Returns pitch angle in degrees (0 = looking from the top, 90 = looking from the side).
Qt3DRender::QCamera * camera() const
Returns camera that is being controlled.
float yaw() const
Returns yaw angle in degrees.
void requestDepthBufferCapture()
Emitted to ask for the depth buffer image.
void navigationModeHotKeyPressed(QgsCameraController::NavigationMode mode)
Emitted when the navigation mode is changed using the hotkey ctrl + ~.
float distance() const
Returns distance of the camera from the point it is looking at.
VerticalAxisInversion
Vertical axis inversion options.
@ WhenDragging
Invert vertical axis movements when dragging in first person modes.
@ Always
Always invert vertical axis movements.
@ Never
Never invert vertical axis movements.
double cameraMovementSpeed() const
Returns the camera movement speed.
void cameraChanged()
Emitted when camera has been updated.
void cameraMovementSpeedChanged(double speed)
Emitted whenever the camera movement speed is changed by the controller.
QgsCameraController::VerticalAxisInversion verticalAxisInversion() const
Returns the vertical axis inversion behavior.
NavigationMode
The navigation mode used by the camera.
@ TerrainBasedNavigation
The default navigation based on the terrain.
void cameraRotationCenterChanged(QVector3D position)
Emitted when the camera rotation center changes.
void viewportChanged()
Emitted when viewport rectangle has been updated.
void setCursorPosition(QPoint point)
Emitted when the mouse cursor position should be moved to the specified point on the map viewport.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)