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

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


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

(Updated May 13, 2013, 9:38 p.m.)


Review request for Marble, Bernhard Beschow and Dennis Nienhüser.


Description (updated)
-------

Spherical Projection Panning
----------------------------

This new feature allows users to pan the globe during spherical projection mode. The globe can be panned several ways:

- Shift Key + Mouse Left Button
- Shift Key + Keyboard up / down / left / right arrows
- Shift Key + Arrow disk widget arrows
- Programmatically using the MarbleWidget::pan methods

No gestures for panning yet. 

Suggestions and improvements are 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 the globe the texture mapping algorithm
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 50a4676 
  src/lib/AbstractDataPlugin.cpp 347f4b1 
  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 44a5f61 
  src/lib/MarbleModel.cpp a84ccae 
  src/lib/MarbleWidget.h 9203250 
  src/lib/MarbleWidget.cpp 3b5e844 
  src/lib/MarbleWidgetInputHandler.cpp 1bdba92 
  src/lib/PopupItem.cpp 20391fc 
  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 85ee814 
  src/lib/SphericalScanlineTextureMapper.cpp 0bfe09c 
  src/lib/TextureColorizer.cpp 5319c21 
  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 28db48d 
  src/lib/routing/RoutingLayer.cpp 125990d 
  src/plugins/render/aprs/AprsPlugin.cpp 550192f 
  src/plugins/render/atmosphere/AtmospherePlugin.cpp 492c111 
  src/plugins/render/earthquake/EarthquakePlugin.cpp 1205521 
  src/plugins/render/navigation/ArrowDiscWidget.h 77e5cdd 
  src/plugins/render/navigation/ArrowDiscWidget.cpp ee81025 
  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/ce0f7dd1/attachment.html>


More information about the Marble-devel mailing list