16#ifndef QGSCAMERACONTROLLER_H
17#define QGSCAMERACONTROLLER_H
23#include <Qt3DCore/QEntity>
24#include <Qt3DInput/QMouseEvent>
30 class QKeyboardDevice;
31 class QKeyboardHandler;
50class 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 );
172 float distance()
const {
return mCameraPose.distanceFromCenterPoint(); }
179 float pitch()
const {
return mCameraPose.pitchAngle(); }
186 float yaw()
const {
return mCameraPose.headingAngle(); }
189 QDomElement writeXml( QDomDocument &doc )
const;
191 void readXml(
const QDomElement &elem );
194 void zoom(
float factor );
196 void tiltUpAroundViewCenter(
float deltaPitch );
198 void rotateAroundViewCenter(
float deltaYaw );
200 void setCameraHeadingAngle(
float angle );
202 void moveView(
float tx,
float ty );
209 bool willHandleKeyEvent( QKeyEvent *event );
223 void depthBufferCaptured(
const QImage &depthImage );
226 void rotateCamera(
float diffPitch,
float diffYaw );
227 void updateCameraFromPose();
228 void moveCameraPositionBy(
const QVector3D &posDiff );
262 void onPositionChanged( Qt3DInput::QMouseEvent *mouse );
263 void onWheel( Qt3DInput::QWheelEvent *wheel );
264 void onMousePressed( Qt3DInput::QMouseEvent *mouse );
265 void onMouseReleased( Qt3DInput::QMouseEvent *mouse );
266 void onKeyPressed( Qt3DInput::QKeyEvent *event );
267 void onKeyReleased( Qt3DInput::QKeyEvent *event );
268 void onPickerMousePressed( Qt3DRender::QPickEvent *pick );
269 void applyFlyModeKeyMovements();
272 void onKeyPressedFlyNavigation( Qt3DInput::QKeyEvent *event );
273 void onKeyPressedTerrainNavigation( Qt3DInput::QKeyEvent *event );
274 void onPositionChangedFlyNavigation( Qt3DInput::QMouseEvent *mouse );
275 void onPositionChangedTerrainNavigation( Qt3DInput::QMouseEvent *mouse );
277 void handleTerrainNavigationWheelZoom();
283 double sampleDepthBuffer(
const QImage &buffer,
int px,
int py );
285 bool screenPointToWorldPos( QPoint position, Qt3DRender::QCamera *cameraBefore,
double &depth, QVector3D &worldPosition );
289 Qt3DRender::QCamera *mCamera =
nullptr;
293 float mLastPressedHeight = 0;
295 QPointer<QgsTerrainEntity> mTerrainEntity;
302 bool mMousePressed =
false;
303 Qt3DInput::QMouseEvent::Buttons mPressedButton = Qt3DInput::QMouseEvent::Buttons::NoButton;
305 bool mDepthBufferIsReady =
false;
306 QImage mDepthBufferImage;
308 QPoint mMiddleButtonClickPos;
309 bool mRotationCenterCalculated =
false;
310 QVector3D mRotationCenter;
311 double mRotationDistanceFromCenter;
312 double mRotationPitch = 0;
313 double mRotationYaw = 0;
314 std::unique_ptr< Qt3DRender::QCamera > mCameraBeforeRotation;
316 QPoint mDragButtonClickPos;
317 std::unique_ptr< Qt3DRender::QCamera > mCameraBeforeDrag;
318 bool mDragPointCalculated =
false;
319 QVector3D mDragPoint;
322 bool mIsInZoomInState =
false;
323 std::unique_ptr< Qt3DRender::QCamera > mCameraBeforeZoom;
324 bool mZoomPointCalculated =
false;
325 QVector3D mZoomPoint;
328 Qt3DInput::QMouseDevice *mMouseDevice =
nullptr;
329 Qt3DInput::QKeyboardDevice *mKeyboardDevice =
nullptr;
331 Qt3DInput::QMouseHandler *mMouseHandler =
nullptr;
332 Qt3DInput::QKeyboardHandler *mKeyboardHandler =
nullptr;
333 NavigationMode mCameraNavigationMode = NavigationMode::TerrainBasedNavigation;
335 double mCameraMovementSpeed = 5.0;
337 QSet< int > mDepressedKeys;
338 bool mCaptureFpsMouseMovements =
false;
339 bool mIgnoreNextMouseMove =
false;
340 QTimer *mFpsNavTimer =
nullptr;
342 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 navigationModeChanged(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)