From 4a9a7426de0f2a307fe035b04493e43eb7becb80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20R=C3=B6hling?= Date: Fri, 20 Jan 2017 16:33:02 +0100 Subject: [PATCH] Correctly scale the render panel on high resolution displays --- src/rviz/ogre_helpers/render_system.cpp | 3 ++- src/rviz/ogre_helpers/render_system.h | 2 +- src/rviz/ogre_helpers/render_widget.cpp | 9 ++++++++- src/rviz/visualization_manager.cpp | 16 +++++++++++++++- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/rviz/ogre_helpers/render_system.cpp b/src/rviz/ogre_helpers/render_system.cpp index 7b6b8177f8..c985bdd142 100644 --- a/src/rviz/ogre_helpers/render_system.cpp +++ b/src/rviz/ogre_helpers/render_system.cpp @@ -342,7 +342,7 @@ int checkBadDrawable( Display* display, XErrorEvent* error ) } #endif // Q_WS_X11 -Ogre::RenderWindow* RenderSystem::makeRenderWindow( intptr_t window_id, unsigned int width, unsigned int height ) +Ogre::RenderWindow* RenderSystem::makeRenderWindow( intptr_t window_id, unsigned int width, unsigned int height, double pixel_ratio ) { static int windowCounter = 0; // Every RenderWindow needs a unique name, oy. @@ -372,6 +372,7 @@ Ogre::RenderWindow* RenderSystem::makeRenderWindow( intptr_t window_id, unsigned #else params["macAPI"] = "carbon"; #endif + params["contentScalingFactor"] = std::to_string(pixel_ratio); std::ostringstream stream; stream << "OgreWindow(" << windowCounter++ << ")"; diff --git a/src/rviz/ogre_helpers/render_system.h b/src/rviz/ogre_helpers/render_system.h index 7eb32205c9..e4f1d7288e 100644 --- a/src/rviz/ogre_helpers/render_system.h +++ b/src/rviz/ogre_helpers/render_system.h @@ -46,7 +46,7 @@ class RenderSystem public: static RenderSystem* get(); - Ogre::RenderWindow* makeRenderWindow( intptr_t window_id, unsigned int width, unsigned int height ); + Ogre::RenderWindow* makeRenderWindow( intptr_t window_id, unsigned int width, unsigned int height, double pixel_ratio = 1.0 ); Ogre::Root* root() { return ogre_root_; } diff --git a/src/rviz/ogre_helpers/render_widget.cpp b/src/rviz/ogre_helpers/render_widget.cpp index e1513a2618..e0cae4284c 100644 --- a/src/rviz/ogre_helpers/render_widget.cpp +++ b/src/rviz/ogre_helpers/render_widget.cpp @@ -38,6 +38,9 @@ #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) +#include +#endif namespace rviz { @@ -83,8 +86,12 @@ RenderWidget::RenderWidget( RenderSystem* render_system, QWidget *parent ) #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QApplication::syncX(); + double pixel_ratio = 1.0; +#else + QWindow* window = windowHandle(); + double pixel_ratio = window ? window->devicePixelRatio() : 1.0; #endif - render_window_ = render_system_->makeRenderWindow( win_id, width(), height() ); + render_window_ = render_system_->makeRenderWindow( win_id, width(), height(), pixel_ratio ); } RenderWidget::~RenderWidget() diff --git a/src/rviz/visualization_manager.cpp b/src/rviz/visualization_manager.cpp index 84f857fa2f..9367b08614 100644 --- a/src/rviz/visualization_manager.cpp +++ b/src/rviz/visualization_manager.cpp @@ -33,6 +33,9 @@ #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) +#include +#endif #include @@ -149,7 +152,7 @@ VisualizationManager::VisualizationManager( RenderPanel* render_panel, WindowMan display_property_tree_model_ = new PropertyTreeModel( root_display_group_ ); display_property_tree_model_->setDragDropClass( "display" ); connect( display_property_tree_model_, SIGNAL( configChanged() ), this, SIGNAL( configChanged() )); - + tool_manager_ = new ToolManager( this ); connect( tool_manager_, SIGNAL( configChanged() ), this, SIGNAL( configChanged() )); connect( tool_manager_, SIGNAL( toolChanged( Tool* ) ), this, SLOT( onToolChanged( Tool* ) )); @@ -524,6 +527,17 @@ void VisualizationManager::handleMouseEvent( const ViewportMouseEvent& vme ) if( current_tool ) { ViewportMouseEvent _vme = vme; +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + QWindow* window = vme.panel->windowHandle(); + if (window) + { + double pixel_ratio = window->devicePixelRatio(); + _vme.x = static_cast(pixel_ratio * _vme.x); + _vme.y = static_cast(pixel_ratio * _vme.y); + _vme.last_x = static_cast(pixel_ratio * _vme.last_x); + _vme.last_y = static_cast(pixel_ratio * _vme.last_y); + } +#endif flags = current_tool->processMouseEvent( _vme ); vme.panel->setCursor( current_tool->getCursor() ); }