fix highdpi mouse pos

This commit is contained in:
2023-02-07 11:14:46 +03:00
parent a2695ae481
commit 9cc870c996
3 changed files with 21 additions and 20 deletions

View File

@@ -93,8 +93,8 @@ void MouseController::mouseReleaseEvent(QMouseEvent * e) {
void MouseController::mousePressEvent(QMouseEvent * e) { void MouseController::mousePressEvent(QMouseEvent * e) {
QPoint cpos = e->pos() * view->devicePixelRatio(); QPoint cpos = e->pos() * view->devicePixelRatio();
downPos = cpos; downPos = cpos;
if (cur_action != RendererService::haNoAction && e->buttons() == Qt::LeftButton) { if (cur_action != RendererService::haNoAction && e->buttons() == Qt::LeftButton) {
return; return;
} }
@@ -103,15 +103,15 @@ void MouseController::mousePressEvent(QMouseEvent * e) {
view->renderer_.mouse_rect = QRect(); view->renderer_.mouse_rect = QRect();
return; return;
} }
if (!QRect(QPoint(), view->size()).contains(cpos)) return; if (!QRect(QPoint(), view->size() * view->devicePixelRatio()).contains(cpos)) return;
lastPos = cpos; lastPos = cpos;
downPos = cpos; downPos = cpos;
emit view->glMousePressEvent(e); emit view->glMousePressEvent(e);
} }
void MouseController::mouseMoveEvent(QMouseEvent * e) { void MouseController::mouseMoveEvent(QMouseEvent * e) {
QPoint cpos = e->pos() * view->devicePixelRatio(); QPoint cpos = e->pos() * view->devicePixelRatio();
if (cur_action != RendererService::haNoAction && (e->buttons() == Qt::LeftButton)) { if (cur_action != RendererService::haNoAction && (e->buttons() == Qt::LeftButton)) {
RendererService & rs(view->renderer_.rend_service); RendererService & rs(view->renderer_.rend_service);
ObjectBaseList objects = view->scene()->selectedObjects(true); ObjectBaseList objects = view->scene()->selectedObjects(true);
@@ -145,7 +145,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
mouse_vector[1] *= -1.; mouse_vector[1] *= -1.;
if (cur_action == RendererService::haMove) { if (cur_action == RendererService::haMove) {
double len_scl = 1. / QVector3D(axe_screen.x(), axe_screen.y(), 1.E-6).length(); double len_scl = 1. / QVector3D(axe_screen.x(), axe_screen.y(), 1.E-6).length();
mouse_vector /= QVector3D(view->pixelWidth(), view->pixelHeight(), 1); mouse_vector /= QVector3D(view->pixelWidth(), view->pixelHeight(), 1);
mouse_vector *= -center_screen.z() * len_scl; mouse_vector *= -center_screen.z() * len_scl;
axe_vector *= QVector3D::dotProduct(axe_screen, mouse_vector); axe_vector *= QVector3D::dotProduct(axe_screen, mouse_vector);
QMatrix4x4 pmat; QMatrix4x4 pmat;
@@ -188,9 +188,10 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
axe_vector[a] = 1.; axe_vector[a] = 1.;
foreach(ObjectBase * o, objects) foreach(ObjectBase * o, objects)
o->scale(QVector3D(1, 1, 1) + (axe_vector * sc)); o->scale(QVector3D(1, 1, 1) + (axe_vector * sc));
QCursor::setPos(view->mapToGlobal(downPos)); QCursor::setPos(view->mapToGlobal(downPos / view->devicePixelRatio()));
} else } else {
lastPos = cpos; lastPos = cpos;
}
emit view->objectsPositionChanged(); emit view->objectsPositionChanged();
return; return;
} }
@@ -205,16 +206,16 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
} }
return; return;
} }
QRect g_rect(QPoint(), view->size()); QRect g_rect(QPoint(), view->size() * view->devicePixelRatio());
if (mouseRotate_) { if (mouseRotate_) {
float dx = cpos.x() - lastPos.x(); float dx = cpos.x() - lastPos.x();
float dy = cpos.y() - lastPos.y(); float dy = cpos.y() - lastPos.y();
if (e->buttons().testFlag(QT_MID_BUTTON)) { if (e->buttons().testFlag(QT_MID_BUTTON)) {
if (cameraOrbit_) { if (cameraOrbit_) {
view->camera()->orbitZ(dx / 4.f); view->camera()->orbitZ(dx / 4.f);
view->camera()->orbitXY(dy / 4.f); view->camera()->orbitXY(dy / 4.f);
} else { } else {
view->camera()->rotateZ(-dx / 4.f); view->camera()->rotateZ(-dx / 4.f);
view->camera()->rotateX(-dy / 4.f); view->camera()->rotateX(-dy / 4.f);
} }
emit view->cameraPosChanged(view->camera()->pos()); emit view->cameraPosChanged(view->camera()->pos());
@@ -225,8 +226,8 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
emit view->cameraPosChanged(view->camera()->pos()); emit view->cameraPosChanged(view->camera()->pos());
} }
} }
if (customMouseMove_) emit view->customMouseMoveEvent(cpos, lastPos, e->buttons()); if (customMouseMove_) emit view->customMouseMoveEvent(cpos, lastPos, e->buttons());
lastPos = cpos; lastPos = cpos;
if (e->buttons() == 0) { if (e->buttons() == 0) {
cur_handle = QFlags<RendererService::HandleMesh>(); cur_handle = QFlags<RendererService::HandleMesh>();
cur_action = RendererService::haNoAction; cur_action = RendererService::haNoAction;
@@ -263,8 +264,8 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
return; return;
} }
lastPos = g_rect.center(); lastPos = g_rect.center();
int dx = cpos.x() - lastPos.x(); int dx = cpos.x() - lastPos.x();
int dy = cpos.y() - lastPos.y(); int dy = cpos.y() - lastPos.y();
emit view->glMouseMoveEvent(new QMouseEvent(QEvent::MouseMove, QPoint(dx, dy), e->button(), e->buttons(), e->modifiers())); emit view->glMouseMoveEvent(new QMouseEvent(QEvent::MouseMove, QPoint(dx, dy), e->button(), e->buttons(), e->modifiers()));
return; return;
} }

View File

@@ -150,7 +150,7 @@ void QGLView::timerEvent(QTimerEvent *) {
void QGLView::render() { void QGLView::render() {
resizeGL(pixelWidth(), pixelHeight()); resizeGL(pixelWidth(), pixelHeight());
emit glBeginPaint(); emit glBeginPaint();
renderer_.mouse_pos = mapFromGlobal(QCursor::pos()); renderer_.mouse_pos = mapFromGlobal(QCursor::pos()) * devicePixelRatio();
renderer_.renderScene(); renderer_.renderScene();
emit glEndPaint(); emit glEndPaint();
fps_tm = time.elapsed(); fps_tm = time.elapsed();

View File

@@ -461,7 +461,7 @@ void Renderer::renderScene() {
rend_selection.drawSelection(fbo_out, cur_write_plane); rend_selection.drawSelection(fbo_out, cur_write_plane);
rend_service.renderService(); rend_service.renderService();
} else { } else {
fbo_out.blit(cur_write_plane, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size())); fbo_out.blit(cur_write_plane, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size() * view->devicePixelRatio()));
} }
phase.end(); phase.end();