[Marble-devel] Review Request 110058: Spherical Projection Panning

Paul Nader paul.nader at gmail.com
Mon May 13 21:13:14 UTC 2013



> On April 28, 2013, 2:50 p.m., Bernhard Beschow wrote:
> > src/lib/RenderPlugin.cpp, line 41
> > <http://git.reviewboard.kde.org/r/110058/diff/5/?file=139648#file139648line41>
> >
> >     I think this attribute (and any code depending on it) can be avoided by fixing AbstractFloatItem in just one place. Try to surround paintEvent(...) in AbstractFloatItem::render() with:
> >     
> >     painter->save();
> >     painter->translate( -viewport->pan() );
> >     
> >     paintEvent(...);
> >     
> >     painter->restore();
> 
> Bernhard Beschow wrote:
>     In fact it seems to me that you could remove all QPainter::translate() calls and all code related to LayerInterface/RenderPlugin::stationary() if you adapted all methods in SphericalProjection. Perhaps it's even sufficient to only adapt the projection classes to get everything rendered correctly.
>     
>     One issue I currently see, however, is that the crosshairs don't indicate the center of the map. This results in the map shifting if pan != 0 and the map is zoomed in or out.

"In fact it seems to me that you could remove all QPainter::translate() calls and all code related to LayerInterface/RenderPlugin::stationary() if you adapted all methods in SphericalProjection. Perhaps it's even sufficient to only adapt the projection classes to get everything rendered correctly."

I don't think this is correct as there are render plugins which draw independent of the projection. For example the graticule and APRS plugins draw their own artifacts and hence the painter needs to be translated.

"One issue I currently see, however, is that the crosshairs don't indicate the center of the map. This results in the map shifting if pan != 0 and the map is zoomed in or out."

True. I believe the crosshairs now show the point on the globe closest to the viewer. This would have also been the case before when the globe was centered and it always happened to be the point at the center of the screen. Now as the globe is panned the closest point is no longer the center of the screen. I would like to avoid shifting the map when panning if possible. Any sggestions?


- Paul


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/110058/#review31699
-----------------------------------------------------------


