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

Bernhard Beschow bbeschow at cs.tu-berlin.de
Mon Apr 29 18:27:44 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();

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.


- Bernhard


-----------------------------------------------------------
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/20130429/af4fc836/attachment-0001.html>


More information about the Marble-devel mailing list