On April 18, 2013, 11:02 p.m., Paul Nader wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/110058/
> -----------------------------------------------------------
> 
> (Updated April 18, 2013, 11:02 p.m.)
> 
> 
> Review request for Marble, Bernhard Beschow and Dennis Nienhüser.
> 
> 
> Description
> -------
> 
> Spherical Projection Panning
> ----------------------------
> 
> This new feature allows users to pan the globe during spherical projection mode. To pan the globe: Shift Key + Mouse Left Button
> 
> No gestures and no Routing Layer, as yet. 
> 
> I am more than happy to help anyone porting existing plugins, etc to use panning.
> 
> Suggestions and improvements are also welcome.
> 
> 1. Introduction
> 
> The rest if this description explains the design of the spherical panning algorithms proposed for the marble application widget.
> 
> Spherical projection panning is the action of translating the globe (or the scene viewpoint) in a plane orthogonal to  
> the line of sight of the viewer. For flat map (equirect projection) or mercator map (mercator projection) the rotation 
> and panning actions are roughly equivalent and hence they remain unchanged.
> 
> 2. Implementation Notes
> 
> There are several areas affected by the spherical panning implementation:
> 
> o Texture Mapping
> o Layers
> o Plugins
> o Input Event Processing
> 
> 2.1 Texture Mapping
> 
> Panning is implemented in the SphericalScanlineTextureMapper class. When panning is started a snapshot of the earth is constructed
> by creating and image 3 times the size of the current viewport. This image is texture mapped and the background is set to transparent.
> The image is then displayed translated appropriately to match the screen coordinates. As panning mouse move events continue to be  
> processed the same image is displayed with the appropriate translation correction. As a consequence there is an initial delay, mostly
> unappreciable, at the start of panning but once it is in progress is is very fast as the SphericalScanlineTextureMapper class is only
> translating and displaying a pre-built image. When rotating a panned globe the texture mapping algorithm also ensures the appropriate
> sections of tiles are rendered taking into account the amount of pan in effect.
> 
> 2.2 Layers
> 
> None of the layers are aware any panning is in effect as it is already taken into account in the texture mapping algorithm. On the other
> hand MapInfoDialog and possibly the Routing layer (TBD) are rendered independent of the globe texture layers and also are required to
> translate their paint artefacts.
> 
> The LayerInterface class has been modified to include a new boolean data member (m_stationary together with a getter and setter) 
> initialised to false so that by default layers remain statically positioned and the LayerManager class has been modified to test whether 
> the layer is stationary or alternatively should be panned. If so the LayerManager translates the painter by the current amount of pan. 
> The layer itself is unaware any panning is taking effect although the viewport display is modified.
>  
> The TextureColorizer remains the only exception mainly because it creates a painter of its own to paint on a separate image. It cannot
> share the main GeoPainter instance because a display device can only have one painter.
> 
> 2.3 Plugins
> 
> Plugins have also been affected similarly. Some plugins require their paint artifacts to be positioned statically in the screen (eg, the
> compass, elevation profile, etc) while others require their paint artifacts to be translated (eg, postal codes, earthquakes, photo, etc).
> 
> The approach used is exactly the same as that taken for layers. The RenderPlugin class has been modified to include a new boolean data
> memeber (m_stationary together with a getter and setter) initialised to false so that by default plugins remain statically positioned.
> The AbstractDataPlugin class has been modified to test whether the plugin is stationary or alternatively should be panned. If so the
> AbstractDataPlugin translates the painter by the current amount of pan.  The plugin itself is unaware any panning is taking effect
> although the viewport display is modified.
> 
> The current list of plugins that are modified to be pannable are:
> 
> PostalCodePlugin
> EarthquakePlugin
> PhotoPlugin
> StarsPlugin
> WikipediaPlugin
> OpenCachingComPlugin
> WeatherPlugin.cpp
> OpenDesktopPlugin.cpp
> 
> 2.4 Input Event Processing
> 
> The MarbleWidgetInputHandler class is responsible for handling most user events such as mouse moves and key presses. MarbleWidgetInputHandler
> has been modified to additionally process mouse move events when the shift key is also pressed and the current widget projection is set
> to Spherical. The same action during Flat and Mercator projections are processed as a rotation request and handled using the current methods.
> 
> When panning commences the input handler records the current position to be used to determine how much panning is in effect. The pan is then
> applied to the MarbleWidget through a new method called pan overloaded to take a point or a pair of screen coordinates. The MarbleWidget then
> applies the pan to the viewport so that it is accessible in all renderable classes.
> 
> Enjoy.
> 
> 
> Diffs
> -----
> 
>   src/QtMainWindow.cpp cc69642 
>   src/lib/AbstractDataPlugin.cpp ce527f9 
>   src/lib/GoToDialog.cpp 57b65de 
>   src/lib/LayerInterface.h 46a20da 
>   src/lib/LayerInterface.cpp c3629de 
>   src/lib/LayerManager.cpp 0df19d2 
>   src/lib/MapInfoDialog.cpp 5219983 
>   src/lib/MarbleModel.h 8753615 
>   src/lib/MarbleModel.cpp 5df138a 
>   src/lib/MarbleWidget.h 9203250 
>   src/lib/MarbleWidget.cpp be1e228 
>   src/lib/MarbleWidgetInputHandler.cpp 1bdba92 
>   src/lib/PopupItem.cpp f9f0c2c 
>   src/lib/Projections/SphericalProjection.cpp cebb73d 
>   src/lib/RenderPlugin.h 90355ed 
>   src/lib/RenderPlugin.cpp b9b95c9 
>   src/lib/ScanlineTextureMapperContext.cpp ff3197b 
>   src/lib/SphericalScanlineTextureMapper.h 8ab69b9 
>   src/lib/SphericalScanlineTextureMapper.cpp 5808705 
>   src/lib/TextureColorizer.cpp f372830 
>   src/lib/VectorMap.cpp cf3dcef 
>   src/lib/ViewportParams.h 6b97f55 
>   src/lib/ViewportParams.cpp f82a8b7 
>   src/lib/layers/VectorMapLayer.cpp f05c88a 
>   src/lib/routing/RoutingInputWidget.cpp cbfc898 
>   src/lib/routing/RoutingLayer.cpp 1f07854 
>   src/plugins/render/aprs/AprsPlugin.cpp 550192f 
>   src/plugins/render/atmosphere/AtmospherePlugin.cpp 492c111 
>   src/plugins/render/earthquake/EarthquakePlugin.cpp 1205521 
>   src/plugins/render/opencachingcom/OpenCachingComModel.cpp ee35912 
>   src/plugins/render/opencachingcom/OpenCachingComPlugin.cpp 576198f 
>   src/plugins/render/opendesktop/OpenDesktopPlugin.cpp b1cef50 
>   src/plugins/render/photo/PhotoPlugin.cpp cdb6243 
>   src/plugins/render/postalcode/PostalCodePlugin.cpp 87feacd 
>   src/plugins/render/stars/StarsPlugin.cpp d8d1a08 
>   src/plugins/render/weather/WeatherPlugin.cpp 4be0c5d 
>   src/plugins/render/wikipedia/WikipediaPlugin.cpp 89cf51e 
> 
> Diff: http://git.reviewboard.kde.org/r/110058/diff/
> 
> 
> Testing
> -------
> 
> Ubuntu 11.40 32-bit / Qt 4.8.1 (marble-qt only)
> 
> 
> File Attachments
> ----------------
> 
> Panned
>   http://git.reviewboard.kde.org/media/uploaded/files/2013/04/16/17._Satellites.png
> 
> 
> Thanks,
> 
> Paul Nader
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/marble-devel/attachments/20130513/c6ad9778/attachment.html>


More information about the Marble-devel mailing list