121 Commits

Author SHA1 Message Date
Emux
bf6b325ce8 0.13.0 2020-01-12 15:31:31 +02:00
Emux
b43dfc53e4 Gradle: declare UTF-8 encoding for Java compile 2020-01-02 15:06:47 +02:00
Emux
883ed23272 Merge pull request #759 from mapsforge/themes
Render themes: avoid patterns and textures because of old GPU issues
2019-12-25 13:58:17 +02:00
Emux
0a0c2b3ce0 Render themes: avoid patterns and textures because of old GPU issues 2019-12-25 13:36:42 +02:00
Emux
c783255b97 Mapsforge: reduce points on-the-fly while reading from map files (except lines) #757 2019-12-17 17:54:27 +02:00
Emux
c689ad9e67 Merge pull request #758 from mapsforge/cap
Fix stroke cap line ending
2019-12-15 15:40:48 +02:00
Emux
0fabe4c738 Update changelog 2019-12-15 15:39:49 +02:00
Emux
d4a95dad19 Fix stroke cap line ending 2019-12-15 15:30:02 +02:00
Emux
4405b6235a AwtPaint: use round as default cap / join, like Mapsforge #92 2019-12-15 15:14:34 +02:00
Emux
766b0d9914 Mapsforge: reduce points on-the-fly while reading from map files (improvements) #757 2019-12-14 15:29:26 +02:00
Emux
412cacd1c2 Merge pull request #757 from mapsforge/mapsforge
Mapsforge: reduce points on-the-fly while reading from map files
2019-12-12 12:55:49 +02:00
Emux
299592d352 Update changelog 2019-12-12 12:53:30 +02:00
Emux
d512731d06 Mapsforge: reduce points on-the-fly while reading from map files 2019-12-12 12:26:19 +02:00
Emux
b2a8d3040a Render themes: area outlines as separate lines #121 2019-12-11 15:00:12 +02:00
Emux
892ea92580 Render themes: revert tessellation in water areas except sea #224 2019-12-11 12:37:03 +02:00
Emux
f7acfd9017 Samples improvements 2019-12-10 13:26:31 +02:00
Emux
701ac43746 Update Mapsforge-Maps.md 2019-12-09 14:58:18 +02:00
Emux
b926310296 Update Android Gradle plugin (#755) 2019-12-07 16:46:06 +02:00
Carlos Alberto Martínez Gadea
49d1e7bafc ItemizedLayer: Added a check that prevents Gestures from being processed if the Layer is not enabled (#754) 2019-12-04 11:18:08 +02:00
Emux
6f697ed6f8 Update changelog 2019-12-02 11:23:39 +02:00
Justus Schmidt
cdcae29ae1 Mapsforge: Move tileprojection to convert E6 int directly to tile coordinates (#752) 2019-12-02 11:10:01 +02:00
Emux
a13c4a3793 Merge pull request #753 from mapsforge/bitmap
AndroidGraphics: drawable to bitmap for Android >= 9
2019-11-30 15:43:19 +02:00
Emux
031a3bfa00 Android samples: simplify bitmap reading 2019-11-30 15:24:27 +02:00
Emux
7122e1fbc5 AndroidGraphics: drawable to bitmap for Android >= 9 2019-11-30 15:17:14 +02:00
Emux
6ed00d9a94 Style.Builder: make strokeColor public 2019-11-20 20:23:26 +02:00
Emux
327d6f1466 Animator: smooth scaling 2019-11-12 17:54:27 +02:00
Emux
17a135813b Update Android Gradle plugin 2019-11-08 10:02:55 +02:00
Emux
0dd82cb68f MapScaleBar: fix scaling 2019-11-05 15:03:18 +02:00
Emux
ae04fa83f6 MapScaleBar: minor code improvements 2019-11-04 18:26:34 +02:00
Emux
4bfcdadb76 MapScaleBar: minor optimization 2019-11-04 13:41:05 +02:00
Emux
fa5a72f20d MercatorProjection: minor code improvements 2019-11-04 13:39:45 +02:00
Emux
d81eb3d706 LocationRenderer: keep the position for which the overlay is compiled 2019-10-29 10:00:40 +02:00
Emux
97332e3e73 Merge pull request #750 from mapsforge/location
Location texture renderer: rewrite and optimize
2019-10-25 11:50:25 +03:00
Emux
e4a4857eb8 Update changelog 2019-10-25 11:50:03 +03:00
Emux
80018de754 Location texture renderer: rewrite and optimize 2019-10-25 11:43:51 +03:00
Emux
01bb7ca074 Merge pull request #749 from mapsforge/opengl
Android: OpenGL ES 2.0 default for performance / stability
2019-10-25 11:17:43 +03:00
Emux
a8f5eee505 Update changelog 2019-10-25 11:16:37 +03:00
Emux
644cf9dcb6 Android: OpenGL ES 2.0 default for performance / stability 2019-10-25 11:03:33 +03:00
Emux
cb0109ba42 Samples: use Mapsforge release version 2019-10-23 19:04:42 +03:00
Emux
2fa5afec11 Layers: make updateLayers public 2019-10-23 18:59:45 +03:00
Emux
69ea1e414a Location shader improvements 2019-10-22 18:21:43 +03:00
Emux
4866abe38e Merge pull request #748 from mapsforge/location
Location renderers: allow fixed center position
2019-10-18 14:12:33 +03:00
Emux
4c10d5848b Location renderers: allow fixed center position 2019-10-17 15:00:53 +03:00
Emux
faed3d05a5 VectorLayer: hide non usable add(Geometry, Style) method 2019-10-17 11:10:26 +03:00
Emux
88a9a9ee7f Polygon labels: use centroid position if available #734 2019-10-04 18:24:14 +03:00
Emux
3915e3343d Merge pull request #745 from Gustl22/s3db_profile
S3DB: shape profiles as constants
2019-10-04 10:10:36 +03:00
Gustl22
b22c023f1a S3DB: shape profiles as constants 2019-10-03 16:48:55 +02:00
Emux
5de7c9ec38 Update Android Gradle plugin 2019-10-03 09:39:10 +03:00
Gustl22
14c485914c S3DB: roof shape profiles (#744) 2019-10-03 09:32:57 +03:00
Emux
c20922b5f5 Tile decoders refactoring 2019-10-01 18:48:10 +03:00
Emux
1294ff9fea Symbols on lines doc improvements #743 2019-10-01 09:41:58 +03:00
Emux
992d9c8e66 Samples improvements 2019-09-30 20:03:15 +03:00
Emux
948449b3ec Fix Android samples on old Android 2019-09-29 15:09:46 +03:00
Emux
0c1c06c1bb Allow threaded system initialization 2019-09-28 22:36:17 +03:00
Emux
7ad3f4a0b1 Merge pull request #743 from mapsforge/symbol
Render themes - symbols on lines: add billboard, rotate options
2019-09-28 19:45:05 +03:00
Emux
c5836adc17 Update changelog 2019-09-28 19:44:29 +03:00
Emux
107a429517 Render themes: use symbols on lines for oneways 2019-09-28 19:38:54 +03:00
Emux
2cb0a80c47 LineStyle, SymbolStyle: use scale on repeat values 2019-09-28 19:38:22 +03:00
Emux
db9f83120a Render themes - symbols on lines: add billboard, rotate options 2019-09-28 18:50:20 +03:00
Emux
5facdb9888 XmlThemeBuilder: disable mipmap for sharper rendering 2019-09-28 18:29:47 +03:00
Emux
3f3caa1912 Update changelog 2019-09-23 19:39:33 +03:00
Emux
03b9f224b2 Render themes: improve nature park & reserve rendering 2019-09-23 19:17:52 +03:00
Emux
c013465d49 Render themes: improve nature reserve rendering 2019-09-23 18:39:52 +03:00
Emux
c91833519e Update dependencies 2019-09-18 21:11:15 +03:00
Emux
055cd54beb 0.12.0 2019-09-17 10:11:09 +03:00
Emux
3eaad42903 Update changelog 2019-09-14 20:13:49 +03:00
Emux
6ab98419df Update documentation 2019-09-09 13:12:22 +03:00
Konstantinos Tzounopoulos
a9e18a2add MBTiles vector tile source (#740)
Support offline vector maps (MBTiles, MVT, gzipped pbf)
2019-09-09 12:47:24 +03:00
Emux
83aed13683 Scale bar: allow extend unit adapters 2019-08-27 15:00:26 +03:00
Emux
5779d10632 Update Gradle 2019-08-21 12:51:32 +03:00
Emux
85e818d788 Merge pull request #739 from marq24/just_docupdate
Application: added GPSLogger II
2019-08-12 17:22:35 +03:00
Matthias Marquardt
cc1d4cf6d9 added GPSLogger II (available since 12.08.2019 with VTM) 2019-08-12 15:25:05 +02:00
Emux
0404effca3 Update Android build tools 2019-08-08 12:22:39 +03:00
Emux
eef1a8c779 ViewController: make syncViewport public 2019-08-07 10:59:29 +03:00
Emux
527fc3d42d Update changelog 2019-08-06 18:25:22 +03:00
Emux
53b262f190 Merge pull request #737 from mapsforge/bg
Render themes: text background color (highway shields)
2019-08-06 18:22:12 +03:00
Emux
dcb7b0d10c Render themes: text background color (highway shields) 2019-08-06 18:17:37 +03:00
Emux
e6137163b9 Update samples 2019-08-02 12:35:07 +03:00
Emux
2cf9a4a472 Update changelog 2019-08-02 11:17:31 +03:00
marq24
55d8797f37 Create centroids based on non clipped ways (#734)
- introduced a new member to the MapElement to store the pre-calculated centroid of the way (none clipped)
- auto create element.centroidPosition based on all (none clipped) points of a osm-way
- skipping rendering of centered symbols, if OFF screen
- introduced Parameter to enable/disable the feature
2019-08-02 11:15:53 +03:00
Emux
653c6489b9 Update ISSUE_TEMPLATE.md 2019-08-02 11:11:40 +03:00
Emux
c19e06b718 Update ISSUE_TEMPLATE.md 2019-08-01 20:31:43 +03:00
Emux
5de4c6b7ab XmlThemeBuilder: check texture load result for line symbols 2019-07-31 21:49:45 +03:00
Emux
900448f8d3 MapElement: revert clear(), #735 2019-07-31 13:57:06 +03:00
Emux
4be42dbc0f MapElement: fix clear() method, #735 2019-07-31 13:34:01 +03:00
Emux
72ba3d6429 MapDatabase: clean label position, fix #735 2019-07-31 12:48:04 +03:00
Emux
f5815203c4 Disable 'optimal' placement of labels or symbols on polygons 2019-07-31 10:50:20 +03:00
Emux
0c050c7405 libGDX 1.9.10, fix #731 2019-07-25 13:02:59 +03:00
Emux
71bf1390f6 Update Android Gradle plugin 2019-07-10 20:20:28 +03:00
Murray Hughes
368cf1ff4a XmlThemeBuilder: fix texture loaded from style patterns (#729) 2019-06-24 20:42:23 +03:00
Emux
c526599e20 Android 10 targetSdkVersion with runtime permissions, #728 2019-06-17 11:55:27 +03:00
Emux
fcf7272f2e Android 10 compatibility, fix #728 2019-06-16 21:03:37 +03:00
Emux
cf2bdb251b LocationRenderer: more public members 2019-06-06 09:46:53 +03:00
Izumi Kawashima
551c0231a0 R-tree k-nearest neighbors search improvements (#727) 2019-05-19 14:57:47 +03:00
Emux
70741d8f5b Update Gradle Android plugin 2019-05-17 20:16:10 +03:00
Emux
9209afba01 Update Changelog.md 2019-05-17 19:51:36 +03:00
Gustl22
9e81473d36 Improve Gradle Android versioning for sub-modules (#726) 2019-05-17 19:47:55 +03:00
Izumi Kawashima
ffeaf1b81c k-nearest neighbors search in R-tree (#725) 2019-05-17 18:55:38 +03:00
Emux
efab21f4f2 Merge pull request #724 from Gustl22/shader_improvements
Adapt / refactor shader uniforms and attributes
2019-05-17 17:56:02 +03:00
Gustl22
a6ce05034a Adapt / refactor shader uniforms and attributes 2019-05-16 08:19:09 +02:00
Emux
634d67a206 Fix marker touch events, fix #723 2019-05-13 18:35:13 +03:00
Gustl22
30ae0fb48f Javadoc improvements 2019-04-26 11:44:43 +03:00
Gustl22
5740290a9b Map tilt improvements (#718) 2019-04-26 11:44:43 +03:00
Emux
149d5d9057 Update desktop.md 2019-04-22 11:09:58 +03:00
Emux
fe2d806d73 Update docs 2019-04-22 10:59:39 +03:00
Emux
63ccf0dcfa vtm-desktop-lwjgl: revert package #259 2019-04-22 10:25:04 +03:00
Gustl22
5f1c3c3186 Desktop LWJGL3 backend (#717) 2019-04-22 10:19:03 +03:00
Emux
b98505c815 Update docs 2019-04-20 14:48:31 +03:00
Gustl22
5979161611 vtm-desktop: decouple libGDX LWJGL backend (#714) 2019-04-20 14:34:51 +03:00
Gustl22
d6e55edd8e CircleBucket: enable POINT_SPRITE on desktop (#716) 2019-04-20 14:30:27 +03:00
Gustl22
431eadaa87 RenderBuckets: constant TILE_FILL_VERTICES (#715) 2019-04-20 14:21:45 +03:00
Emux
df82ebfaa6 Buildings translucency does not work on macOS #61 2019-04-19 10:54:03 +03:00
Emux
b5ee7c1b46 Update Gradle 2019-04-18 20:29:50 +03:00
Emux
54b7884fa3 0.11.1 2019-04-12 19:45:34 +03:00
Emux
e5bc7c7564 OpenGL ES 3.0 is supported with Android 4.3 (API level 18) and higher, fix #713 2019-04-12 11:29:48 +03:00
Emux
cf49591d4f Update changelog 2019-04-10 12:49:35 +03:00
Andrea Antonello
71f94f3f79 MBTiles raster tile source (#708) 2019-04-10 12:49:35 +03:00
Gustl22
db6be82ce2 S3DBUtils: adjust coordinate system (RHS to LHS) (#710) 2019-04-10 12:46:15 +03:00
Gustl22
ba65786b5a GeometryUtils improvements (#709) 2019-04-10 12:41:50 +03:00
Emux
036d63c9dd Update changelog 2019-04-02 20:11:44 +03:00
Emux
07e86d24f6 OpenMapTilesMvtTileSource: update URL 2019-04-02 20:10:48 +03:00
196 changed files with 4803 additions and 2323 deletions

View File

@@ -4,8 +4,8 @@ jdk:
- openjdk8
env:
global:
- ANDROID=28
- ANDROID_BUILD_TOOLS=28.0.3
- ANDROID=29
- ANDROID_BUILD_TOOLS=29.0.2
- GRADLE_OPTS="-Xmx2048m"
- secure: sW674wuFZOuoX7jHQHDbX3j8NxL8JxR07cyq+CrrqJ537dU9lxWQmMBRUpOb+p/q7sQ74PUtiKJkmFgKCSJSAKY+nr6GJ8P/q6u5TUKbmUWODSn8znehX2zualfvFwpF4PILok/wUzXBQE62jn4lUua7cMdsHRMNHbLmKqBoVL0meObDDjsaJ/RCbOPuruy3FmgvXPp0+Y4zl1GsklDSyjFzg4LBzjAk9Ryvh1O4zvJBkkyfCgurLKCnOKIPy3v5fPMS9oDfO1aarAVGoZZe416pvTW4hb8cdB6kn9XWYDob4NDFX/sP5k7XIhd/NAIn9LrKFg0sLtATaKLX+BcasF1CgDR/u6+SEeQd5QaRF7Go2Nq5Ltuu4OIFONI2qhEeVDDK6Otf2WSWj9KPno2GHuumBfbg4ypWoJgmZrMXk8JeVV/OP/0jIQz3p/7yfF21X1XBEqYaVHPAMKdEYYkCSa46KfACyOt6LfnkuCHtoTOpFo7sq0omIA2HOtpIx1u3vMBUyAbQqT6cokkKB1b6gNTFwhHc+8ybfLFPljJB8cWshI+V/b06S6fekRmvTNxvDykWNsdlkENBYqc9hMfjcT4hO4K+76SWN62mimQYODvFyfTVMC7WkQ3k/XEnmqUPV5XkbaILbS1d/tA57N148FiJ5/QXtI6Y94imubYyVqU=
- secure: AdKSZKA4gMuKXI4X4dQNJqcMv5OmPIHdN8fpy55Y9yoOQPQHZE3Zwc4QDWBh20q298jyEC854tVTPTysdZ7h+2s2FhsprYv1Bt/QNzKIrLpeIMj2quuVGMbdPuk08y55gost94KwVLJv0sIDpRlB/PEQkA7Mg/UDsT9zR8E1Ms5x+ul2C8e1ag0zzNl1wVnT5jY8WCp74uA/XXCcJl/80qT1stUERazCKwbKNo007hi7rdm4HA7YGevORq8e2r67je+WIBZUAwrHT0Zjuo4ibwUii4LdwvjuN3w0Z6e9Wf4x5bBqGgnih0T31uom2yPjNx+U/c2AWI+Nxfy/SEF2U+9bjBEZ3ZhI7F1B9ofXo2mhvvsVDiUrymMBbG2V64C9kAzeUh7xIBTqIrbdtpAEBV9FlLAtF2swVTwtCgZgcVTOt3RKXCi3X3nk3cuH7PAorFa/QGfT4xxVu2011FVAt2Rm7SD0ZWztZTSTz/4Nt/egtGBOJfrCc7oLEygLzDmLqsqCwCROITVQjWLjrtqDyLteaNiSXeNIQMKun3izApbXnHmXB+FV3R3EZocboqk3v5bmPTahnG6Ghc2zknWyyxSx+O9qIfOpHUL8JMJiT82lUQUeibtCn7DCE8wVQ/gYC5i+a+KO/d3NemSzIFlZ8aoUiEPYq18dYlsDXeLXwF0=

View File

@@ -8,7 +8,7 @@
VTM (Vector Tile Map) was developed within the [OpenScienceMap](https://github.com/opensciencemap) project.
**This fork continues VTM development and provides compatibility with latest [Mapsforge](https://github.com/mapsforge/mapsforge).**
**This fork continues VTM development and provides compatibility with [Mapsforge](https://github.com/mapsforge/mapsforge).**
See the **[integration guide](docs/Integration.md)** and [changelog](docs/Changelog.md). And read through [how to contribute](docs/CONTRIBUTING.md) guidelines.
@@ -21,6 +21,7 @@ If you have any questions or problems, don't hesitate to ask our public [forum](
- Support for multiple tile sources:
- OpenScienceMap vector tiles
- Mapsforge vector maps
- MBTiles vector & raster maps
- Mapbox vector tiles (e.g. Mapilion, Mapzen, Nextzen, OpenMapTiles)
- GeoJSON vector tiles (e.g. Mapzen, Nextzen)
- Raster tiles: any quadtree-scheme tiles as texture
@@ -37,6 +38,8 @@ If you have any questions or problems, don't hesitate to ask our public [forum](
- **vtm-gdx** common libGDX backend
- **vtm-android-gdx** Android libGDX backend
- **vtm-desktop** Desktop libGDX backend
- **vtm-desktop-lwjgl** Desktop LWJGL backend
- **vtm-desktop-lwjgl3** Desktop LWJGL 3 backend
- **vtm-playground** Desktop examples
- **vtm-ios** iOS libGDX backend
- **vtm-ios-example** iOS examples

View File

@@ -4,7 +4,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
}
}
@@ -14,10 +14,10 @@ allprojects {
version = 'master-SNAPSHOT'
ext.isReleaseVersion = !version.endsWith("SNAPSHOT")
ext.androidBuildVersionTools = "28.0.3"
ext.gdxVersion = "1.9.9"
ext.gwtVersion = "2.8.0"
ext.slf4jVersion = "1.7.25"
ext.androidBuildVersionTools = "29.0.2"
ext.gdxVersion = "1.9.10"
ext.gwtVersion = "2.8.2"
ext.slf4jVersion = "1.7.28"
if (JavaVersion.current().isJava8Compatible()) {
tasks.withType(Javadoc) {
@@ -28,12 +28,12 @@ allprojects {
}
}
static def androidCompileSdk() { return 28 }
static def androidCompileSdk() { return 29 }
// 14 for Support Library, 16 for sqlite-android
static def androidMinSdk() { return 16 }
static def androidTargetSdk() { return 22 }
static def androidTargetSdk() { return 29 }
static def versionCode() { return 1 }
@@ -44,12 +44,12 @@ subprojects {
google()
maven { url 'https://repo.boundlessgeo.com/main/' }
jcenter()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url 'https://jitpack.io' }
}
tasks.withType(JavaCompile) {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
options.encoding = 'UTF-8'
}
}

View File

@@ -6,6 +6,7 @@
| [Cachebox 3.0](https://github.com/Longri/cachebox3.0) | Geocaching application | Apache 2.0/Free | Android, Desktop, iOS | Open |
| [Cruiser](http://wiki.openstreetmap.org/wiki/Cruiser) | Map and navigation application | Proprietary/Free | Android, Desktop | Closed |
| [GCDroid](https://play.google.com/store/apps/details?id=com.gcdroid) | Geocaching App | Proprietary/Free and Commercial | Android | Closed |
| [GPSLogger II](https://play.google.com/store/apps/details?id=com.emacberry.gpslogger) | Map and navigation, Fitness & Cycling application | Proprietary/Free | Android | Closed |
| [Hunt Cyprus](https://play.google.com/store/apps/developer?id=Talent+S.A.) | Map and navigation application for hunters | Proprietary/Free and Commercial | Android | Closed |
| [Kurviger](https://kurviger.de/en) | Route planner specialized on motorcyclists | Proprietary/Free and Commercial | Android | Closed |
| [MapTrek](http://maptrek.mobi) | Application for outdoor activities | GPL3/Free and Commercial | Android | Open |

View File

@@ -1,5 +1,44 @@
# Changelog
## Version 0.13.0 (2020-01-12)
- Render themes: symbols on lines with billboard / rotation [#743](https://github.com/mapsforge/vtm/pull/743)
- Location texture renderer: rewrite and optimize [#750](https://github.com/mapsforge/vtm/pull/750)
- Fix stroke cap line ending [#758](https://github.com/mapsforge/vtm/pull/758)
- Mapsforge: fix ways precision loss [#752](https://github.com/mapsforge/vtm/pull/752)
- Mapsforge: additional simplification [#757](https://github.com/mapsforge/vtm/pull/757)
- `Parameters.SIMPLIFICATION_TOLERANCE`
- Android: OpenGL ES 2.0 default for performance / stability [#749](https://github.com/mapsforge/vtm/pull/749)
- `MapView.OPENGL_VERSION`
- Android: threaded system initialization
- `Parameters.THREADED_INIT`
- Many other minor improvements and bug fixes
- [Solved issues](https://github.com/mapsforge/vtm/issues?q=is%3Aclosed+milestone%3A0.13.0)
## Version 0.12.0 (2019-09-17)
- MBTiles vector tile source (Android) [#740](https://github.com/mapsforge/vtm/pull/740)
- vtm-android-mvt module
- Render themes: text background color [#737](https://github.com/mapsforge/vtm/pull/737)
- vtm-desktop-lwjgl module [#714](https://github.com/mapsforge/vtm/pull/714)
- vtm-desktop-lwjgl3 module [#717](https://github.com/mapsforge/vtm/pull/717)
- Fix marker touch events [#723](https://github.com/mapsforge/vtm/issues/723)
- Calculation of centroids for all polygons [#734](https://github.com/mapsforge/vtm/pull/734)
- `Parameters.POLY_CENTROID`
- Disable optimal placement of labels or symbols on polygons
- `Parameters.POLY_LABEL`
- Android 10 compatibility [#728](https://github.com/mapsforge/vtm/issues/728)
- libGDX 1.9.10 [#731](https://github.com/mapsforge/vtm/issues/731)
- Many other minor improvements and bug fixes
- [Solved issues](https://github.com/mapsforge/vtm/issues?q=is%3Aclosed+milestone%3A0.12.0)
## Version 0.11.1 (2019-04-12)
- MBTiles raster tile source (Android) [#708](https://github.com/mapsforge/vtm/pull/708)
- Fix Android 4.2 crash [#713](https://github.com/mapsforge/vtm/issues/713)
- Many other minor improvements and bug fixes
- [Solved issues](https://github.com/mapsforge/vtm/issues?q=is%3Aclosed+milestone%3A0.11.1)
## Version 0.11.0 (2019-03-25)
- Render themes: tag transform [#420](https://github.com/mapsforge/vtm/issues/420)
@@ -166,7 +205,8 @@
- vtm-ios module update [#29](https://github.com/mapsforge/vtm/issues/29)
- Native libraries for all platforms [#14](https://github.com/mapsforge/vtm/issues/14)
- Line stipple and texture rendering [#105](https://github.com/mapsforge/vtm/issues/105)
- Layer groups [#99](https://github.com/mapsforge/vtm/issues/99) [#103](https://github.com/mapsforge/vtm/issues/103)
- Group layer implementation [#99](https://github.com/mapsforge/vtm/issues/99)
- Layer groups implementation [#103](https://github.com/mapsforge/vtm/issues/103)
- Location renderer and layer [#171](https://github.com/mapsforge/vtm/issues/171)
- Map scale bar [#84](https://github.com/mapsforge/vtm/issues/84)
- Tile size based on scale factor [#183](https://github.com/mapsforge/vtm/issues/183)

View File

@@ -1,5 +1 @@
For questions or discussion please always use our Forum first and make sure you read our Contributing Guide.
- Forum: https://groups.google.com/group/mapsforge-dev
- Contributing Guide: https://github.com/mapsforge/vtm/blob/master/docs/CONTRIBUTING.md
For questions, reports and discussion please always use the [forum](https://groups.google.com/group/mapsforge-dev).

View File

@@ -10,7 +10,7 @@ Current version is [![Maven Central](https://img.shields.io/maven-central/v/org.
```groovy
implementation 'org.mapsforge:vtm:[CURRENT-VERSION]'
implementation 'org.mapsforge:vtm-themes:[CURRENT-VERSION]'
implementation 'org.slf4j:slf4j-api:1.7.25'
implementation 'org.slf4j:slf4j-api:1.7.28'
```
### Android
@@ -20,7 +20,7 @@ implementation 'org.mapsforge:vtm-android:[CURRENT-VERSION]:natives-armeabi-v7a'
implementation 'org.mapsforge:vtm-android:[CURRENT-VERSION]:natives-arm64-v8a'
implementation 'org.mapsforge:vtm-android:[CURRENT-VERSION]:natives-x86'
implementation 'org.mapsforge:vtm-android:[CURRENT-VERSION]:natives-x86_64'
implementation 'com.caverock:androidsvg:1.3'
implementation 'com.caverock:androidsvg:1.4'
```
### Android (libGDX)
@@ -36,9 +36,9 @@ implementation 'org.mapsforge:vtm-android-gdx:[CURRENT-VERSION]:natives-armeabi-
implementation 'org.mapsforge:vtm-android-gdx:[CURRENT-VERSION]:natives-arm64-v8a'
implementation 'org.mapsforge:vtm-android-gdx:[CURRENT-VERSION]:natives-x86'
implementation 'org.mapsforge:vtm-android-gdx:[CURRENT-VERSION]:natives-x86_64'
implementation 'com.badlogicgames.gdx:gdx:1.9.9'
implementation 'com.badlogicgames.gdx:gdx-backend-android:1.9.9'
implementation 'com.caverock:androidsvg:1.3'
implementation 'com.badlogicgames.gdx:gdx:1.9.10'
implementation 'com.badlogicgames.gdx:gdx-backend-android:1.9.10'
implementation 'com.caverock:androidsvg:1.4'
```
### iOS
@@ -56,47 +56,75 @@ implementation 'org.mapsforge:vtm-desktop:[CURRENT-VERSION]'
implementation 'org.mapsforge:vtm-desktop:[CURRENT-VERSION]:natives-linux'
implementation 'org.mapsforge:vtm-desktop:[CURRENT-VERSION]:natives-osx'
implementation 'org.mapsforge:vtm-desktop:[CURRENT-VERSION]:natives-windows'
implementation 'com.badlogicgames.gdx:gdx:1.9.9'
implementation 'com.badlogicgames.gdx:gdx-platform:1.9.9:natives-desktop'
implementation 'com.badlogicgames.gdx:gdx-backend-lwjgl:1.9.9'
implementation 'org.mapsforge:vtm-desktop-lwjgl:[CURRENT-VERSION]'
implementation 'com.badlogicgames.gdx:gdx:1.9.10'
implementation 'com.badlogicgames.gdx:gdx-platform:1.9.10:natives-desktop'
implementation 'com.github.blackears:svgSalamander:v1.1.1'
```
### Desktop (LWJGL)
```groovy
implementation 'com.badlogicgames.gdx:gdx-backend-lwjgl:1.9.10'
implementation 'org.lwjgl.lwjgl:lwjgl:2.9.3'
implementation 'org.lwjgl.lwjgl:lwjgl-platform:2.9.3:natives-linux'
implementation 'org.lwjgl.lwjgl:lwjgl-platform:2.9.3:natives-osx'
implementation 'org.lwjgl.lwjgl:lwjgl-platform:2.9.3:natives-windows'
implementation 'com.github.blackears:svgSalamander:v1.1.1'
```
### Desktop (LWJGL 3)
```groovy
implementation 'com.badlogicgames.gdx:gdx-backend-lwjgl3:1.9.10'
implementation 'org.lwjgl:lwjgl:3.2.3'
implementation 'org.lwjgl:lwjgl:3.2.3:natives-linux'
implementation 'org.lwjgl:lwjgl:3.2.3:natives-macos'
implementation 'org.lwjgl:lwjgl:3.2.3:natives-windows'
```
### JTS geometries
```groovy
implementation 'org.mapsforge:vtm-jts:[CURRENT-VERSION]'
implementation 'org.locationtech.jts:jts-core:1.15.0'
// https://github.com/locationtech/jts/issues/145
implementation 'org.locationtech.jts:jts-core:1.15.1'
```
### Online tiles
```groovy
implementation 'org.mapsforge:vtm-http:[CURRENT-VERSION]'
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
implementation 'com.squareup.okio:okio:1.13.0'
// https://github.com/square/okhttp/issues/4481
implementation 'com.squareup.okhttp3:okhttp:3.12.5'
implementation 'com.squareup.okio:okio:1.15.0'
```
### MBTiles (Android)
```groovy
implementation 'org.mapsforge:vtm-android-mvt:[CURRENT-VERSION]'
implementation 'org.mapsforge:vtm-mvt:[CURRENT-VERSION]'
implementation 'com.google.protobuf:protobuf-java:3.6.1'
implementation 'com.wdtinc:mapbox-vector-tile:3.1.0'
// https://github.com/locationtech/jts/issues/145
implementation 'org.locationtech.jts:jts-core:1.15.1'
```
### Mapbox vector tiles
```groovy
implementation 'org.mapsforge:vtm-mvt:[CURRENT-VERSION]'
implementation 'com.google.protobuf:protobuf-java:3.5.1'
implementation 'com.wdtinc:mapbox-vector-tile:3.0.0'
implementation 'org.locationtech.jts:jts-core:1.15.0'
implementation 'com.google.protobuf:protobuf-java:3.6.1'
implementation 'com.wdtinc:mapbox-vector-tile:3.1.0'
// https://github.com/locationtech/jts/issues/145
implementation 'org.locationtech.jts:jts-core:1.15.1'
```
### GeoJSON vector tiles
```groovy
implementation 'org.mapsforge:vtm-json:[CURRENT-VERSION]'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.8.4'
implementation 'com.fasterxml.jackson.core:jackson-core:2.8.4'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.4'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.9.9'
implementation 'com.fasterxml.jackson.core:jackson-core:2.9.9'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.9'
```
### jeo (indoor maps)

View File

@@ -3,9 +3,9 @@
- [AndroidMaps](http://www.androidmaps.co.uk/)
- [Freizeitkarte](http://www.freizeitkarte-osm.de/android/en/index.html)
- [Kurviger](https://offline-maps.kurviger.de/)
- [Locusvectormaps](http://www.locusvectormaps.com)
- [Mapsforge](http://download.mapsforge.org/)
- [OpenAndroMaps](http://www.openandromaps.org/en/)
- [OpenMaps](http://openmaps.eu/)
- [vector.city](https://vector.city/)
You know a Mapsforge map provider that is missing here? Please inform us by sending a message via our public [forum](https://groups.google.com/group/mapsforge-dev).

View File

@@ -15,3 +15,5 @@ The jar file can be found in `build/libs` folder. Depending on the main class, p
```
java -jar vtm-playground-master-SNAPSHOT-jar-with-dependencies.jar /path/to/map
```
To change the libGDX backend can replace the dependency: `vtm-desktop-lwjgl` or `vtm-desktop-lwjgl3`.

View File

@@ -11,3 +11,9 @@ org.gradle.jvmargs=-Xmx1536m
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -150,6 +150,7 @@
<xs:attribute name="font-family" default="default" type="tns:fontFamily" use="optional" />
<xs:attribute name="style" default="normal" type="tns:fontStyle" use="optional" />
<xs:attribute name="size" default="0" type="tns:nonNegativeFloat" use="optional" />
<xs:attribute name="bg-fill" default="#00000000" type="tns:color" use="optional" />
<xs:attribute name="fill" default="#000000" type="tns:color" use="optional" />
<xs:attribute name="stroke" default="#000000" type="tns:color" use="optional" />
<xs:attribute name="stroke-width" default="0" type="tns:nonNegativeFloat" use="optional" />
@@ -219,6 +220,7 @@
<xs:attribute name="font-family" default="default" type="tns:fontFamily" use="optional" />
<xs:attribute name="style" default="normal" type="tns:fontStyle" use="optional" />
<xs:attribute name="size" default="0" type="tns:nonNegativeFloat" use="optional" />
<xs:attribute name="bg-fill" default="#00000000" type="tns:color" use="optional" />
<xs:attribute name="fill" default="#000000" type="tns:color" use="optional" />
<xs:attribute name="stroke" default="#000000" type="tns:color" use="optional" />
<xs:attribute name="stroke-width" default="0" type="tns:nonNegativeFloat" use="optional" />
@@ -235,9 +237,13 @@
<xs:attribute name="symbol-width" type="xs:positiveInteger" use="optional" />
<xs:attribute name="symbol-height" type="xs:positiveInteger" use="optional" />
<xs:attribute name="symbol-percent" type="xs:positiveInteger" use="optional" />
<!-- symbols on lines -->
<xs:attribute name="billboard" default="false" type="xs:boolean" use="optional" />
<xs:attribute name="repeat" default="false" type="xs:boolean" use="optional" />
<xs:attribute name="repeat-gap" default="200" type="xs:float" use="optional" />
<xs:attribute name="repeat-start" default="30" type="xs:float" use="optional" />
<xs:attribute name="rotate" default="true" type="xs:boolean" use="optional" />
</xs:complexType>
<xs:complexType name="extrusion">

View File

@@ -3,8 +3,11 @@ include ':vtm'
include ':vtm-android'
include ':vtm-android-example'
include ':vtm-android-gdx'
include ':vtm-android-mvt'
include ':vtm-app'
include ':vtm-desktop'
include ':vtm-desktop-lwjgl'
include ':vtm-desktop-lwjgl3'
include ':vtm-extras'
include ':vtm-gdx'
include ':vtm-gdx-poi3d'

View File

@@ -7,7 +7,9 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<application
android:allowBackup="true"
@@ -22,15 +24,9 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".AtlasMarkerOverlayActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".AtlasMultiTextureActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".AtlasThemeActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".BitmapTileActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
@@ -49,9 +45,6 @@
<activity
android:name=".JeoIndoorActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".LayerGroupActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".LineTexActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
@@ -61,9 +54,6 @@
<activity
android:name=".LocationTextureActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".MapEventLayer2Activity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".MapilionMvtActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
@@ -92,7 +82,10 @@
android:name=".MarkerOverlayActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".MultiMapViewActivity"
android:name=".MBTilesBitmapActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".MBTilesMvtActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".NextzenGeojsonActivity"
@@ -103,9 +96,6 @@
<activity
android:name=".OpenMapTilesMvtActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".OSciMapS3DBActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".OverpassActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
@@ -118,15 +108,9 @@
<activity
android:name=".PoiSearchActivity$PoiFilePicker"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".POTTextureActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".ReverseGeocodeActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".RotateMarkerOverlayActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />
<activity
android:name=".ShadowActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />

View File

@@ -1,14 +1,8 @@
apply plugin: 'com.android.application'
/*
configurations.all {
// Check latest snapshot on every build
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
*/
dependencies {
implementation project(':vtm-android')
implementation project(':vtm-android-mvt')
implementation project(':vtm-extras')
implementation project(':vtm-http')
implementation project(':vtm-jeo')
@@ -22,11 +16,11 @@ dependencies {
implementation project(':vtm-gdx')
implementation project(':vtm-gdx-poi3d')
implementation 'org.mapsforge:mapsforge-poi-android:master-SNAPSHOT'
implementation 'org.mapsforge:sqlite-android:master-SNAPSHOT:natives-armeabi-v7a'
implementation 'org.mapsforge:sqlite-android:master-SNAPSHOT:natives-arm64-v8a'
implementation 'org.mapsforge:sqlite-android:master-SNAPSHOT:natives-x86'
implementation 'org.mapsforge:sqlite-android:master-SNAPSHOT:natives-x86_64'
implementation 'org.mapsforge:mapsforge-poi-android:0.13.0'
implementation 'org.mapsforge:sqlite-android:0.13.0:natives-armeabi-v7a'
implementation 'org.mapsforge:sqlite-android:0.13.0:natives-arm64-v8a'
implementation 'org.mapsforge:sqlite-android:0.13.0:natives-x86'
implementation 'org.mapsforge:sqlite-android:0.13.0:natives-x86_64'
}
android {
@@ -39,8 +33,8 @@ android {
}
defaultConfig {
versionCode versionCode()
versionName versionName()
versionCode project.versionCode()
versionName project.versionName()
minSdkVersion androidMinSdk()
targetSdkVersion androidTargetSdk()
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="580" width="580" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<title>other</title>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title>other</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<circle opacity=".8" cx="290" cy="290" r="145" fill="#fff"/>
<circle cy="290" cx="290" r="116" fill="#0092DA"/>
</svg>

After

Width:  |  Height:  |  Size: 651 B

View File

@@ -25,5 +25,8 @@
<string name="search_key">\'*\' or OSM key</string>
<string name="search_value">void or value</string>
<string name="now">Now</string>
<string name="warning">Warning</string>
<string name="startup_message_mbtiles">To run this sample activity, you need an MBTiles database installed on storage.\n\nadb push %s %s</string>
<string name="exit">Exit</string>
</resources>

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2010, 2011, 2012 mapsforge.org
* Copyright 2016 devemux86
* Copyright 2016-2019 devemux86
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -22,11 +22,9 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import org.oscim.android.test.R;
import java.io.File;
@@ -60,7 +58,6 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
private static final String PREFERENCES_FILE = "FilePicker";
private static final String CURRENT_DIRECTORY = "currentDirectory";
private static final String DEFAULT_DIRECTORY = Environment.getExternalStorageDirectory().getAbsolutePath();
private static final int DIALOG_FILE_INVALID = 0;
// private static final int DIALOG_FILE_SELECT = 1;
@@ -122,6 +119,7 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
};
}
private String mDefaultDirectory;
private File mDirectory;
private FilePickerIconAdapter mFilePickerIconAdapter;
private File[] mFiles;
@@ -164,7 +162,7 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
}
// if a parent directory exists, add it at the first position
if (mDirectory.getParentFile() != null) {
if (mDirectory.getParentFile() != null && mDirectory.getParentFile().canRead()) {
mFilesWithParentFolder = new File[mFiles.length + 1];
mFilesWithParentFolder[0] = mDirectory.getParentFile();
System.arraycopy(mFiles, 0, mFilesWithParentFolder, 1,
@@ -182,6 +180,7 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_picker);
mDefaultDirectory = getExternalFilesDir(null) != null ? getExternalFilesDir(null).getAbsolutePath() : "/sdcard/";
mFilePickerIconAdapter = new FilePickerIconAdapter(this);
GridView gridView = (GridView) findViewById(R.id.filePickerView);
gridView.setOnItemClickListener(this);
@@ -239,10 +238,9 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
// restore the current directory
SharedPreferences preferences = getSharedPreferences(PREFERENCES_FILE,
MODE_PRIVATE);
mDirectory = new File(preferences.getString(CURRENT_DIRECTORY,
DEFAULT_DIRECTORY));
mDirectory = new File(preferences.getString(CURRENT_DIRECTORY, mDefaultDirectory));
if (!mDirectory.exists() || !mDirectory.canRead()) {
mDirectory = new File(DEFAULT_DIRECTORY);
mDirectory = new File(mDefaultDirectory);
}
browseToCurrentDirectory();
}

View File

@@ -1,91 +0,0 @@
/*
* Copyright 2014 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2017 Longri
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
import org.oscim.backend.canvas.Bitmap;
import org.oscim.core.GeoPoint;
import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.renderer.atlas.TextureAtlas;
import org.oscim.renderer.atlas.TextureRegion;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.OkHttpEngine;
import org.oscim.tiling.source.bitmap.DefaultSources;
import org.oscim.utils.TextureAtlasUtils;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import static org.oscim.android.canvas.AndroidGraphics.drawableToBitmap;
public class AtlasMarkerOverlayActivity extends MarkerOverlayActivity {
@Override
void createLayers() {
// Map events receiver
mMap.layers().add(new MapEventsReceiver(mMap));
TileSource tileSource = DefaultSources.OPENSTREETMAP
.httpFactory(new OkHttpEngine.OkHttpFactory())
.build();
mMap.layers().add(new BitmapTileLayer(mMap, tileSource));
Bitmap bitmapPoi = drawableToBitmap(getResources().getDrawable(R.drawable.marker_poi));
Bitmap bitmapFocus = drawableToBitmap(getResources().getDrawable(R.drawable.marker_focus));
// Create Atlas from Bitmaps
java.util.Map<Object, Bitmap> inputMap = new LinkedHashMap<>();
java.util.Map<Object, TextureRegion> regionsMap = new LinkedHashMap<>();
List<TextureAtlas> atlasList = new ArrayList<>();
inputMap.put("poi", bitmapPoi);
inputMap.put("focus", bitmapFocus);
// Bitmaps will never used any more
// With iOS we must flip the Y-Axis
TextureAtlasUtils.createTextureRegions(inputMap, regionsMap, atlasList, true, false);
MarkerSymbol symbol;
if (BILLBOARDS)
symbol = new MarkerSymbol(regionsMap.get("poi"), HotspotPlace.BOTTOM_CENTER);
else
symbol = new MarkerSymbol(regionsMap.get("poi"), HotspotPlace.CENTER, false);
if (BILLBOARDS)
mFocusMarker = new MarkerSymbol(regionsMap.get("focus"), HotspotPlace.BOTTOM_CENTER);
else
mFocusMarker = new MarkerSymbol(regionsMap.get("focus"), HotspotPlace.CENTER, false);
mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this);
mMap.layers().add(mMarkerLayer);
List<MarkerItem> pts = new ArrayList<>();
for (double lat = -90; lat <= 90; lat += 5) {
for (double lon = -180; lon <= 180; lon += 5)
pts.add(new MarkerItem(lat + "/" + lon, "", new GeoPoint(lat, lon)));
}
mMarkerLayer.addItems(pts);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
* Copyright 2017 nebular
*
* This program is free software: you can redistribute it and/or modify it under the
@@ -15,16 +15,12 @@
*/
package org.oscim.android.test;
import android.graphics.BitmapFactory;
import org.oscim.android.canvas.AndroidBitmap;
import org.oscim.backend.canvas.Bitmap;
import org.oscim.backend.canvas.Color;
import org.oscim.core.GeoPoint;
import org.oscim.layers.marker.ClusterMarkerRenderer;
import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerLayer;
import org.oscim.layers.marker.MarkerRenderer;
import org.oscim.layers.marker.MarkerRendererFactory;
import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.marker.*;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.OkHttpEngine;
@@ -33,8 +29,6 @@ import org.oscim.tiling.source.bitmap.DefaultSources;
import java.util.ArrayList;
import java.util.List;
import static org.oscim.android.canvas.AndroidGraphics.drawableToBitmap;
public class ClusterMarkerOverlayActivity extends MarkerOverlayActivity {
private static final int COUNT = 5;
@@ -50,7 +44,7 @@ public class ClusterMarkerOverlayActivity extends MarkerOverlayActivity {
.build();
mMap.layers().add(new BitmapTileLayer(mMap, tileSource));
Bitmap bitmapPoi = drawableToBitmap(getResources().getDrawable(R.drawable.marker_poi));
Bitmap bitmapPoi = new AndroidBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.marker_poi));
final MarkerSymbol symbol;
if (BILLBOARDS)
symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER);

View File

@@ -16,8 +16,6 @@ package org.oscim.android.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import org.oscim.android.MapView;
import org.oscim.backend.CanvasAdapter;
import org.oscim.layers.tile.buildings.BuildingLayer;
@@ -35,7 +33,8 @@ import java.io.File;
/**
* A very basic Android app example.
* <p>
* You'll need a map with filename berlin.map from download.mapsforge.org in device storage.
* You'll need a map with filename berlin.map from download.mapsforge.org in device storage:
* /sdcard/Android/data/org.oscim.android.test/files/
*/
public class GettingStarted extends Activity {
@@ -55,7 +54,7 @@ public class GettingStarted extends Activity {
// Tile source
MapFileTileSource tileSource = new MapFileTileSource();
String mapPath = new File(Environment.getExternalStorageDirectory(), MAP_FILE).getAbsolutePath();
String mapPath = new File(getExternalFilesDir(null), MAP_FILE).getAbsolutePath();
if (tileSource.setMapFile(mapPath)) {
// Vector layer
VectorTileLayer tileLayer = mapView.map().setBaseMap(tileSource);

View File

@@ -1,80 +0,0 @@
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2016 Andrey Novikov
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
import android.os.Bundle;
import org.oscim.backend.CanvasAdapter;
import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.map.Layers;
import org.oscim.renderer.BitmapRenderer;
import org.oscim.renderer.GLViewport;
import org.oscim.scalebar.DefaultMapScaleBar;
import org.oscim.scalebar.ImperialUnitAdapter;
import org.oscim.scalebar.MapScaleBar;
import org.oscim.scalebar.MapScaleBarLayer;
import org.oscim.scalebar.MetricUnitAdapter;
import org.oscim.theme.VtmThemes;
public class LayerGroupActivity extends BaseMapActivity {
private static final int GROUP_3D_OBJECTS = 1;
private static final int GROUP_LABELS = 2;
private static final int GROUP_OVERLAYS = 3;
private DefaultMapScaleBar mapScaleBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Layers layers = mMap.layers();
layers.addGroup(GROUP_3D_OBJECTS);
layers.add(new BuildingLayer(mMap, mBaseLayer), GROUP_3D_OBJECTS);
layers.addGroup(GROUP_LABELS);
layers.add(new LabelLayer(mMap, mBaseLayer), GROUP_LABELS);
mapScaleBar = new DefaultMapScaleBar(mMap);
mapScaleBar.setScaleBarMode(DefaultMapScaleBar.ScaleBarMode.BOTH);
mapScaleBar.setDistanceUnitAdapter(MetricUnitAdapter.INSTANCE);
mapScaleBar.setSecondaryDistanceUnitAdapter(ImperialUnitAdapter.INSTANCE);
mapScaleBar.setScaleBarPosition(MapScaleBar.ScaleBarPosition.BOTTOM_LEFT);
MapScaleBarLayer mapScaleBarLayer = new MapScaleBarLayer(mMap, mapScaleBar);
BitmapRenderer renderer = mapScaleBarLayer.getRenderer();
renderer.setPosition(GLViewport.Position.BOTTOM_LEFT);
renderer.setOffset(5 * CanvasAdapter.getScale(), 0);
layers.addGroup(GROUP_OVERLAYS);
layers.add(mapScaleBarLayer, GROUP_OVERLAYS);
mMap.setTheme(VtmThemes.DEFAULT);
}
@Override
protected void onDestroy() {
if (mapScaleBar != null)
mapScaleBar.destroy();
super.onDestroy();
}
}

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2014 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@@ -18,7 +18,6 @@
package org.oscim.android.test;
import android.os.Bundle;
import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.canvas.Color;
import org.oscim.core.MapPosition;
@@ -38,7 +37,7 @@ import java.util.List;
*/
public class LineTexActivity extends BitmapTileActivity {
private static final boolean ANIMATION = false;
private static final boolean ANIMATION = true;
private List<PathLayer> mPathLayers = new ArrayList<>();
@@ -49,7 +48,7 @@ public class LineTexActivity extends BitmapTileActivity {
TextureItem tex = null;
try {
tex = new TextureItem(CanvasAdapter.getBitmapAsset("", "patterns/pike.png"));
tex.mipmap = true;
//tex.mipmap = true;
} catch (IOException e) {
e.printStackTrace();
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -14,16 +14,20 @@
*/
package org.oscim.android.test;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import org.oscim.core.MapPosition;
import org.oscim.layers.LocationLayer;
import org.oscim.renderer.LocationCallback;
public class LocationActivity extends BitmapTileActivity implements LocationListener {
private Location location;
private LocationLayer locationLayer;
private LocationManager locationManager;
private final MapPosition mapPosition = new MapPosition();
@@ -35,27 +39,46 @@ public class LocationActivity extends BitmapTileActivity implements LocationList
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationLayer = new LocationLayer(mMap);
locationLayer.locationRenderer.setShader("location_1_reverse");
locationLayer.locationRenderer.setCallback(new LocationCallback() {
@Override
public boolean hasRotation() {
return location != null && location.hasBearing();
}
@Override
public float getRotation() {
return location != null && location.hasBearing() ? location.getBearing() : 0;
}
});
locationLayer.setEnabled(false);
mMap.layers().add(locationLayer);
}
@Override
protected void onResume() {
super.onResume();
public void onRequestPermissionsResult(final int requestCode, final String[] permissions, final int[] grantResults) {
if (requestCode == 0) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
enableAvailableProviders();
}
}
@Override
public void onStart() {
super.onStart();
enableAvailableProviders();
}
@Override
protected void onPause() {
super.onPause();
public void onStop() {
locationManager.removeUpdates(this);
super.onStop();
}
@Override
public void onLocationChanged(Location location) {
this.location = location;
locationLayer.setEnabled(true);
locationLayer.setPosition(location.getLatitude(), location.getLongitude(), location.getAccuracy());
@@ -78,6 +101,13 @@ public class LocationActivity extends BitmapTileActivity implements LocationList
}
private void enableAvailableProviders() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
return;
}
}
locationManager.removeUpdates(this);
for (String provider : locationManager.getProviders(true)) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
* Copyright 2018 Longri
*
* This program is free software: you can redistribute it and/or modify it under the
@@ -15,26 +15,26 @@
*/
package org.oscim.android.test;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.canvas.Bitmap;
import org.oscim.backend.canvas.Color;
import org.oscim.core.MapPosition;
import org.oscim.layers.LocationTextureLayer;
import org.oscim.renderer.atlas.TextureAtlas;
import org.oscim.renderer.atlas.TextureRegion;
import org.oscim.renderer.bucket.TextureItem;
import org.oscim.renderer.LocationCallback;
import org.oscim.utils.IOUtils;
import java.io.IOException;
import java.io.InputStream;
public class LocationTextureActivity extends BitmapTileActivity implements LocationListener {
private Location location;
private LocationTextureLayer locationLayer;
private LocationManager locationManager;
private final MapPosition mapPosition = new MapPosition();
@@ -45,56 +45,72 @@ public class LocationTextureActivity extends BitmapTileActivity implements Locat
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// load a Bitmap/SVG from resources
InputStream is = null;
Bitmap bmp = null;
Bitmap bitmapArrow = null;
try {
is = getResources().openRawResource(R.raw.arrow);
float scale = CanvasAdapter.getScale();
bmp = CanvasAdapter.decodeSvgBitmap(is, (int) (60 * scale), (int) (60 * scale), 100);
bitmapArrow = CanvasAdapter.decodeSvgBitmap(is, (int) (48 * CanvasAdapter.getScale()), (int) (48 * CanvasAdapter.getScale()), 100);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(is);
}
// create TextureRegion from Bitmap
TextureRegion textureRegion = new TextureRegion(new TextureItem(bmp), new TextureAtlas.Rect(0, 0, bmp.getWidth(), bmp.getHeight()));
Bitmap bitmapMarker = null;
try {
is = getResources().openRawResource(R.raw.marker);
bitmapMarker = CanvasAdapter.decodeSvgBitmap(is, (int) (48 * CanvasAdapter.getScale()), (int) (48 * CanvasAdapter.getScale()), 100);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(is);
}
// create LocationTextureLayer with created/loaded TextureRegion
locationLayer = new LocationTextureLayer(mMap, textureRegion);
// set color of accuracy circle (Color.BLUE is default)
locationLayer.locationRenderer.setAccuracyColor(Color.get(50, 50, 255));
// set color of indicator circle (Color.RED is default)
locationLayer.locationRenderer.setIndicatorColor(Color.MAGENTA);
// set billboard rendering for TextureRegion (false is default)
locationLayer.locationRenderer.setBillboard(false);
locationLayer = new LocationTextureLayer(mMap);
locationLayer.locationRenderer.setBitmapArrow(bitmapArrow);
locationLayer.locationRenderer.setBitmapMarker(bitmapMarker);
locationLayer.locationRenderer.setCallback(new LocationCallback() {
@Override
public boolean hasRotation() {
return location != null && location.hasBearing();
}
@Override
public float getRotation() {
return location != null && location.hasBearing() ? location.getBearing() : 0;
}
});
locationLayer.setEnabled(false);
mMap.layers().add(locationLayer);
}
@Override
protected void onResume() {
super.onResume();
public void onRequestPermissionsResult(final int requestCode, final String[] permissions, final int[] grantResults) {
if (requestCode == 0) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
enableAvailableProviders();
}
}
@Override
public void onStart() {
super.onStart();
enableAvailableProviders();
}
@Override
protected void onPause() {
super.onPause();
public void onStop() {
locationManager.removeUpdates(this);
super.onStop();
}
@Override
public void onLocationChanged(Location location) {
this.location = location;
locationLayer.setEnabled(true);
locationLayer.setPosition(location.getLatitude(), location.getLongitude(), location.getBearing(), location.getAccuracy());
locationLayer.setPosition(location.getLatitude(), location.getLongitude(), location.getAccuracy());
// Follow location
mMap.getMapPosition(mapPosition);
@@ -115,6 +131,13 @@ public class LocationTextureActivity extends BitmapTileActivity implements Locat
}
private void enableAvailableProviders() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
return;
}
}
locationManager.removeUpdates(this);
for (String provider : locationManager.getProviders(true)) {

View File

@@ -0,0 +1,71 @@
/*
* Copyright 2019 Andrea Antonello
* Copyright 2019 devemux86
* Copyright 2019 Kostas Tzounopoulos
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import org.oscim.android.tiling.source.mbtiles.MBTilesBitmapTileSource;
import org.oscim.android.tiling.source.mbtiles.MBTilesTileSource;
import org.oscim.core.BoundingBox;
import org.oscim.core.MapPosition;
import org.oscim.core.Tile;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import java.io.File;
/**
* An example activity making use of raster MBTiles.
*/
public class MBTilesBitmapActivity extends BitmapTileActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
File file = new File(getExternalFilesDir(null), "raster.mbtiles");
if (!file.exists()) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.warning)
.setMessage(getResources().getString(R.string.startup_message_mbtiles, file.getName(), file.getAbsolutePath()))
.setPositiveButton(R.string.exit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.show();
return;
}
MBTilesTileSource tileSource = new MBTilesBitmapTileSource(file.getAbsolutePath(), 128, null);
BitmapTileLayer bitmapLayer = new BitmapTileLayer(mMap, tileSource);
mMap.layers().add(bitmapLayer);
/* set initial position on first run */
MapPosition pos = new MapPosition();
mMap.getMapPosition(pos);
if (pos.x == 0.5 && pos.y == 0.5) {
BoundingBox bbox = tileSource.getDataSource().getBounds();
if (bbox != null) {
pos.setByBoundingBox(bbox, Tile.SIZE * 4, Tile.SIZE * 4);
mMap.setMapPosition(pos);
}
}
}
}

View File

@@ -0,0 +1,93 @@
/*
* Copyright 2019 Andrea Antonello
* Copyright 2019 devemux86
* Copyright 2019 Kostas Tzounopoulos
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import org.oscim.android.mvt.tiling.source.mbtiles.MBTilesMvtTileSource;
import org.oscim.android.tiling.source.mbtiles.MBTilesTileSource;
import org.oscim.android.tiling.source.mbtiles.MBTilesUnsupportedException;
import org.oscim.core.BoundingBox;
import org.oscim.core.MapPosition;
import org.oscim.core.Tile;
import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.theme.VtmThemes;
import java.io.File;
/**
* An example activity making use of vector MBTiles.
*/
public class MBTilesMvtActivity extends MapActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
File file = new File(getExternalFilesDir(null), "vector.mbtiles");
if (!file.exists()) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.warning)
.setMessage(getResources().getString(R.string.startup_message_mbtiles, file.getName(), file.getAbsolutePath()))
.setPositiveButton(R.string.exit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.show();
return;
}
MBTilesTileSource tileSource;
try {
tileSource = new MBTilesMvtTileSource(file.getAbsolutePath(), "en");
} catch (MBTilesUnsupportedException e) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.warning)
.setMessage(e.getMessage())
.setPositiveButton(R.string.exit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.show();
return;
}
VectorTileLayer l = mMap.setBaseMap(tileSource);
mMap.setTheme(VtmThemes.OPENMAPTILES);
mMap.layers().add(new BuildingLayer(mMap, l));
mMap.layers().add(new LabelLayer(mMap, l));
/* set initial position on first run */
MapPosition pos = new MapPosition();
mMap.getMapPosition(pos);
if (pos.x == 0.5 && pos.y == 0.5) {
BoundingBox bbox = tileSource.getDataSource().getBounds();
if (bbox != null) {
pos.setByBoundingBox(bbox, Tile.SIZE * 4, Tile.SIZE * 4);
mMap.setMapPosition(pos);
}
}
}
}

View File

@@ -1,32 +0,0 @@
/*
* Copyright 2016-2017 devemux86
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
import org.oscim.utils.Parameters;
public class MapEventLayer2Activity extends MarkerOverlayActivity {
public MapEventLayer2Activity() {
super();
Parameters.MAP_EVENT_LAYER2 = true;
}
@Override
protected void onDestroy() {
super.onDestroy();
Parameters.MAP_EVENT_LAYER2 = false;
}
}

View File

@@ -14,8 +14,11 @@
*/
package org.oscim.android.test;
import android.os.Build;
import android.os.Bundle;
import okhttp3.CipherSuite;
import okhttp3.ConnectionSpec;
import okhttp3.OkHttpClient;
import org.oscim.android.cache.TileCache;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.layers.tile.buildings.BuildingLayer;
@@ -27,6 +30,10 @@ import org.oscim.tiling.source.UrlTileSource;
import org.oscim.tiling.source.bitmap.DefaultSources;
import org.oscim.tiling.source.mvt.MapilionMvtTileSource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MapilionMvtActivity extends MapActivity {
// Metered API key for demonstration purposes
@@ -40,7 +47,23 @@ public class MapilionMvtActivity extends MapActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
OkHttpEngine.OkHttpFactory factory = new OkHttpEngine.OkHttpFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
// https://github.com/square/okhttp/issues/4053
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
List<CipherSuite> cipherSuites = new ArrayList<>();
List<CipherSuite> modernTlsCipherSuites = ConnectionSpec.MODERN_TLS.cipherSuites();
if (modernTlsCipherSuites != null)
cipherSuites.addAll(modernTlsCipherSuites);
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA);
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA);
ConnectionSpec legacyTls = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.cipherSuites(cipherSuites.toArray(new CipherSuite[0]))
.build();
builder.connectionSpecs(Arrays.asList(legacyTls, ConnectionSpec.CLEARTEXT));
}
OkHttpEngine.OkHttpFactory factory = new OkHttpEngine.OkHttpFactory(builder);
UrlTileSource tileSource = MapilionMvtTileSource.builder()
.apiKey(API_KEY)

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2014 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@@ -17,9 +17,10 @@
*/
package org.oscim.android.test;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.Toast;
import org.oscim.android.canvas.AndroidBitmap;
import org.oscim.backend.canvas.Bitmap;
import org.oscim.core.GeoPoint;
import org.oscim.event.Gesture;
@@ -39,8 +40,6 @@ import org.oscim.tiling.source.bitmap.DefaultSources;
import java.util.ArrayList;
import java.util.List;
import static org.oscim.android.canvas.AndroidGraphics.drawableToBitmap;
public class MarkerOverlayActivity extends MapActivity
implements ItemizedLayer.OnItemGestureListener<MarkerItem> {
@@ -64,14 +63,14 @@ public class MarkerOverlayActivity extends MapActivity
.build();
mMap.layers().add(new BitmapTileLayer(mMap, tileSource));
Bitmap bitmapPoi = drawableToBitmap(getResources().getDrawable(R.drawable.marker_poi));
Bitmap bitmapPoi = new AndroidBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.marker_poi));
MarkerSymbol symbol;
if (BILLBOARDS)
symbol = new MarkerSymbol(bitmapPoi, HotspotPlace.BOTTOM_CENTER);
else
symbol = new MarkerSymbol(bitmapPoi, HotspotPlace.CENTER, false);
Bitmap bitmapFocus = drawableToBitmap(getResources().getDrawable(R.drawable.marker_focus));
Bitmap bitmapFocus = new AndroidBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.marker_focus));
if (BILLBOARDS)
mFocusMarker = new MarkerSymbol(bitmapFocus, HotspotPlace.BOTTOM_CENTER);
else

View File

@@ -1,91 +0,0 @@
/*
* Copyright 2016 Marvin W
* Copyright 2016-2017 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
import android.app.Activity;
import android.os.Bundle;
import org.oscim.android.MapPreferences;
import org.oscim.android.MapView;
import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.map.Map;
import org.oscim.theme.VtmThemes;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.OkHttpEngine;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
public class MultiMapViewActivity extends Activity {
private MapView mMapView1, mMapView2;
private MapPreferences mPrefs1, mPrefs2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_multi);
setTitle(getClass().getSimpleName());
// 1st map view
mMapView1 = (MapView) findViewById(R.id.mapView1);
Map map1 = mMapView1.map();
mPrefs1 = new MapPreferences(MultiMapViewActivity.class.getName() + "1", this);
TileSource tileSource1 = OSciMap4TileSource.builder()
.httpFactory(new OkHttpEngine.OkHttpFactory())
.build();
VectorTileLayer baseLayer1 = map1.setBaseMap(tileSource1);
map1.layers().add(new BuildingLayer(map1, baseLayer1));
map1.layers().add(new LabelLayer(map1, baseLayer1));
map1.setTheme(VtmThemes.DEFAULT);
// 2nd map view
mMapView2 = (MapView) findViewById(R.id.mapView2);
Map map2 = mMapView2.map();
mPrefs2 = new MapPreferences(MultiMapViewActivity.class.getName() + "2", this);
TileSource tileSource2 = OSciMap4TileSource.builder()
.httpFactory(new OkHttpEngine.OkHttpFactory())
.build();
VectorTileLayer baseLayer2 = map2.setBaseMap(tileSource2);
map2.layers().add(new BuildingLayer(map2, baseLayer2));
map2.layers().add(new LabelLayer(map2, baseLayer2));
map2.setTheme(VtmThemes.DEFAULT);
}
@Override
protected void onResume() {
super.onResume();
mPrefs1.load(mMapView1.map());
mMapView1.onResume();
mPrefs2.load(mMapView2.map());
mMapView2.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView1.onPause();
mPrefs1.save(mMapView1.map());
mMapView2.onPause();
mPrefs2.save(mMapView2.map());
}
}

View File

@@ -1,72 +0,0 @@
/*
* Copyright 2016-2017 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
import android.os.Bundle;
import org.oscim.android.cache.TileCache;
import org.oscim.layers.tile.TileLayer;
import org.oscim.layers.tile.buildings.S3DBTileLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.theme.VtmThemes;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.OkHttpEngine;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
public class OSciMapS3DBActivity extends BaseMapActivity {
TileCache mS3dbCache;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMap.setTheme(VtmThemes.DEFAULT);
TileSource ts = OSciMap4TileSource.builder()
.httpFactory(new OkHttpEngine.OkHttpFactory())
.url("http://opensciencemap.org/tiles/s3db")
.zoomMin(16)
.zoomMax(16)
.build();
if (USE_CACHE) {
mS3dbCache = new TileCache(this, null, "s3db.db");
mS3dbCache.setCacheSize(512 * (1 << 10));
ts.setCache(mS3dbCache);
}
TileLayer tl = new S3DBTileLayer(mMap, ts, true, false);
mMap.layers().add(tl);
mMap.layers().add(new LabelLayer(mMap, mBaseLayer));
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mS3dbCache != null)
mS3dbCache.dispose();
}
@Override
protected void onResume() {
super.onResume();
/* ignore saved position */
mMap.setMapPosition(53.5620092, 9.9866457, 1 << 16);
}
}

View File

@@ -1,36 +0,0 @@
/*
* Copyright 2017-2018 devemux86
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
import android.os.Bundle;
import org.oscim.utils.Parameters;
public class POTTextureActivity extends SimpleMapActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
Parameters.POT_TEXTURES = true;
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
Parameters.POT_TEXTURES = false;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2017-2018 devemux86
* Copyright 2017-2019 devemux86
* Copyright 2018 Gustl22
*
* This program is free software: you can redistribute it and/or modify it under the
@@ -17,6 +17,7 @@ package org.oscim.android.test;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
@@ -25,20 +26,11 @@ import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.ToggleButton;
import android.widget.*;
import org.mapsforge.core.model.Tag;
import org.mapsforge.poi.android.storage.AndroidPoiPersistenceManagerFactory;
import org.mapsforge.poi.storage.ExactMatchPoiCategoryFilter;
import org.mapsforge.poi.storage.PoiCategoryFilter;
import org.mapsforge.poi.storage.PoiCategoryManager;
import org.mapsforge.poi.storage.PoiPersistenceManager;
import org.mapsforge.poi.storage.PointOfInterest;
import org.mapsforge.poi.storage.*;
import org.oscim.android.canvas.AndroidBitmap;
import org.oscim.android.filepicker.FilePicker;
import org.oscim.android.filepicker.FilterByFileExtension;
import org.oscim.backend.canvas.Bitmap;
@@ -60,8 +52,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static org.oscim.android.canvas.AndroidGraphics.drawableToBitmap;
/**
* POI search.<br/>
* Long press on map to search inside visible bounding box.<br/>
@@ -162,7 +152,7 @@ public class PoiSearchActivity extends MapsforgeActivity implements ItemizedLaye
String file = intent.getStringExtra(FilePicker.SELECTED_FILE);
mPersistenceManager = AndroidPoiPersistenceManagerFactory.getPoiPersistenceManager(file);
Bitmap bitmap = drawableToBitmap(getResources().getDrawable(R.drawable.marker_green));
Bitmap bitmap = new AndroidBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.marker_green));
MarkerSymbol symbol = new MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.BOTTOM_CENTER);
mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this);
mMap.layers().add(mMarkerLayer);

View File

@@ -1,78 +0,0 @@
/*
* Copyright 2014 Hannes Janetzek
* Copyright 2016-2017 devemux86
* Copyright 2017 Longri
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
import android.widget.Toast;
import org.oscim.layers.marker.MarkerItem;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicInteger;
public class RotateMarkerOverlayActivity extends MarkerOverlayActivity {
private Timer timer;
private int markerCount = 0;
private void itemEvent(final MarkerItem item) {
if (item.getMarker() == null) {
item.setMarker(mFocusMarker);
markerCount++;
final AtomicInteger rotValue = new AtomicInteger(0);
if (timer != null)
timer.cancel();
timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
float value = (float) (rotValue.incrementAndGet() * 10);
item.setRotation(value);
if (rotValue.get() > 36)
rotValue.set(0);
mMarkerLayer.update();
mMap.updateMap(true);
}
};
timer.schedule(timerTask, 1000, 1000);
} else {
item.setMarker(null);
markerCount--;
if (timer != null && markerCount == 0)
timer.cancel();
}
}
@Override
public boolean onItemSingleTapUp(int index, MarkerItem item) {
itemEvent(item);
Toast.makeText(this, "Marker tap\n" + item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onItemLongPress(int index, MarkerItem item) {
itemEvent(item);
Toast.makeText(this, "Marker long press\n" + item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
}

View File

@@ -8,6 +8,8 @@
* Copyright 2017 nebular
* Copyright 2018 boldtrn
* Copyright 2018-2019 Gustl22
* Copyright 2019 Andrea Antonello
* Copyright 2019 Kostas Tzounopoulos
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@@ -87,12 +89,13 @@ public class Samples extends Activity {
linearLayout.addView(createLabel(null));
linearLayout.addView(createButton(SimpleMapActivity.class));
linearLayout.addView(createButton(MapsforgeActivity.class));
linearLayout.addView(createButton(MBTilesMvtActivity.class));
linearLayout.addView(createButton(MapilionMvtActivity.class));
/*linearLayout.addView(createButton(MapzenMvtActivity.class));
linearLayout.addView(createButton(MapzenGeojsonActivity.class));*/
linearLayout.addView(createButton(MapzenGeojsonActivity.class));
linearLayout.addView(createButton(NextzenMvtActivity.class));
linearLayout.addView(createButton(NextzenGeojsonActivity.class));
linearLayout.addView(createButton(OpenMapTilesMvtActivity.class));
linearLayout.addView(createButton(OpenMapTilesMvtActivity.class));*/
linearLayout.addView(createButton(GdxActivity.class));
linearLayout.addView(createLabel("Features"));
@@ -109,36 +112,25 @@ public class Samples extends Activity {
linearLayout.addView(createLabel("Vector Features"));
linearLayout.addView(createButton(MapsforgeStyleActivity.class));
linearLayout.addView(createButton(MapsforgeS3DBActivity.class));
linearLayout.addView(createButton(AtlasThemeActivity.class));
linearLayout.addView(createButton(POTTextureActivity.class));
linearLayout.addView(createButton(ShadowActivity.class));
linearLayout.addView(createLabel("Raster Maps"));
linearLayout.addView(createButton(BitmapTileActivity.class));
linearLayout.addView(createButton(MBTilesBitmapActivity.class));
linearLayout.addView(createLabel("Overlays"));
linearLayout.addView(createButton(MarkerOverlayActivity.class));
linearLayout.addView(createButton(RotateMarkerOverlayActivity.class));
linearLayout.addView(createButton(AtlasMarkerOverlayActivity.class));
linearLayout.addView(createButton(AtlasMultiTextureActivity.class));
linearLayout.addView(createButton(ClusterMarkerOverlayActivity.class));
linearLayout.addView(createButton(PathOverlayActivity.class));
linearLayout.addView(createButton(LineTexActivity.class));
linearLayout.addView(createButton(VectorLayerActivity.class));
linearLayout.addView(createLabel("User Interaction"));
linearLayout.addView(createButton(MapEventLayer2Activity.class));
linearLayout.addView(createButton(LayerGroupActivity.class));
linearLayout.addView(createLabel("Dual Map Views"));
linearLayout.addView(createButton(MultiMapViewActivity.class));
linearLayout.addView(createButton(AtlasMultiTextureActivity.class));
linearLayout.addView(createLabel("Experiments"));
linearLayout.addView(createButton(ReverseGeocodeActivity.class));
linearLayout.addView(createButton(OSciMapS3DBActivity.class));
linearLayout.addView(createButton(ThemeStylerActivity.class));
linearLayout.addView(createButton(JeoIndoorActivity.class));
linearLayout.addView(createButton(GdxPoi3DActivity.class));
linearLayout.addView(createButton(OverpassActivity.class));
linearLayout.addView(createButton(ClusterMarkerOverlayActivity.class));
}
}

View File

@@ -16,8 +16,8 @@ android {
}
defaultConfig {
versionCode versionCode()
versionName versionName()
versionCode project.versionCode()
versionName project.versionName()
minSdkVersion androidMinSdk()
targetSdkVersion androidTargetSdk()
}

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<manifest package="org.oscim.android.mvt" />

View File

@@ -0,0 +1,55 @@
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
dependencies {
api project(':vtm-android')
api project(':vtm-mvt')
}
android {
compileSdkVersion androidCompileSdk()
buildToolsVersion "$androidBuildVersionTools"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
defaultConfig {
versionCode project.versionCode()
versionName project.versionName()
minSdkVersion androidMinSdk()
targetSdkVersion androidTargetSdk()
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
}
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
lintOptions { abortOnError false }
}
android.libraryVariants.all { variant ->
def name = variant.buildType.name
if (name == "debug")
return
def jar = project.tasks.create "jar${name.capitalize()}", Jar
jar.dependsOn variant.javaCompileProvider
jar.exclude '**/BuildConfig.class'
jar.exclude '**/R.class'
jar.exclude '**/R$*.class'
jar.from variant.javaCompileProvider.get().destinationDir
artifacts.add('archives', jar)
}
if (project.hasProperty("SONATYPE_USERNAME")) {
afterEvaluate {
project.apply from: "${rootProject.projectDir}/deploy.gradle"
}
}

View File

@@ -0,0 +1,144 @@
/*
* Copyright 2019 Kostas Tzounopoulos
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.mvt.tiling.source.mbtiles;
import android.database.Cursor;
import org.oscim.android.tiling.source.mbtiles.MBTilesTileDataSource;
import org.oscim.android.tiling.source.mbtiles.MBTilesUnsupportedException;
import org.oscim.core.MercatorProjection;
import org.oscim.layers.tile.MapTile;
import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.OverzoomDataSink;
import org.oscim.tiling.QueryResult;
import org.oscim.tiling.source.mvt.TileDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.zip.GZIPInputStream;
/**
* A tile data source for MBTiles vector databases.
*/
public class MBTilesMvtTileDataSource extends MBTilesTileDataSource {
private static final Logger log = LoggerFactory.getLogger(MBTilesMvtTileDataSource.class);
private static final List<String> SUPPORTED_FORMATS = Collections.singletonList("pbf");
private static final String WHERE_FORMAT = "zoom_level=%d AND tile_column=%d AND tile_row=%d";
private final String mLanguage;
private final ThreadLocal<TileDecoder> mThreadLocalDecoders = new ThreadLocal<TileDecoder>() {
@Override
protected TileDecoder initialValue() {
return new TileDecoder(mLanguage);
}
};
/**
* Create a tile data source for MBTiles vector databases.
*
* @param path the path to the MBTiles database.
* @param language the language to use when rendering the MBTiles.
*/
public MBTilesMvtTileDataSource(String path, String language) {
super(path);
mLanguage = language != null ? language : "en";
try {
assertDatabaseFormat();
} catch (MBTilesUnsupportedException e) {
log.error("Invalid MBTiles database", e);
}
}
@Override
public void cancel() {
// do nothing
}
@Override
public void dispose() {
if (mDatabase != null && mDatabase.isOpen())
mDatabase.close();
}
@Override
public List<String> getSupportedFormats() {
return SUPPORTED_FORMATS;
}
private MapTile mapTile(Cursor cursor) {
int tileX = cursor.getInt(cursor.getColumnIndexOrThrow("tile_column"));
int tileY = cursor.getInt(cursor.getColumnIndexOrThrow("tile_row"));
int zoomLevel = cursor.getInt(cursor.getColumnIndexOrThrow("zoom_level"));
long tmsTileY = MercatorProjection.tileYToTMS(tileY, (byte) zoomLevel);
return new MapTile(tileX, (int) tmsTileY, zoomLevel);
}
/**
* Overzoom on the DB layer: generate a query for all tiles with lower zoomLevel than the one requested.
*/
private String overzoomQuery(MapTile tile) {
long tmsTileY = MercatorProjection.tileYToTMS(tile.tileY, tile.zoomLevel);
StringBuilder sb = new StringBuilder();
sb.append("(");
for (int zoomLevel = tile.zoomLevel - 1; zoomLevel > 0; zoomLevel--) {
int diff = tile.zoomLevel - zoomLevel;
sb.append(String.format(Locale.US, WHERE_FORMAT, zoomLevel, tile.tileX >> diff, tmsTileY >> diff));
if (zoomLevel > 1) // Not the last iteration
sb.append(") OR (");
}
sb.append(")");
return String.format(SELECT_TILES_FORMAT, sb.toString());
}
@Override
public void query(MapTile requestTile, ITileDataSink requestDataSink) {
Cursor cursor = null;
ITileDataSink responseDataSink = requestDataSink;
try {
long tmsTileY = MercatorProjection.tileYToTMS(requestTile.tileY, requestTile.zoomLevel);
cursor = mDatabase.rawQuery(String.format(SELECT_TILES_FORMAT, String.format(Locale.US, WHERE_FORMAT, requestTile.zoomLevel, requestTile.tileX, tmsTileY)), null);
if (cursor.getCount() == 0) {
cursor.close();
cursor = mDatabase.rawQuery(overzoomQuery(requestTile), null);
}
if (cursor.moveToFirst()) {
byte[] bytes = cursor.getBlob(cursor.getColumnIndexOrThrow("tile_data"));
MapTile responseTile = mapTile(cursor);
if (requestTile.zoomLevel != responseTile.zoomLevel)
responseDataSink = new OverzoomDataSink(requestDataSink, responseTile, requestTile);
boolean success = mThreadLocalDecoders.get().decode(responseTile, responseDataSink, new GZIPInputStream(new ByteArrayInputStream(bytes)));
responseDataSink.completed(success ? QueryResult.SUCCESS : QueryResult.FAILED);
} else
responseDataSink.completed(QueryResult.TILE_NOT_FOUND);
} catch (IOException e) {
responseDataSink.completed(QueryResult.FAILED);
} finally {
if (cursor != null)
cursor.close();
}
}
}

View File

@@ -0,0 +1,42 @@
/*
* Copyright 2019 Kostas Tzounopoulos
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.mvt.tiling.source.mbtiles;
import org.oscim.android.tiling.source.mbtiles.MBTilesTileSource;
/**
* A tile source for MBTiles vector databases.
*/
public class MBTilesMvtTileSource extends MBTilesTileSource {
/**
* Create a tile source for MBTiles vector databases.
*
* @param path the path to the MBTiles database.
*/
public MBTilesMvtTileSource(String path) {
this(path, null);
}
/**
* Create a tile source for MBTiles vector databases.
*
* @param path the path to the MBTiles database.
* @param language the language to use when rendering the MBTiles.
*/
public MBTilesMvtTileSource(String path, String language) {
super(new MBTilesMvtTileDataSource(path, language));
}
}

View File

@@ -3,7 +3,7 @@ apply plugin: 'com.github.dcendents.android-maven'
dependencies {
api project(':vtm')
api 'com.caverock:androidsvg:1.3'
api 'com.caverock:androidsvg:1.4'
}
android {
@@ -16,8 +16,8 @@ android {
}
defaultConfig {
versionCode versionCode()
versionName versionName()
versionCode project.versionCode()
versionName project.versionName()
minSdkVersion androidMinSdk()
targetSdkVersion androidTargetSdk()
}

View File

@@ -28,7 +28,6 @@ import android.util.DisplayMetrics;
import android.view.Display;
import android.view.GestureDetector;
import android.view.WindowManager;
import org.oscim.android.canvas.AndroidGraphics;
import org.oscim.android.gl.AndroidGL;
import org.oscim.android.gl.AndroidGL30;
@@ -47,11 +46,10 @@ import org.oscim.utils.Parameters;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* The MapView,
@@ -67,12 +65,21 @@ public class MapView extends GLSurfaceView {
private static final Pattern GL_PATTERN = Pattern.compile("OpenGL ES (\\d(\\.\\d){0,2})");
/**
* Target OpenGL ES version, if not available fall back to OpenGL ES 2.0
* OpenGL ES 2.0 default on Android for performance / stability.
* Any larger not available versions fall back to OpenGL ES 2.0.
*/
public static double targetGLESVersion = 3.0;
public static double OPENGL_VERSION = 2.0;
private static void init() {
System.loadLibrary("vtm-jni");
if (Parameters.THREADED_INIT)
new Thread(new Runnable() {
@Override
public void run() {
System.loadLibrary("vtm-jni");
}
}).start();
else
System.loadLibrary("vtm-jni");
}
protected AndroidMap mMap;
@@ -127,11 +134,19 @@ public class MapView extends GLSurfaceView {
mMap = new AndroidMap(this);
/* Initialize Renderer */
try {
setEGLContextFactory(new GlContextFactory());
} catch (Throwable t) {
log.error("Falling back to GLES 2", t);
if (OPENGL_VERSION == 2.0)
setEGLContextClientVersion(2);
else {
// OpenGL ES 3.0 is supported with Android 4.3 (API level 18) and higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
try {
setEGLContextFactory(new GlContextFactory());
} catch (Throwable t) {
log.error("Falling back to GLES 2", t);
setEGLContextClientVersion(2);
}
} else
setEGLContextClientVersion(2);
}
setEGLConfigChooser(new GlConfigChooser());
@@ -344,23 +359,27 @@ public class MapView extends GLSurfaceView {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
try {
// Create a minimum supported OpenGL ES context, then check:
String versionString = gl.glGetString(GL10.GL_VERSION);
log.info("Version: " + versionString);
// The version format is displayed as: "OpenGL ES <major>.<minor>"
// followed by optional content provided by the implementation.
// OpenGL<space>ES<space><version number><space><vendor-specific information>.
int[] version = extractVersion(versionString);
int majorVersion = version[0];
if (majorVersion >= 3)
GLAdapter.init(new AndroidGL30());
else
GLAdapter.init(new AndroidGL());
} catch (Throwable t) {
log.error("Falling back to GLES 2", t);
if (OPENGL_VERSION == 2.0)
GLAdapter.init(new AndroidGL());
else {
try {
// Create a minimum supported OpenGL ES context, then check:
String versionString = gl.glGetString(GL10.GL_VERSION);
log.info("Version: " + versionString);
// The version format is displayed as: "OpenGL ES <major>.<minor>"
// followed by optional content provided by the implementation.
// OpenGL<space>ES<space><version number><space><vendor-specific information>.
int[] version = extractVersion(versionString);
int majorVersion = Math.min(version[0], (int) OPENGL_VERSION);
if (majorVersion >= 3)
GLAdapter.init(new AndroidGL30());
else
GLAdapter.init(new AndroidGL());
} catch (Throwable t) {
log.error("Falling back to GLES 2", t);
GLAdapter.init(new AndroidGL());
}
}
super.onSurfaceCreated();

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2016-2017 devemux86
* Copyright 2016-2019 devemux86
* Copyright 2017 nebular
* Copyright 2017 Longri
*
@@ -21,8 +21,8 @@ package org.oscim.android.canvas;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import org.oscim.backend.canvas.Bitmap;
import org.oscim.backend.canvas.Canvas;
import org.oscim.backend.canvas.Paint;
@@ -93,6 +93,7 @@ public class AndroidCanvas implements Canvas {
RectF rect = new RectF(x, y, x + width, y + height);
android.graphics.Paint paint = new android.graphics.Paint();
paint.setColor(color);
paint.setXfermode(new PorterDuffXfermode(color == Color.TRANSPARENT ? PorterDuff.Mode.CLEAR : PorterDuff.Mode.SRC_OVER));
canvas.drawRect(rect, paint);
}

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2010, 2011, 2012 mapsforge.org
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
* Copyright 2017 Longri
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
@@ -22,7 +22,7 @@ import android.content.res.Resources;
import android.graphics.Bitmap.Config;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.Platform;
import org.oscim.backend.canvas.Bitmap;
@@ -90,7 +90,7 @@ public final class AndroidGraphics extends CanvasAdapter {
//-------------------------------------
public static Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P && drawable instanceof BitmapDrawable) {
return new AndroidBitmap(((BitmapDrawable) drawable).getBitmap());
}

View File

@@ -28,7 +28,6 @@
package org.oscim.android.gl;
import android.opengl.GLSurfaceView;
import org.oscim.android.MapView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,18 +50,18 @@ public class GlContextFactory implements GLSurfaceView.EGLContextFactory {
@Override
public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
log.info("creating OpenGL ES " + MapView.targetGLESVersion + " context");
checkEglError("Before eglCreateContext " + MapView.targetGLESVersion, egl);
int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, (int) MapView.targetGLESVersion, EGL10.EGL_NONE};
log.info("creating OpenGL ES " + MapView.OPENGL_VERSION + " context");
checkEglError("Before eglCreateContext " + MapView.OPENGL_VERSION, egl);
int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, (int) MapView.OPENGL_VERSION, EGL10.EGL_NONE};
EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
boolean success = checkEglError("After eglCreateContext " + MapView.targetGLESVersion, egl);
boolean success = checkEglError("After eglCreateContext " + MapView.OPENGL_VERSION, egl);
if ((!success || context == null) && MapView.targetGLESVersion > 2) {
if ((!success || context == null) && MapView.OPENGL_VERSION > 2) {
log.warn("Falling back to GLES 2");
MapView.targetGLESVersion = 2.0;
MapView.OPENGL_VERSION = 2.0;
return createContext(egl, display, eglConfig);
}
log.info("Returning a GLES " + MapView.targetGLESVersion + " context");
log.info("Returning a GLES " + MapView.OPENGL_VERSION + " context");
return context;
}

View File

@@ -0,0 +1,155 @@
/*
* Copyright 2019 Andrea Antonello
* Copyright 2019 devemux86
* Copyright 2019 Kostas Tzounopoulos
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.tiling.source.mbtiles;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.canvas.Bitmap;
import org.oscim.core.MercatorProjection;
import org.oscim.layers.tile.MapTile;
import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.QueryResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.List;
/**
* A tile data source for MBTiles raster databases.
*/
public class MBTilesBitmapTileDataSource extends MBTilesTileDataSource {
private static final Logger log = LoggerFactory.getLogger(MBTilesBitmapTileDataSource.class);
private static final List<String> SUPPORTED_FORMATS = Arrays.asList("png", "jpg", "jpeg");
private final Integer mAlpha;
private final Integer mTransparentColor;
/**
* Create a tile data source for MBTiles raster databases.
*
* @param path the path to the MBTiles database.
* @param alpha an optional alpha value [0-255] to make the tiles transparent.
* @param transparentColor an optional color that will be made transparent in the bitmap.
*/
public MBTilesBitmapTileDataSource(String path, Integer alpha, Integer transparentColor) {
super(path);
mAlpha = alpha;
mTransparentColor = transparentColor;
try {
assertDatabaseFormat();
} catch (MBTilesUnsupportedException e) {
log.error("Invalid MBTiles database", e);
}
}
@Override
public void cancel() {
if (mDatabase != null && mDatabase.isOpen())
mDatabase.close();
}
@Override
public void dispose() {
if (mDatabase != null && mDatabase.isOpen())
mDatabase.close();
}
@Override
public List<String> getSupportedFormats() {
return SUPPORTED_FORMATS;
}
private static android.graphics.Bitmap processAlpha(android.graphics.Bitmap bitmap, int alpha) {
android.graphics.Bitmap newBitmap = android.graphics.Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), android.graphics.Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(newBitmap);
Paint paint = new Paint();
paint.setAlpha(alpha);
canvas.drawBitmap(bitmap, 0, 0, paint);
return newBitmap;
}
private static android.graphics.Bitmap processTransparentColor(android.graphics.Bitmap bitmap, int colorToRemove) {
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
for (int i = 0; i < pixels.length; i++) {
if (pixels[i] == colorToRemove)
pixels[i] = Color.alpha(Color.TRANSPARENT);
}
android.graphics.Bitmap newBitmap = android.graphics.Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), android.graphics.Bitmap.Config.ARGB_8888);
newBitmap.setPixels(pixels, 0, newBitmap.getWidth(), 0, 0, newBitmap.getWidth(), newBitmap.getHeight());
return newBitmap;
}
@Override
public void query(MapTile tile, ITileDataSink sink) {
QueryResult res = QueryResult.FAILED;
try {
byte[] bytes = readTile(tile.tileX, tile.tileY, tile.zoomLevel);
if (mTransparentColor != null || mAlpha != null) {
android.graphics.Bitmap androidBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
if (mTransparentColor != null)
androidBitmap = processTransparentColor(androidBitmap, mTransparentColor);
if (mAlpha != null)
androidBitmap = processAlpha(androidBitmap, mAlpha);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
androidBitmap.compress(android.graphics.Bitmap.CompressFormat.PNG, 100, bos);
bytes = bos.toByteArray();
}
Bitmap bitmap = CanvasAdapter.decodeBitmap(new ByteArrayInputStream(bytes));
sink.setTileImage(bitmap);
res = QueryResult.SUCCESS;
} catch (Exception e) {
log.debug("{} invalid bitmap", tile);
} finally {
sink.completed(res);
}
}
/**
* Read a Tile's image bytes from the MBTiles database.
*
* @param tileX the x tile index.
* @param tileY the y tile index (OSM notation).
* @param zoomLevel the zoom level.
* @return the tile image bytes.
*/
private byte[] readTile(int tileX, int tileY, byte zoomLevel) {
Cursor cursor = null;
try {
long tmsTileY = MercatorProjection.tileYToTMS(tileY, zoomLevel);
cursor = mDatabase.rawQuery(String.format(MBTilesTileDataSource.SELECT_TILES_FORMAT, MBTilesTileDataSource.WHERE_FORMAT), new String[]{String.valueOf(zoomLevel), String.valueOf(tileX), String.valueOf(tmsTileY)});
if (cursor.moveToFirst())
return cursor.getBlob(cursor.getColumnIndexOrThrow("tile_data"));
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
}

View File

@@ -0,0 +1,43 @@
/*
* Copyright 2019 Andrea Antonello
* Copyright 2019 devemux86
* Copyright 2019 Kostas Tzounopoulos
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.tiling.source.mbtiles;
/**
* A tile source for MBTiles raster databases.
*/
public class MBTilesBitmapTileSource extends MBTilesTileSource {
/**
* Create a tile source for MBTiles raster databases.
*
* @param path the path to the MBTiles database.
*/
public MBTilesBitmapTileSource(String path) {
this(path, null, null);
}
/**
* Create a tile source for MBTiles raster databases.
*
* @param path the path to the MBTiles database.
* @param alpha an optional alpha value [0-255] to make the tiles transparent.
* @param transparentColor an optional color that will be made transparent in the bitmap.
*/
public MBTilesBitmapTileSource(String path, Integer alpha, Integer transparentColor) {
super(new MBTilesBitmapTileDataSource(path, alpha, transparentColor));
}
}

View File

@@ -0,0 +1,154 @@
/*
* Copyright 2019 Andrea Antonello
* Copyright 2019 devemux86
* Copyright 2019 Kostas Tzounopoulos
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.tiling.source.mbtiles;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import org.oscim.core.BoundingBox;
import org.oscim.core.MapPosition;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* A tile data source for MBTiles databases.
*/
public abstract class MBTilesTileDataSource implements ITileDataSource {
private static final String SELECT_METADATA = "SELECT name, value FROM metadata";
protected static final String SELECT_TILES_FORMAT =
"SELECT zoom_level, tile_column, tile_row, tile_data " +
"FROM tiles " +
"WHERE %s " +
"ORDER BY zoom_level DESC " +
"LIMIT 1";
static final String WHERE_FORMAT = "zoom_level=? AND tile_column=? AND tile_row=?";
protected final SQLiteDatabase mDatabase;
private Map<String, String> mMetadata;
public MBTilesTileDataSource(String path) {
mDatabase = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
}
protected void assertDatabaseFormat() {
String format = getFormat();
if (format == null)
throw new RuntimeException("'metadata.format' field was not found. Is this an MBTiles database?");
List<String> supportedFormats = getSupportedFormats();
if (!supportedFormats.contains(format))
throw new MBTilesUnsupportedException(String.format("Unsupported MBTiles 'metadata.format: %s'. Supported format(s) are: %s", format, TextUtils.join(", ", supportedFormats)));
}
public String getAttribution() {
return getMetadata().get("attribution");
}
public BoundingBox getBounds() {
String bounds = getMetadata().get("bounds");
if (bounds == null)
return null;
String[] split = bounds.split(",");
double w = Double.parseDouble(split[0]);
double s = Double.parseDouble(split[1]);
double e = Double.parseDouble(split[2]);
double n = Double.parseDouble(split[3]);
return new BoundingBox(s, w, n, e);
}
public MapPosition getCenter() {
String center = getMetadata().get("center");
if (center == null)
return null;
String[] split = center.split(",");
double latitude = Double.parseDouble(split[1]);
double longitude = Double.parseDouble(split[0]);
int zoomLevel = Integer.parseInt(split[2]);
return new MapPosition(latitude, longitude, 1 << zoomLevel);
}
public String getDescription() {
return getMetadata().get("description");
}
public String getFormat() {
return getMetadata().get("format");
}
public String getId() {
return getMetadata().get("id");
}
public String getJson() {
return getMetadata().get("json");
}
public int getMaxZoom() {
String maxZoom = getMetadata().get("maxzoom");
return maxZoom != null ? Integer.parseInt(maxZoom) : Viewport.MAX_ZOOM_LEVEL;
}
private Map<String, String> getMetadata() {
if (mMetadata == null) {
mMetadata = new HashMap<>();
Cursor cursor = null;
try {
cursor = mDatabase.rawQuery(SELECT_METADATA, null);
while (cursor.moveToNext()) {
String key = cursor.getString(0);
String value = cursor.getString(1);
mMetadata.put(key, value);
}
} finally {
if (cursor != null)
cursor.close();
}
}
return mMetadata;
}
public int getMinZoom() {
String minZoom = getMetadata().get("minzoom");
return minZoom != null ? Integer.parseInt(minZoom) : Viewport.MIN_ZOOM_LEVEL;
}
public Long getMTime() {
String mTime = getMetadata().get("mtime");
return mTime != null ? Long.parseLong(mTime) : null;
}
public String getName() {
return getMetadata().get("name");
}
public Integer getPixelScale() {
String pixelScale = getMetadata().get("pixel_scale");
return pixelScale != null ? Integer.parseInt(pixelScale) : null;
}
abstract public List<String> getSupportedFormats();
public String getVersion() {
return getMetadata().get("version");
}
}

View File

@@ -1,6 +1,7 @@
/*
* Copyright 2017 Longri
* Copyright 2017-2018 devemux86
* Copyright 2019 Andrea Antonello
* Copyright 2019 devemux86
* Copyright 2019 Kostas Tzounopoulos
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -13,25 +14,33 @@
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.android.test;
package org.oscim.android.tiling.source.mbtiles;
import android.os.Bundle;
import org.oscim.tiling.TileSource;
import org.oscim.utils.Parameters;
/**
* A tile source for MBTiles databases.
*/
public abstract class MBTilesTileSource extends TileSource {
public class AtlasThemeActivity extends SimpleMapActivity {
private final MBTilesTileDataSource mTileDataSource;
@Override
public void onCreate(Bundle savedInstanceState) {
Parameters.TEXTURE_ATLAS = true;
super.onCreate(savedInstanceState);
public MBTilesTileSource(MBTilesTileDataSource tileDataSource) {
mTileDataSource = tileDataSource;
}
@Override
protected void onDestroy() {
super.onDestroy();
public void close() {
getDataSource().dispose();
}
Parameters.TEXTURE_ATLAS = false;
@Override
public MBTilesTileDataSource getDataSource() {
return mTileDataSource;
}
@Override
public OpenResult open() {
return OpenResult.SUCCESS;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2016-2017 devemux86
* Copyright 2019 Kostas Tzounopoulos
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -12,17 +12,10 @@
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.test;
package org.oscim.android.tiling.source.mbtiles;
import org.oscim.gdx.GdxMapApp;
import org.oscim.utils.Parameters;
public class MapEventLayer2Test extends MarkerLayerTest {
public static void main(String[] args) {
Parameters.MAP_EVENT_LAYER2 = true;
GdxMapApp.init();
GdxMapApp.run(new MapEventLayer2Test());
public class MBTilesUnsupportedException extends RuntimeException {
public MBTilesUnsupportedException(String message) {
super(message);
}
}

View File

@@ -9,7 +9,6 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:name=".App"

View File

@@ -4,7 +4,8 @@ dependencies {
implementation project(':vtm-android')
implementation project(':vtm-extras')
implementation project(':vtm-themes')
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
// https://github.com/square/okhttp/issues/4481
implementation 'com.squareup.okhttp3:okhttp:3.12.5'
implementation "org.slf4j:slf4j-android:$slf4jVersion"
}
@@ -18,8 +19,8 @@ android {
}
defaultConfig {
versionCode versionCode()
versionName versionName()
versionCode project.versionCode()
versionName project.versionName()
minSdkVersion androidMinSdk()
targetSdkVersion androidTargetSdk()
}

View File

@@ -19,9 +19,7 @@ package org.oscim.app;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Environment;
import android.preference.PreferenceManager;
import org.oscim.android.cache.TileCache;
import org.oscim.layers.GenericLayer;
import org.oscim.layers.Layer;
@@ -67,7 +65,7 @@ public class MapLayers {
@Override
TileSource init() {
return new MapFileTileSource().setOption("file",
new File(Environment.getExternalStorageDirectory(), "berlin.map").getAbsolutePath());
new File("/sdcard/berlin.map").getAbsolutePath());
}
}, new Config("MAPNIK_VECTOR") {
@Override

View File

@@ -1,6 +1,6 @@
/* Copyright 2010, 2011, 2012 mapsforge.org
* Copyright 2012 Hannes Janetzek
* Copyright 2016-2017 devemux86
* Copyright 2016-2019 devemux86
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -15,11 +15,13 @@
*/
package org.oscim.app;
import android.Manifest;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@@ -73,6 +75,11 @@ public class TileMap extends MapActivity implements MapEventsReceiver {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
}
setContentView(R.layout.activity_tilemap);
App.view = (MapView) findViewById(R.id.mapView);
registerMapView(App.view);

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2010, 2011, 2012 mapsforge.org
* Copyright 2016 devemux86
* Copyright 2016-2019 devemux86
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -24,11 +24,9 @@ import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import org.oscim.app.R;
import org.oscim.app.filefilter.ValidFileFilter;
@@ -62,7 +60,6 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
public static final String SELECTED_FILE = "selectedFile";
private static final String CURRENT_DIRECTORY = "currentDirectory";
private static final String DEFAULT_DIRECTORY = Environment.getExternalStorageDirectory().getAbsolutePath();
private static final int DIALOG_FILE_INVALID = 0;
// private static final int DIALOG_FILE_SELECT = 1;
private static Comparator<File> fileComparator = getDefaultFileComparator();
@@ -125,6 +122,7 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
}
private File currentDirectory;
private String defaultDirectory;
private FilePickerIconAdapter filePickerIconAdapter;
private File[] files;
private File[] filesWithParentFolder;
@@ -166,7 +164,7 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
}
// if a parent directory exists, add it at the first position
if (this.currentDirectory.getParentFile() != null) {
if (this.currentDirectory.getParentFile() != null && this.currentDirectory.getParentFile().canRead()) {
this.filesWithParentFolder = new File[this.files.length + 1];
this.filesWithParentFolder[0] = this.currentDirectory.getParentFile();
System.arraycopy(this.files, 0, this.filesWithParentFolder, 1,
@@ -184,6 +182,7 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_picker);
defaultDirectory = getExternalFilesDir(null) != null ? getExternalFilesDir(null).getAbsolutePath() : "/sdcard/";
this.filePickerIconAdapter = new FilePickerIconAdapter(this);
GridView gridView = (GridView) findViewById(R.id.filePickerView);
gridView.setOnItemClickListener(this);
@@ -254,10 +253,9 @@ public class FilePicker extends Activity implements AdapterView.OnItemClickListe
// restore the current directory
SharedPreferences preferences = getSharedPreferences(PREFERENCES_FILE,
MODE_PRIVATE);
this.currentDirectory = new File(preferences.getString(CURRENT_DIRECTORY,
DEFAULT_DIRECTORY));
this.currentDirectory = new File(preferences.getString(CURRENT_DIRECTORY, defaultDirectory));
if (!this.currentDirectory.exists() || !this.currentDirectory.canRead()) {
this.currentDirectory = new File(DEFAULT_DIRECTORY);
this.currentDirectory = new File(defaultDirectory);
}
browseToCurrentDirectory();
}

View File

@@ -1,7 +1,7 @@
/*
* Copyright 2013 Ahmad Saleem
* Copyright 2013 Hannes Janetzek
* Copyright 2016-2017 devemux86
* Copyright 2016-2019 devemux86
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -24,19 +24,17 @@ import android.hardware.SensorManager;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import org.oscim.app.App;
import org.oscim.app.R;
import org.oscim.core.MapPosition;
import org.oscim.event.Event;
import org.oscim.layers.Layer;
import org.oscim.map.Map;
import org.oscim.renderer.LocationRenderer;
import org.oscim.renderer.LocationCallback;
import org.oscim.utils.FastMath;
@SuppressWarnings("deprecation")
public class Compass extends Layer implements SensorEventListener, Map.UpdateListener,
LocationRenderer.Callback {
public class Compass extends Layer implements SensorEventListener, Map.UpdateListener, LocationCallback {
// static final Logger log = LoggerFactory.getLogger(Compass.class);

View File

@@ -0,0 +1,19 @@
apply plugin: 'java-library'
apply plugin: 'maven'
dependencies {
api project(':vtm-desktop')
api "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion"
}
sourceSets {
main {
java.srcDirs = ['src']
}
}
if (project.hasProperty("SONATYPE_USERNAME")) {
afterEvaluate {
project.apply from: "${rootProject.projectDir}/deploy.gradle"
}
}

View File

@@ -23,7 +23,6 @@ import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.graphics.glutils.GLVersion;
import com.badlogic.gdx.utils.SharedLibraryLoader;
import org.oscim.awt.AwtGraphics;
import org.oscim.backend.DateTime;
import org.oscim.backend.DateTimeAdapter;
@@ -66,7 +65,7 @@ public class GdxMapApp extends GdxMap {
protected static LwjglApplicationConfiguration getConfig(String title) {
LwjglApplicationConfiguration.disableAudio = true;
LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
cfg.title = title != null ? title : "vtm-gdx";
cfg.title = title != null ? title : "vtm-gdx-lwjgl";
int[] sizes = new int[]{128, 64, 32, 16};
for (int size : sizes) {

View File

@@ -33,23 +33,11 @@
package org.oscim.gdx;
import com.badlogic.gdx.utils.GdxRuntimeException;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.EXTFramebufferObject;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL14;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.*;
import org.oscim.backend.GL;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import java.nio.*;
/**
* An implementation of the {@link GL20} interface based on LWJGL. Note that LWJGL shaders and OpenGL ES shaders will not be 100%

View File

@@ -17,32 +17,14 @@
package org.oscim.gdx;
import com.badlogic.gdx.utils.GdxRuntimeException;
import org.lwjgl.opengl.*;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL21;
import org.lwjgl.opengl.GL31;
import org.lwjgl.opengl.GL32;
import org.lwjgl.opengl.GL33;
import org.lwjgl.opengl.GL40;
import org.lwjgl.opengl.GL41;
import org.lwjgl.opengl.GL43;
import org.oscim.backend.GL30;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;
import java.nio.ShortBuffer;
import java.nio.*;
/**
* See https://github.com/libgdx/libgdx/blob/master/backends/gdx-backend-lwjgl3/src/com/badlogic/gdx/backends/lwjgl3/Lwjgl3GL30.java
* See https://github.com/libgdx/libgdx/blob/master/backends/gdx-backend-lwjgl/src/com/badlogic/gdx/backends/lwjgl/LwjglGL30.java
*/
public class LwjglGL30 extends LwjglGL20 implements GL30 {
public class LwjglGL30 extends LwjglGL20 implements org.oscim.backend.GL30 {
@Override
public void readBuffer(int mode) {
GL11.glReadBuffer(mode);
@@ -222,246 +204,246 @@ public class LwjglGL30 extends LwjglGL20 implements GL30 {
@Override
public void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1,
int mask, int filter) {
org.lwjgl.opengl.GL30.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
GL30.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
}
@Override
public void bindFramebuffer(int target, int framebuffer) {
org.lwjgl.opengl.GL30.glBindFramebuffer(target, framebuffer);
GL30.glBindFramebuffer(target, framebuffer);
}
@Override
public void bindRenderbuffer(int target, int renderbuffer) {
org.lwjgl.opengl.GL30.glBindRenderbuffer(target, renderbuffer);
GL30.glBindRenderbuffer(target, renderbuffer);
}
@Override
public int checkFramebufferStatus(int target) {
return org.lwjgl.opengl.GL30.glCheckFramebufferStatus(target);
return GL30.glCheckFramebufferStatus(target);
}
@Override
public void deleteFramebuffers(int n, IntBuffer framebuffers) {
org.lwjgl.opengl.GL30.glDeleteFramebuffers(framebuffers);
GL30.glDeleteFramebuffers(framebuffers);
}
@Override
public void deleteFramebuffer(int framebuffer) {
org.lwjgl.opengl.GL30.glDeleteFramebuffers(framebuffer);
GL30.glDeleteFramebuffers(framebuffer);
}
@Override
public void deleteRenderbuffers(int n, IntBuffer renderbuffers) {
org.lwjgl.opengl.GL30.glDeleteRenderbuffers(renderbuffers);
GL30.glDeleteRenderbuffers(renderbuffers);
}
@Override
public void deleteRenderbuffer(int renderbuffer) {
org.lwjgl.opengl.GL30.glDeleteRenderbuffers(renderbuffer);
GL30.glDeleteRenderbuffers(renderbuffer);
}
@Override
public void generateMipmap(int target) {
org.lwjgl.opengl.GL30.glGenerateMipmap(target);
GL30.glGenerateMipmap(target);
}
@Override
public void genFramebuffers(int n, IntBuffer framebuffers) {
org.lwjgl.opengl.GL30.glGenFramebuffers(framebuffers);
GL30.glGenFramebuffers(framebuffers);
}
@Override
public int genFramebuffer() {
return org.lwjgl.opengl.GL30.glGenFramebuffers();
return GL30.glGenFramebuffers();
}
@Override
public void genRenderbuffers(int n, IntBuffer renderbuffers) {
org.lwjgl.opengl.GL30.glGenRenderbuffers(renderbuffers);
GL30.glGenRenderbuffers(renderbuffers);
}
@Override
public int genRenderbuffer() {
return org.lwjgl.opengl.GL30.glGenRenderbuffers();
return GL30.glGenRenderbuffers();
}
@Override
public void getRenderbufferParameteriv(int target, int pname, IntBuffer params) {
org.lwjgl.opengl.GL30.glGetRenderbufferParameter(target, pname, params);
GL30.glGetRenderbufferParameter(target, pname, params);
}
@Override
public boolean isFramebuffer(int framebuffer) {
return org.lwjgl.opengl.GL30.glIsFramebuffer(framebuffer);
return GL30.glIsFramebuffer(framebuffer);
}
@Override
public boolean isRenderbuffer(int renderbuffer) {
return org.lwjgl.opengl.GL30.glIsRenderbuffer(renderbuffer);
return GL30.glIsRenderbuffer(renderbuffer);
}
@Override
public void renderbufferStorage(int target, int internalformat, int width, int height) {
org.lwjgl.opengl.GL30.glRenderbufferStorage(target, internalformat, width, height);
GL30.glRenderbufferStorage(target, internalformat, width, height);
}
@Override
public void renderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) {
org.lwjgl.opengl.GL30.glRenderbufferStorageMultisample(target, samples, internalformat, width, height);
GL30.glRenderbufferStorageMultisample(target, samples, internalformat, width, height);
}
@Override
public void framebufferTexture2D(int target, int attachment, int textarget, int texture, int level) {
org.lwjgl.opengl.GL30.glFramebufferTexture2D(target, attachment, textarget, texture, level);
GL30.glFramebufferTexture2D(target, attachment, textarget, texture, level);
}
@Override
public void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) {
org.lwjgl.opengl.GL30.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
GL30.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
}
@Override
public void framebufferTextureLayer(int target, int attachment, int texture, int level, int layer) {
org.lwjgl.opengl.GL30.glFramebufferTextureLayer(target, attachment, texture, level, layer);
GL30.glFramebufferTextureLayer(target, attachment, texture, level, layer);
}
@Override
public void flushMappedBufferRange(int target, int offset, int length) {
org.lwjgl.opengl.GL30.glFlushMappedBufferRange(target, offset, length);
GL30.glFlushMappedBufferRange(target, offset, length);
}
@Override
public void bindVertexArray(int array) {
org.lwjgl.opengl.GL30.glBindVertexArray(array);
GL30.glBindVertexArray(array);
}
@Override
public void deleteVertexArrays(int n, int[] arrays, int offset) {
for (int i = offset; i < offset + n; i++) {
org.lwjgl.opengl.GL30.glDeleteVertexArrays(arrays[i]);
GL30.glDeleteVertexArrays(arrays[i]);
}
}
@Override
public void deleteVertexArrays(int n, IntBuffer arrays) {
org.lwjgl.opengl.GL30.glDeleteVertexArrays(arrays);
GL30.glDeleteVertexArrays(arrays);
}
@Override
public void genVertexArrays(int n, int[] arrays, int offset) {
for (int i = offset; i < offset + n; i++) {
arrays[i] = org.lwjgl.opengl.GL30.glGenVertexArrays();
arrays[i] = GL30.glGenVertexArrays();
}
}
@Override
public void genVertexArrays(int n, IntBuffer arrays) {
org.lwjgl.opengl.GL30.glGenVertexArrays(arrays);
GL30.glGenVertexArrays(arrays);
}
@Override
public boolean isVertexArray(int array) {
return org.lwjgl.opengl.GL30.glIsVertexArray(array);
return GL30.glIsVertexArray(array);
}
@Override
public void beginTransformFeedback(int primitiveMode) {
org.lwjgl.opengl.GL30.glBeginTransformFeedback(primitiveMode);
GL30.glBeginTransformFeedback(primitiveMode);
}
@Override
public void endTransformFeedback() {
org.lwjgl.opengl.GL30.glEndTransformFeedback();
GL30.glEndTransformFeedback();
}
@Override
public void bindBufferRange(int target, int index, int buffer, int offset, int size) {
org.lwjgl.opengl.GL30.glBindBufferRange(target, index, buffer, offset, size);
GL30.glBindBufferRange(target, index, buffer, offset, size);
}
@Override
public void bindBufferBase(int target, int index, int buffer) {
org.lwjgl.opengl.GL30.glBindBufferBase(target, index, buffer);
GL30.glBindBufferBase(target, index, buffer);
}
@Override
public void transformFeedbackVaryings(int program, String[] varyings, int bufferMode) {
org.lwjgl.opengl.GL30.glTransformFeedbackVaryings(program, varyings, bufferMode);
GL30.glTransformFeedbackVaryings(program, varyings, bufferMode);
}
@Override
public void vertexAttribIPointer(int index, int size, int type, int stride, int offset) {
org.lwjgl.opengl.GL30.glVertexAttribIPointer(index, size, type, stride, offset);
GL30.glVertexAttribIPointer(index, size, type, stride, offset);
}
@Override
public void getVertexAttribIiv(int index, int pname, IntBuffer params) {
org.lwjgl.opengl.GL30.glGetVertexAttribI(index, pname, params);
GL30.glGetVertexAttribI(index, pname, params);
}
@Override
public void getVertexAttribIuiv(int index, int pname, IntBuffer params) {
org.lwjgl.opengl.GL30.glGetVertexAttribIu(index, pname, params);
GL30.glGetVertexAttribIu(index, pname, params);
}
@Override
public void vertexAttribI4i(int index, int x, int y, int z, int w) {
org.lwjgl.opengl.GL30.glVertexAttribI4i(index, x, y, z, w);
GL30.glVertexAttribI4i(index, x, y, z, w);
}
@Override
public void vertexAttribI4ui(int index, int x, int y, int z, int w) {
org.lwjgl.opengl.GL30.glVertexAttribI4ui(index, x, y, z, w);
GL30.glVertexAttribI4ui(index, x, y, z, w);
}
@Override
public void getUniformuiv(int program, int location, IntBuffer params) {
org.lwjgl.opengl.GL30.glGetUniformu(program, location, params);
GL30.glGetUniformu(program, location, params);
}
@Override
public int getFragDataLocation(int program, String name) {
return org.lwjgl.opengl.GL30.glGetFragDataLocation(program, name);
return GL30.glGetFragDataLocation(program, name);
}
@Override
public void uniform1uiv(int location, int count, IntBuffer value) {
org.lwjgl.opengl.GL30.glUniform1u(location, value);
GL30.glUniform1u(location, value);
}
@Override
public void uniform3uiv(int location, int count, IntBuffer value) {
org.lwjgl.opengl.GL30.glUniform3u(location, value);
GL30.glUniform3u(location, value);
}
@Override
public void uniform4uiv(int location, int count, IntBuffer value) {
org.lwjgl.opengl.GL30.glUniform4u(location, value);
GL30.glUniform4u(location, value);
}
@Override
public void clearBufferiv(int buffer, int drawbuffer, IntBuffer value) {
org.lwjgl.opengl.GL30.glClearBuffer(buffer, drawbuffer, value);
GL30.glClearBuffer(buffer, drawbuffer, value);
}
@Override
public void clearBufferuiv(int buffer, int drawbuffer, IntBuffer value) {
org.lwjgl.opengl.GL30.glClearBufferu(buffer, drawbuffer, value);
GL30.glClearBufferu(buffer, drawbuffer, value);
}
@Override
public void clearBufferfv(int buffer, int drawbuffer, FloatBuffer value) {
org.lwjgl.opengl.GL30.glClearBuffer(buffer, drawbuffer, value);
GL30.glClearBuffer(buffer, drawbuffer, value);
}
@Override
public void clearBufferfi(int buffer, int drawbuffer, float depth, int stencil) {
org.lwjgl.opengl.GL30.glClearBufferfi(buffer, drawbuffer, depth, stencil);
GL30.glClearBufferfi(buffer, drawbuffer, depth, stencil);
}
@Override
public String getStringi(int name, int index) {
return org.lwjgl.opengl.GL30.glGetStringi(name, index);
return GL30.glGetStringi(name, index);
}
@Override

View File

@@ -0,0 +1,19 @@
apply plugin: 'java-library'
apply plugin: 'maven'
dependencies {
api project(':vtm-desktop')
api "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion"
}
sourceSets {
main {
java.srcDirs = ['src']
}
}
if (project.hasProperty("SONATYPE_USERNAME")) {
afterEvaluate {
project.apply from: "${rootProject.projectDir}/deploy.gradle"
}
}

View File

@@ -0,0 +1,105 @@
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2018-2019 Gustl22
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.gdx;
import com.badlogic.gdx.Files;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration;
import com.badlogic.gdx.graphics.glutils.GLVersion;
import com.badlogic.gdx.utils.SharedLibraryLoader;
import org.oscim.awt.AwtGraphics;
import org.oscim.backend.DateTime;
import org.oscim.backend.DateTimeAdapter;
import org.oscim.backend.GLAdapter;
import org.oscim.core.Tile;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
import org.oscim.utils.FastMath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class GdxMapApp extends GdxMap {
public static final Logger log = LoggerFactory.getLogger(GdxMapApp.class);
public static void init() {
// load native library
new SharedLibraryLoader().load("vtm-jni");
// init globals
AwtGraphics.init();
GdxAssets.init("assets/");
DateTimeAdapter.init(new DateTime());
}
public static void main(String[] args) {
init();
new Lwjgl3Application(new GdxMapApp(), getConfig(null));
}
public static void run(GdxMap map) {
run(map, null, Tile.SIZE);
}
public static void run(GdxMap map, Lwjgl3ApplicationConfiguration config, int tileSize) {
Tile.SIZE = FastMath.clamp(tileSize, 128, 512);
new Lwjgl3Application(map, (config == null ? getConfig(map.getClass().getSimpleName()) : config));
}
protected static Lwjgl3ApplicationConfiguration getConfig(String title) {
Lwjgl3ApplicationConfiguration cfg = new Lwjgl3ApplicationConfiguration();
cfg.disableAudio(true);
cfg.setTitle(title != null ? title : "vtm-gdx-lwjgl3");
int[] sizes = new int[]{128, 64, 32, 16};
String[] paths = new String[sizes.length];
for (int i = 0; i < paths.length; i++)
paths[i] = "res/ic_vtm_" + sizes[i] + ".png";
cfg.setWindowIcon(Files.FileType.Internal, paths);
cfg.setWindowedMode(1024, 768);
cfg.setBackBufferConfig(8, 8, 8, 8, 16, 8, /*2*/0);
//cfg.useOpenGL3(true, 3, 2);
cfg.setIdleFPS(10);
//cfg.forceExit = false;
return cfg;
}
@Override
protected void initGLAdapter(GLVersion version) {
if (version.getMajorVersion() >= 3)
GLAdapter.init(new Lwjgl3GL30());
else
GLAdapter.init(new Lwjgl3GL20());
}
@Override
public void createLayers() {
TileSource tileSource = new OSciMap4TileSource();
initDefaultLayers(tileSource, false, true, true);
mMap.setMapPosition(0, 0, 1 << 2);
}
@Override
public void dispose() {
System.exit(0);
}
}

View File

@@ -0,0 +1,997 @@
/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.oscim.gdx;
import com.badlogic.gdx.utils.GdxRuntimeException;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.*;
import org.oscim.backend.GL;
import java.nio.*;
/**
* See https://github.com/libgdx/libgdx/blob/master/backends/gdx-backend-lwjgl3/src/com/badlogic/gdx/backends/lwjgl3/Lwjgl3GL20.java
*/
public class Lwjgl3GL20 implements GL {
private ByteBuffer buffer = null;
private FloatBuffer floatBuffer = null;
private IntBuffer intBuffer = null;
private void ensureBufferCapacity(int numBytes) {
if (buffer == null || buffer.capacity() < numBytes) {
buffer = com.badlogic.gdx.utils.BufferUtils.newByteBuffer(numBytes);
floatBuffer = buffer.asFloatBuffer();
intBuffer = buffer.asIntBuffer();
}
}
private FloatBuffer toFloatBuffer(float v[], int offset, int count) {
ensureBufferCapacity(count << 2);
floatBuffer.clear();
floatBuffer.limit(count);
floatBuffer.put(v, offset, count);
floatBuffer.position(0);
return floatBuffer;
}
private IntBuffer toIntBuffer(int v[], int offset, int count) {
ensureBufferCapacity(count << 2);
intBuffer.clear();
intBuffer.limit(count);
intBuffer.put(v, offset, count);
intBuffer.position(0);
return intBuffer;
}
@Override
public void activeTexture(int texture) {
GL13.glActiveTexture(texture);
}
@Override
public void attachShader(int program, int shader) {
GL20.glAttachShader(program, shader);
}
@Override
public void bindAttribLocation(int program, int index, String name) {
GL20.glBindAttribLocation(program, index, name);
}
@Override
public void bindBuffer(int target, int buffer) {
GL15.glBindBuffer(target, buffer);
}
@Override
public void bindFramebuffer(int target, int framebuffer) {
EXTFramebufferObject.glBindFramebufferEXT(target, framebuffer);
}
@Override
public void bindRenderbuffer(int target, int renderbuffer) {
EXTFramebufferObject.glBindRenderbufferEXT(target, renderbuffer);
}
@Override
public void bindTexture(int target, int texture) {
GL11.glBindTexture(target, texture);
}
@Override
public void blendColor(float red, float green, float blue, float alpha) {
GL14.glBlendColor(red, green, blue, alpha);
}
@Override
public void blendEquation(int mode) {
GL14.glBlendEquation(mode);
}
@Override
public void blendEquationSeparate(int modeRGB, int modeAlpha) {
GL20.glBlendEquationSeparate(modeRGB, modeAlpha);
}
@Override
public void blendFunc(int sfactor, int dfactor) {
GL11.glBlendFunc(sfactor, dfactor);
}
@Override
public void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) {
GL14.glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
}
@Override
public void bufferData(int target, int size, Buffer data, int usage) {
if (data == null)
GL15.glBufferData(target, size, usage);
else if (data instanceof ByteBuffer)
GL15.glBufferData(target, (ByteBuffer) data, usage);
else if (data instanceof IntBuffer)
GL15.glBufferData(target, (IntBuffer) data, usage);
else if (data instanceof FloatBuffer)
GL15.glBufferData(target, (FloatBuffer) data, usage);
else if (data instanceof DoubleBuffer)
GL15.glBufferData(target, (DoubleBuffer) data, usage);
else if (data instanceof ShortBuffer) //
GL15.glBufferData(target, (ShortBuffer) data, usage);
}
@Override
public void bufferSubData(int target, int offset, int size, Buffer data) {
if (data == null)
throw new GdxRuntimeException("Using null for the data not possible, blame LWJGL");
else if (data instanceof ByteBuffer)
GL15.glBufferSubData(target, offset, (ByteBuffer) data);
else if (data instanceof IntBuffer)
GL15.glBufferSubData(target, offset, (IntBuffer) data);
else if (data instanceof FloatBuffer)
GL15.glBufferSubData(target, offset, (FloatBuffer) data);
else if (data instanceof DoubleBuffer)
GL15.glBufferSubData(target, offset, (DoubleBuffer) data);
else if (data instanceof ShortBuffer) //
GL15.glBufferSubData(target, offset, (ShortBuffer) data);
}
@Override
public int checkFramebufferStatus(int target) {
return EXTFramebufferObject.glCheckFramebufferStatusEXT(target);
}
@Override
public void clear(int mask) {
GL11.glClear(mask);
}
@Override
public void clearColor(float red, float green, float blue, float alpha) {
GL11.glClearColor(red, green, blue, alpha);
}
@Override
public void clearDepthf(float depth) {
GL11.glClearDepth(depth);
}
@Override
public void clearStencil(int s) {
GL11.glClearStencil(s);
}
@Override
public void colorMask(boolean red, boolean green, boolean blue, boolean alpha) {
GL11.glColorMask(red, green, blue, alpha);
}
@Override
public void compileShader(int shader) {
GL20.glCompileShader(shader);
}
@Override
public void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border,
int imageSize, Buffer data) {
if (data instanceof ByteBuffer) {
GL13.glCompressedTexImage2D(target, level, internalformat, width, height, border, (ByteBuffer) data);
} else {
throw new GdxRuntimeException("Can't use " + data.getClass().getName() + " with this method. Use ByteBuffer instead.");
}
}
@Override
public void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format,
int imageSize, Buffer data) {
throw new GdxRuntimeException("not implemented");
}
@Override
public void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) {
GL11.glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
}
@Override
public void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) {
GL11.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
}
@Override
public int createProgram() {
return GL20.glCreateProgram();
}
@Override
public int createShader(int type) {
return GL20.glCreateShader(type);
}
@Override
public void cullFace(int mode) {
GL11.glCullFace(mode);
}
@Override
public void deleteBuffers(int n, IntBuffer buffers) {
GL15.glDeleteBuffers(buffers);
}
@Override
public void deleteBuffer(int buffer) {
GL15.glDeleteBuffers(buffer);
}
@Override
public void deleteFramebuffers(int n, IntBuffer framebuffers) {
EXTFramebufferObject.glDeleteFramebuffersEXT(framebuffers);
}
@Override
public void deleteFramebuffer(int framebuffer) {
EXTFramebufferObject.glDeleteFramebuffersEXT(framebuffer);
}
@Override
public void deleteProgram(int program) {
GL20.glDeleteProgram(program);
}
@Override
public void deleteRenderbuffers(int n, IntBuffer renderbuffers) {
EXTFramebufferObject.glDeleteRenderbuffersEXT(renderbuffers);
}
@Override
public void deleteRenderbuffer(int renderbuffer) {
EXTFramebufferObject.glDeleteRenderbuffersEXT(renderbuffer);
}
@Override
public void deleteShader(int shader) {
GL20.glDeleteShader(shader);
}
@Override
public void deleteTextures(int n, IntBuffer textures) {
GL11.glDeleteTextures(textures);
}
@Override
public void deleteTexture(int texture) {
GL11.glDeleteTextures(texture);
}
@Override
public void depthFunc(int func) {
GL11.glDepthFunc(func);
}
@Override
public void depthMask(boolean flag) {
GL11.glDepthMask(flag);
}
@Override
public void depthRangef(float zNear, float zFar) {
GL11.glDepthRange(zNear, zFar);
}
@Override
public void detachShader(int program, int shader) {
GL20.glDetachShader(program, shader);
}
@Override
public void disable(int cap) {
GL11.glDisable(cap);
}
@Override
public void disableVertexAttribArray(int index) {
GL20.glDisableVertexAttribArray(index);
}
@Override
public void drawArrays(int mode, int first, int count) {
GL11.glDrawArrays(mode, first, count);
}
@Override
public void drawElements(int mode, int count, int type, Buffer indices) {
if (indices instanceof ShortBuffer && type == com.badlogic.gdx.graphics.GL20.GL_UNSIGNED_SHORT)
GL11.glDrawElements(mode, (ShortBuffer) indices);
else if (indices instanceof ByteBuffer && type == com.badlogic.gdx.graphics.GL20.GL_UNSIGNED_SHORT)
GL11.glDrawElements(mode, ((ByteBuffer) indices).asShortBuffer());
else if (indices instanceof ByteBuffer && type == com.badlogic.gdx.graphics.GL20.GL_UNSIGNED_BYTE)
GL11.glDrawElements(mode, (ByteBuffer) indices);
else
throw new GdxRuntimeException("Can't use " + indices.getClass().getName()
+ " with this method. Use ShortBuffer or ByteBuffer instead. Blame LWJGL");
}
@Override
public void enable(int cap) {
GL11.glEnable(cap);
}
@Override
public void enableVertexAttribArray(int index) {
GL20.glEnableVertexAttribArray(index);
}
@Override
public void finish() {
GL11.glFinish();
}
@Override
public void flush() {
GL11.glFlush();
}
@Override
public void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) {
EXTFramebufferObject.glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
}
@Override
public void framebufferTexture2D(int target, int attachment, int textarget, int texture, int level) {
EXTFramebufferObject.glFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
}
@Override
public void frontFace(int mode) {
GL11.glFrontFace(mode);
}
@Override
public void genBuffers(int n, IntBuffer buffers) {
GL15.glGenBuffers(buffers);
}
@Override
public int genBuffer() {
return GL15.glGenBuffers();
}
@Override
public void genFramebuffers(int n, IntBuffer framebuffers) {
EXTFramebufferObject.glGenFramebuffersEXT(framebuffers);
}
@Override
public int genFramebuffer() {
return EXTFramebufferObject.glGenFramebuffersEXT();
}
@Override
public void genRenderbuffers(int n, IntBuffer renderbuffers) {
EXTFramebufferObject.glGenRenderbuffersEXT(renderbuffers);
}
@Override
public int genRenderbuffer() {
return EXTFramebufferObject.glGenRenderbuffersEXT();
}
@Override
public void genTextures(int n, IntBuffer textures) {
GL11.glGenTextures(textures);
}
@Override
public int genTexture() {
return GL11.glGenTextures();
}
@Override
public void generateMipmap(int target) {
EXTFramebufferObject.glGenerateMipmapEXT(target);
}
@Override
public String getActiveAttrib(int program, int index, IntBuffer size, Buffer type) {
IntBuffer typeTmp = BufferUtils.createIntBuffer(2);
String name = GL20.glGetActiveAttrib(program, index, 256, size, typeTmp);
size.put(typeTmp.get(0));
if (type instanceof IntBuffer) ((IntBuffer) type).put(typeTmp.get(1));
return name;
}
@Override
public String getActiveUniform(int program, int index, IntBuffer size, Buffer type) {
IntBuffer typeTmp = BufferUtils.createIntBuffer(2);
String name = GL20.glGetActiveUniform(program, index, 256, size, typeTmp);
size.put(typeTmp.get(0));
if (type instanceof IntBuffer) ((IntBuffer) type).put(typeTmp.get(1));
return name;
}
@Override
public void getAttachedShaders(int program, int maxcount, Buffer count, IntBuffer shaders) {
GL20.glGetAttachedShaders(program, (IntBuffer) count, shaders);
}
@Override
public int getAttribLocation(int program, String name) {
return GL20.glGetAttribLocation(program, name);
}
@Override
public void getBooleanv(int pname, Buffer params) {
GL11.glGetBooleanv(pname, (ByteBuffer) params);
}
@Override
public void getBufferParameteriv(int target, int pname, IntBuffer params) {
GL15.glGetBufferParameteriv(target, pname, params);
}
@Override
public int getError() {
return GL11.glGetError();
}
@Override
public void getFloatv(int pname, FloatBuffer params) {
GL11.glGetFloatv(pname, params);
}
@Override
public void getFramebufferAttachmentParameteriv(int target, int attachment, int pname, IntBuffer params) {
EXTFramebufferObject.glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);
}
@Override
public void getIntegerv(int pname, IntBuffer params) {
GL11.glGetIntegerv(pname, params);
}
@Override
public String getProgramInfoLog(int program) {
ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 10);
buffer.order(ByteOrder.nativeOrder());
ByteBuffer tmp = ByteBuffer.allocateDirect(4);
tmp.order(ByteOrder.nativeOrder());
IntBuffer intBuffer = tmp.asIntBuffer();
GL20.glGetProgramInfoLog(program, intBuffer, buffer);
int numBytes = intBuffer.get(0);
byte[] bytes = new byte[numBytes];
buffer.get(bytes);
return new String(bytes);
}
@Override
public void getProgramiv(int program, int pname, IntBuffer params) {
GL20.glGetProgramiv(program, pname, params);
}
@Override
public void getRenderbufferParameteriv(int target, int pname, IntBuffer params) {
EXTFramebufferObject.glGetRenderbufferParameterivEXT(target, pname, params);
}
@Override
public String getShaderInfoLog(int shader) {
ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 10);
buffer.order(ByteOrder.nativeOrder());
ByteBuffer tmp = ByteBuffer.allocateDirect(4);
tmp.order(ByteOrder.nativeOrder());
IntBuffer intBuffer = tmp.asIntBuffer();
GL20.glGetShaderInfoLog(shader, intBuffer, buffer);
int numBytes = intBuffer.get(0);
byte[] bytes = new byte[numBytes];
buffer.get(bytes);
return new String(bytes);
}
@Override
public void getShaderPrecisionFormat(int shadertype, int precisiontype, IntBuffer range, IntBuffer precision) {
throw new UnsupportedOperationException("unsupported, won't implement");
}
@Override
public void getShaderiv(int shader, int pname, IntBuffer params) {
GL20.glGetShaderiv(shader, pname, params);
}
@Override
public String getString(int name) {
return GL11.glGetString(name);
}
@Override
public void getTexParameterfv(int target, int pname, FloatBuffer params) {
GL11.glGetTexParameterfv(target, pname, params);
}
@Override
public void getTexParameteriv(int target, int pname, IntBuffer params) {
GL11.glGetTexParameteriv(target, pname, params);
}
@Override
public int getUniformLocation(int program, String name) {
return GL20.glGetUniformLocation(program, name);
}
@Override
public void getUniformfv(int program, int location, FloatBuffer params) {
GL20.glGetUniformfv(program, location, params);
}
@Override
public void getUniformiv(int program, int location, IntBuffer params) {
GL20.glGetUniformiv(program, location, params);
}
@Override
public void getVertexAttribPointerv(int index, int pname, Buffer pointer) {
throw new UnsupportedOperationException("unsupported, won't implement");
}
@Override
public void getVertexAttribfv(int index, int pname, FloatBuffer params) {
GL20.glGetVertexAttribfv(index, pname, params);
}
@Override
public void getVertexAttribiv(int index, int pname, IntBuffer params) {
GL20.glGetVertexAttribiv(index, pname, params);
}
@Override
public void hint(int target, int mode) {
GL11.glHint(target, mode);
}
@Override
public boolean isBuffer(int buffer) {
return GL15.glIsBuffer(buffer);
}
@Override
public boolean isEnabled(int cap) {
return GL11.glIsEnabled(cap);
}
@Override
public boolean isFramebuffer(int framebuffer) {
return EXTFramebufferObject.glIsFramebufferEXT(framebuffer);
}
@Override
public boolean isProgram(int program) {
return GL20.glIsProgram(program);
}
@Override
public boolean isRenderbuffer(int renderbuffer) {
return EXTFramebufferObject.glIsRenderbufferEXT(renderbuffer);
}
@Override
public boolean isShader(int shader) {
return GL20.glIsShader(shader);
}
@Override
public boolean isTexture(int texture) {
return GL11.glIsTexture(texture);
}
@Override
public void lineWidth(float width) {
GL11.glLineWidth(width);
}
@Override
public void linkProgram(int program) {
GL20.glLinkProgram(program);
}
@Override
public void pixelStorei(int pname, int param) {
GL11.glPixelStorei(pname, param);
}
@Override
public void polygonOffset(float factor, float units) {
GL11.glPolygonOffset(factor, units);
}
@Override
public void readPixels(int x, int y, int width, int height, int format, int type, Buffer pixels) {
if (pixels instanceof ByteBuffer)
GL11.glReadPixels(x, y, width, height, format, type, (ByteBuffer) pixels);
else if (pixels instanceof ShortBuffer)
GL11.glReadPixels(x, y, width, height, format, type, (ShortBuffer) pixels);
else if (pixels instanceof IntBuffer)
GL11.glReadPixels(x, y, width, height, format, type, (IntBuffer) pixels);
else if (pixels instanceof FloatBuffer)
GL11.glReadPixels(x, y, width, height, format, type, (FloatBuffer) pixels);
else
throw new GdxRuntimeException("Can't use " + pixels.getClass().getName()
+ " with this method. Use ByteBuffer, ShortBuffer, IntBuffer or FloatBuffer instead. Blame LWJGL");
}
@Override
public void releaseShaderCompiler() {
// nothing to do here
}
@Override
public void renderbufferStorage(int target, int internalformat, int width, int height) {
EXTFramebufferObject.glRenderbufferStorageEXT(target, internalformat, width, height);
}
@Override
public void sampleCoverage(float value, boolean invert) {
GL13.glSampleCoverage(value, invert);
}
@Override
public void scissor(int x, int y, int width, int height) {
GL11.glScissor(x, y, width, height);
}
@Override
public void shaderBinary(int n, IntBuffer shaders, int binaryformat, Buffer binary, int length) {
throw new UnsupportedOperationException("unsupported, won't implement");
}
@Override
public void shaderSource(int shader, String string) {
GL20.glShaderSource(shader, string);
}
@Override
public void stencilFunc(int func, int ref, int mask) {
GL11.glStencilFunc(func, ref, mask);
}
@Override
public void stencilFuncSeparate(int face, int func, int ref, int mask) {
GL20.glStencilFuncSeparate(face, func, ref, mask);
}
@Override
public void stencilMask(int mask) {
GL11.glStencilMask(mask);
}
@Override
public void stencilMaskSeparate(int face, int mask) {
GL20.glStencilMaskSeparate(face, mask);
}
@Override
public void stencilOp(int fail, int zfail, int zpass) {
GL11.glStencilOp(fail, zfail, zpass);
}
@Override
public void stencilOpSeparate(int face, int fail, int zfail, int zpass) {
GL20.glStencilOpSeparate(face, fail, zfail, zpass);
}
@Override
public void texImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type,
Buffer pixels) {
if (pixels == null)
GL11.glTexImage2D(target, level, internalformat, width, height, border, format, type, (ByteBuffer) null);
else if (pixels instanceof ByteBuffer)
GL11.glTexImage2D(target, level, internalformat, width, height, border, format, type, (ByteBuffer) pixels);
else if (pixels instanceof ShortBuffer)
GL11.glTexImage2D(target, level, internalformat, width, height, border, format, type, (ShortBuffer) pixels);
else if (pixels instanceof IntBuffer)
GL11.glTexImage2D(target, level, internalformat, width, height, border, format, type, (IntBuffer) pixels);
else if (pixels instanceof FloatBuffer)
GL11.glTexImage2D(target, level, internalformat, width, height, border, format, type, (FloatBuffer) pixels);
else if (pixels instanceof DoubleBuffer)
GL11.glTexImage2D(target, level, internalformat, width, height, border, format, type, (DoubleBuffer) pixels);
else
throw new GdxRuntimeException("Can't use " + pixels.getClass().getName()
+ " with this method. Use ByteBuffer, ShortBuffer, IntBuffer, FloatBuffer or DoubleBuffer instead. Blame LWJGL");
}
@Override
public void texParameterf(int target, int pname, float param) {
GL11.glTexParameterf(target, pname, param);
}
@Override
public void texParameterfv(int target, int pname, FloatBuffer params) {
GL11.glTexParameterfv(target, pname, params);
}
@Override
public void texParameteri(int target, int pname, int param) {
GL11.glTexParameteri(target, pname, param);
}
@Override
public void texParameteriv(int target, int pname, IntBuffer params) {
GL11.glTexParameteriv(target, pname, params);
}
@Override
public void texSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type,
Buffer pixels) {
if (pixels instanceof ByteBuffer)
GL11.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, (ByteBuffer) pixels);
else if (pixels instanceof ShortBuffer)
GL11.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, (ShortBuffer) pixels);
else if (pixels instanceof IntBuffer)
GL11.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, (IntBuffer) pixels);
else if (pixels instanceof FloatBuffer)
GL11.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, (FloatBuffer) pixels);
else if (pixels instanceof DoubleBuffer)
GL11.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, (DoubleBuffer) pixels);
else
throw new GdxRuntimeException("Can't use " + pixels.getClass().getName()
+ " with this method. Use ByteBuffer, ShortBuffer, IntBuffer, FloatBuffer or DoubleBuffer instead. Blame LWJGL");
}
@Override
public void uniform1f(int location, float x) {
GL20.glUniform1f(location, x);
}
@Override
public void uniform1fv(int location, int count, FloatBuffer v) {
GL20.glUniform1fv(location, v);
}
@Override
public void uniform1fv(int location, int count, float[] v, int offset) {
GL20.glUniform1fv(location, toFloatBuffer(v, offset, count));
}
@Override
public void uniform1i(int location, int x) {
GL20.glUniform1i(location, x);
}
@Override
public void uniform1iv(int location, int count, IntBuffer v) {
GL20.glUniform1iv(location, v);
}
@Override
public void uniform1iv(int location, int count, int[] v, int offset) {
GL20.glUniform1iv(location, toIntBuffer(v, offset, count));
}
@Override
public void uniform2f(int location, float x, float y) {
GL20.glUniform2f(location, x, y);
}
@Override
public void uniform2fv(int location, int count, FloatBuffer v) {
GL20.glUniform2fv(location, v);
}
@Override
public void uniform2fv(int location, int count, float[] v, int offset) {
GL20.glUniform2fv(location, toFloatBuffer(v, offset, count << 1));
}
@Override
public void uniform2i(int location, int x, int y) {
GL20.glUniform2i(location, x, y);
}
@Override
public void uniform2iv(int location, int count, IntBuffer v) {
GL20.glUniform2iv(location, v);
}
@Override
public void uniform2iv(int location, int count, int[] v, int offset) {
GL20.glUniform2iv(location, toIntBuffer(v, offset, count << 1));
}
@Override
public void uniform3f(int location, float x, float y, float z) {
GL20.glUniform3f(location, x, y, z);
}
@Override
public void uniform3fv(int location, int count, FloatBuffer v) {
GL20.glUniform3fv(location, v);
}
@Override
public void uniform3fv(int location, int count, float[] v, int offset) {
GL20.glUniform3fv(location, toFloatBuffer(v, offset, count * 3));
}
@Override
public void uniform3i(int location, int x, int y, int z) {
GL20.glUniform3i(location, x, y, z);
}
@Override
public void uniform3iv(int location, int count, IntBuffer v) {
GL20.glUniform3iv(location, v);
}
@Override
public void uniform3iv(int location, int count, int[] v, int offset) {
GL20.glUniform3iv(location, toIntBuffer(v, offset, count * 3));
}
@Override
public void uniform4f(int location, float x, float y, float z, float w) {
GL20.glUniform4f(location, x, y, z, w);
}
@Override
public void uniform4fv(int location, int count, FloatBuffer v) {
GL20.glUniform4fv(location, v);
}
@Override
public void uniform4fv(int location, int count, float[] v, int offset) {
GL20.glUniform4fv(location, toFloatBuffer(v, offset, count << 2));
}
@Override
public void uniform4i(int location, int x, int y, int z, int w) {
GL20.glUniform4i(location, x, y, z, w);
}
@Override
public void uniform4iv(int location, int count, IntBuffer v) {
GL20.glUniform4iv(location, v);
}
@Override
public void uniform4iv(int location, int count, int[] v, int offset) {
GL20.glUniform4iv(location, toIntBuffer(v, offset, count << 2));
}
@Override
public void uniformMatrix2fv(int location, int count, boolean transpose, FloatBuffer value) {
GL20.glUniformMatrix2fv(location, transpose, value);
}
@Override
public void uniformMatrix2fv(int location, int count, boolean transpose, float[] value, int offset) {
GL20.glUniformMatrix2fv(location, transpose, toFloatBuffer(value, offset, count << 2));
}
@Override
public void uniformMatrix3fv(int location, int count, boolean transpose, FloatBuffer value) {
GL20.glUniformMatrix3fv(location, transpose, value);
}
@Override
public void uniformMatrix3fv(int location, int count, boolean transpose, float[] value, int offset) {
GL20.glUniformMatrix3fv(location, transpose, toFloatBuffer(value, offset, count * 9));
}
@Override
public void uniformMatrix4fv(int location, int count, boolean transpose, FloatBuffer value) {
GL20.glUniformMatrix4fv(location, transpose, value);
}
@Override
public void uniformMatrix4fv(int location, int count, boolean transpose, float[] value, int offset) {
GL20.glUniformMatrix4fv(location, transpose, toFloatBuffer(value, offset, count << 4));
}
@Override
public void useProgram(int program) {
GL20.glUseProgram(program);
}
@Override
public void validateProgram(int program) {
GL20.glValidateProgram(program);
}
@Override
public void vertexAttrib1f(int indx, float x) {
GL20.glVertexAttrib1f(indx, x);
}
@Override
public void vertexAttrib1fv(int indx, FloatBuffer values) {
GL20.glVertexAttrib1f(indx, values.get());
}
@Override
public void vertexAttrib2f(int indx, float x, float y) {
GL20.glVertexAttrib2f(indx, x, y);
}
@Override
public void vertexAttrib2fv(int indx, FloatBuffer values) {
GL20.glVertexAttrib2f(indx, values.get(), values.get());
}
@Override
public void vertexAttrib3f(int indx, float x, float y, float z) {
GL20.glVertexAttrib3f(indx, x, y, z);
}
@Override
public void vertexAttrib3fv(int indx, FloatBuffer values) {
GL20.glVertexAttrib3f(indx, values.get(), values.get(), values.get());
}
@Override
public void vertexAttrib4f(int indx, float x, float y, float z, float w) {
GL20.glVertexAttrib4f(indx, x, y, z, w);
}
@Override
public void vertexAttrib4fv(int indx, FloatBuffer values) {
GL20.glVertexAttrib4f(indx, values.get(), values.get(), values.get(), values.get());
}
@Override
public void vertexAttribPointer(int indx, int size, int type, boolean normalized, int stride, Buffer buffer) {
if (buffer instanceof ByteBuffer) {
if (type == GL.BYTE)
GL20.glVertexAttribPointer(indx, size, type, normalized, stride, (ByteBuffer) buffer);
else if (type == GL.UNSIGNED_BYTE)
GL20.glVertexAttribPointer(indx, size, type, normalized, stride, (ByteBuffer) buffer);
else if (type == GL.SHORT)
GL20.glVertexAttribPointer(indx, size, type, normalized, stride, ((ByteBuffer) buffer).asShortBuffer());
else if (type == GL.UNSIGNED_SHORT)
GL20.glVertexAttribPointer(indx, size, type, normalized, stride, ((ByteBuffer) buffer).asShortBuffer());
else if (type == GL.FLOAT)
GL20.glVertexAttribPointer(indx, size, type, normalized, stride, ((ByteBuffer) buffer).asFloatBuffer());
else
throw new GdxRuntimeException(
"Can't use "
+ buffer.getClass().getName()
+ " with type "
+ type
+ " with this method. Use ByteBuffer and one of GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT or GL_FLOAT for type. Blame LWJGL");
} else if (buffer instanceof FloatBuffer) {
if (type == GL.FLOAT)
GL20.glVertexAttribPointer(indx, size, type, normalized, stride, (FloatBuffer) buffer);
else
throw new GdxRuntimeException("Can't use " + buffer.getClass().getName() + " with type " + type
+ " with this method.");
} else
throw new GdxRuntimeException("Can't use " + buffer.getClass().getName()
+ " with this method. Use ByteBuffer instead. Blame LWJGL");
}
@Override
public void viewport(int x, int y, int width, int height) {
GL11.glViewport(x, y, width, height);
}
@Override
public void drawElements(int mode, int count, int type, int indices) {
GL11.glDrawElements(mode, count, type, indices);
}
@Override
public void vertexAttribPointer(int indx, int size, int type, boolean normalized, int stride, int ptr) {
GL20.glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
}
}

View File

@@ -0,0 +1,640 @@
/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.oscim.gdx;
import com.badlogic.gdx.utils.GdxRuntimeException;
import org.lwjgl.opengl.*;
import java.nio.*;
/**
* See https://github.com/libgdx/libgdx/blob/master/backends/gdx-backend-lwjgl3/src/com/badlogic/gdx/backends/lwjgl3/Lwjgl3GL30.java
*/
public class Lwjgl3GL30 extends Lwjgl3GL20 implements org.oscim.backend.GL30 {
@Override
public void readBuffer(int mode) {
GL11.glReadBuffer(mode);
}
@Override
public void drawRangeElements(int mode, int start, int end, int count, int type, Buffer indices) {
if (indices instanceof ByteBuffer)
GL12.glDrawRangeElements(mode, start, end, (ByteBuffer) indices);
else if (indices instanceof ShortBuffer)
GL12.glDrawRangeElements(mode, start, end, (ShortBuffer) indices);
else if (indices instanceof IntBuffer)
GL12.glDrawRangeElements(mode, start, end, (IntBuffer) indices);
else throw new GdxRuntimeException("indices must be byte, short or int buffer");
}
@Override
public void drawRangeElements(int mode, int start, int end, int count, int type, int offset) {
GL12.glDrawRangeElements(mode, start, end, count, type, offset);
}
@Override
public void texImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format,
int type, Buffer pixels) {
if (pixels == null)
GL12.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, (ByteBuffer) null);
else if (pixels instanceof ByteBuffer)
GL12.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, (ByteBuffer) pixels);
else if (pixels instanceof ShortBuffer)
GL12.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, (ShortBuffer) pixels);
else if (pixels instanceof IntBuffer)
GL12.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, (IntBuffer) pixels);
else if (pixels instanceof FloatBuffer)
GL12.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, (FloatBuffer) pixels);
else if (pixels instanceof DoubleBuffer)
GL12.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, (DoubleBuffer) pixels);
else
throw new GdxRuntimeException("Can't use " + pixels.getClass().getName()
+ " with this method. Use ByteBuffer, ShortBuffer, IntBuffer, FloatBuffer or DoubleBuffer instead. Blame LWJGL");
}
@Override
public void texImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format,
int type, int offset) {
GL12.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, offset);
}
@Override
public void texSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth,
int format, int type, Buffer pixels) {
if (pixels instanceof ByteBuffer)
GL12.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, (ByteBuffer) pixels);
else if (pixels instanceof ShortBuffer)
GL12.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, (ShortBuffer) pixels);
else if (pixels instanceof IntBuffer)
GL12.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, (IntBuffer) pixels);
else if (pixels instanceof FloatBuffer)
GL12.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, (FloatBuffer) pixels);
else if (pixels instanceof DoubleBuffer)
GL12.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, (DoubleBuffer) pixels);
else
throw new GdxRuntimeException("Can't use " + pixels.getClass().getName()
+ " with this method. Use ByteBuffer, ShortBuffer, IntBuffer, FloatBuffer or DoubleBuffer instead. Blame LWJGL");
}
@Override
public void texSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth,
int format, int type, int offset) {
GL12.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, offset);
}
@Override
public void copyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width,
int height) {
GL12.glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
}
@Override
public void genQueries(int n, int[] ids, int offset) {
for (int i = offset; i < offset + n; i++) {
ids[i] = GL15.glGenQueries();
}
}
@Override
public void genQueries(int n, IntBuffer ids) {
for (int i = 0; i < n; i++) {
ids.put(GL15.glGenQueries());
}
}
@Override
public void deleteQueries(int n, int[] ids, int offset) {
for (int i = offset; i < offset + n; i++) {
GL15.glDeleteQueries(ids[i]);
}
}
@Override
public void deleteQueries(int n, IntBuffer ids) {
for (int i = 0; i < n; i++) {
GL15.glDeleteQueries(ids.get());
}
}
@Override
public boolean isQuery(int id) {
return GL15.glIsQuery(id);
}
@Override
public void beginQuery(int target, int id) {
GL15.glBeginQuery(target, id);
}
@Override
public void endQuery(int target) {
GL15.glEndQuery(target);
}
@Override
public void getQueryiv(int target, int pname, IntBuffer params) {
GL15.glGetQueryiv(target, pname, params);
}
@Override
public void getQueryObjectuiv(int id, int pname, IntBuffer params) {
GL15.glGetQueryObjectuiv(id, pname, params);
}
@Override
public boolean unmapBuffer(int target) {
return GL15.glUnmapBuffer(target);
}
@Override
public Buffer getBufferPointerv(int target, int pname) {
// FIXME glGetBufferPointerv needs a proper translation
// return GL15.glGetBufferPointer(target, pname);
throw new UnsupportedOperationException("Not implemented");
}
@Override
public void drawBuffers(int n, IntBuffer bufs) {
GL20.glDrawBuffers(bufs);
}
@Override
public void uniformMatrix2x3fv(int location, int count, boolean transpose, FloatBuffer value) {
GL21.glUniformMatrix2x3fv(location, transpose, value);
}
@Override
public void uniformMatrix3x2fv(int location, int count, boolean transpose, FloatBuffer value) {
GL21.glUniformMatrix3x2fv(location, transpose, value);
}
@Override
public void uniformMatrix2x4fv(int location, int count, boolean transpose, FloatBuffer value) {
GL21.glUniformMatrix2x4fv(location, transpose, value);
}
@Override
public void uniformMatrix4x2fv(int location, int count, boolean transpose, FloatBuffer value) {
GL21.glUniformMatrix4x2fv(location, transpose, value);
}
@Override
public void uniformMatrix3x4fv(int location, int count, boolean transpose, FloatBuffer value) {
GL21.glUniformMatrix3x4fv(location, transpose, value);
}
@Override
public void uniformMatrix4x3fv(int location, int count, boolean transpose, FloatBuffer value) {
GL21.glUniformMatrix4x3fv(location, transpose, value);
}
@Override
public void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1,
int mask, int filter) {
GL30.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
}
@Override
public void bindFramebuffer(int target, int framebuffer) {
GL30.glBindFramebuffer(target, framebuffer);
}
@Override
public void bindRenderbuffer(int target, int renderbuffer) {
GL30.glBindRenderbuffer(target, renderbuffer);
}
@Override
public int checkFramebufferStatus(int target) {
return GL30.glCheckFramebufferStatus(target);
}
@Override
public void deleteFramebuffers(int n, IntBuffer framebuffers) {
GL30.glDeleteFramebuffers(framebuffers);
}
@Override
public void deleteFramebuffer(int framebuffer) {
GL30.glDeleteFramebuffers(framebuffer);
}
@Override
public void deleteRenderbuffers(int n, IntBuffer renderbuffers) {
GL30.glDeleteRenderbuffers(renderbuffers);
}
@Override
public void deleteRenderbuffer(int renderbuffer) {
GL30.glDeleteRenderbuffers(renderbuffer);
}
@Override
public void generateMipmap(int target) {
GL30.glGenerateMipmap(target);
}
@Override
public void genFramebuffers(int n, IntBuffer framebuffers) {
GL30.glGenFramebuffers(framebuffers);
}
@Override
public int genFramebuffer() {
return GL30.glGenFramebuffers();
}
@Override
public void genRenderbuffers(int n, IntBuffer renderbuffers) {
GL30.glGenRenderbuffers(renderbuffers);
}
@Override
public int genRenderbuffer() {
return GL30.glGenRenderbuffers();
}
@Override
public void getRenderbufferParameteriv(int target, int pname, IntBuffer params) {
GL30.glGetRenderbufferParameteriv(target, pname, params);
}
@Override
public boolean isFramebuffer(int framebuffer) {
return GL30.glIsFramebuffer(framebuffer);
}
@Override
public boolean isRenderbuffer(int renderbuffer) {
return GL30.glIsRenderbuffer(renderbuffer);
}
@Override
public void renderbufferStorage(int target, int internalformat, int width, int height) {
GL30.glRenderbufferStorage(target, internalformat, width, height);
}
@Override
public void renderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) {
GL30.glRenderbufferStorageMultisample(target, samples, internalformat, width, height);
}
@Override
public void framebufferTexture2D(int target, int attachment, int textarget, int texture, int level) {
GL30.glFramebufferTexture2D(target, attachment, textarget, texture, level);
}
@Override
public void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) {
GL30.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
}
@Override
public void framebufferTextureLayer(int target, int attachment, int texture, int level, int layer) {
GL30.glFramebufferTextureLayer(target, attachment, texture, level, layer);
}
@Override
public void flushMappedBufferRange(int target, int offset, int length) {
GL30.glFlushMappedBufferRange(target, offset, length);
}
@Override
public void bindVertexArray(int array) {
GL30.glBindVertexArray(array);
}
@Override
public void deleteVertexArrays(int n, int[] arrays, int offset) {
for (int i = offset; i < offset + n; i++) {
GL30.glDeleteVertexArrays(arrays[i]);
}
}
@Override
public void deleteVertexArrays(int n, IntBuffer arrays) {
GL30.glDeleteVertexArrays(arrays);
}
@Override
public void genVertexArrays(int n, int[] arrays, int offset) {
for (int i = offset; i < offset + n; i++) {
arrays[i] = GL30.glGenVertexArrays();
}
}
@Override
public void genVertexArrays(int n, IntBuffer arrays) {
GL30.glGenVertexArrays(arrays);
}
@Override
public boolean isVertexArray(int array) {
return GL30.glIsVertexArray(array);
}
@Override
public void beginTransformFeedback(int primitiveMode) {
GL30.glBeginTransformFeedback(primitiveMode);
}
@Override
public void endTransformFeedback() {
GL30.glEndTransformFeedback();
}
@Override
public void bindBufferRange(int target, int index, int buffer, int offset, int size) {
GL30.glBindBufferRange(target, index, buffer, offset, size);
}
@Override
public void bindBufferBase(int target, int index, int buffer) {
GL30.glBindBufferBase(target, index, buffer);
}
@Override
public void transformFeedbackVaryings(int program, String[] varyings, int bufferMode) {
GL30.glTransformFeedbackVaryings(program, varyings, bufferMode);
}
@Override
public void vertexAttribIPointer(int index, int size, int type, int stride, int offset) {
GL30.glVertexAttribIPointer(index, size, type, stride, offset);
}
@Override
public void getVertexAttribIiv(int index, int pname, IntBuffer params) {
GL30.glGetVertexAttribIiv(index, pname, params);
}
@Override
public void getVertexAttribIuiv(int index, int pname, IntBuffer params) {
GL30.glGetVertexAttribIuiv(index, pname, params);
}
@Override
public void vertexAttribI4i(int index, int x, int y, int z, int w) {
GL30.glVertexAttribI4i(index, x, y, z, w);
}
@Override
public void vertexAttribI4ui(int index, int x, int y, int z, int w) {
GL30.glVertexAttribI4ui(index, x, y, z, w);
}
@Override
public void getUniformuiv(int program, int location, IntBuffer params) {
GL30.glGetUniformuiv(program, location, params);
}
@Override
public int getFragDataLocation(int program, String name) {
return GL30.glGetFragDataLocation(program, name);
}
@Override
public void uniform1uiv(int location, int count, IntBuffer value) {
GL30.glUniform1uiv(location, value);
}
@Override
public void uniform3uiv(int location, int count, IntBuffer value) {
GL30.glUniform3uiv(location, value);
}
@Override
public void uniform4uiv(int location, int count, IntBuffer value) {
GL30.glUniform4uiv(location, value);
}
@Override
public void clearBufferiv(int buffer, int drawbuffer, IntBuffer value) {
GL30.glClearBufferiv(buffer, drawbuffer, value);
}
@Override
public void clearBufferuiv(int buffer, int drawbuffer, IntBuffer value) {
GL30.glClearBufferuiv(buffer, drawbuffer, value);
}
@Override
public void clearBufferfv(int buffer, int drawbuffer, FloatBuffer value) {
GL30.glClearBufferfv(buffer, drawbuffer, value);
}
@Override
public void clearBufferfi(int buffer, int drawbuffer, float depth, int stencil) {
GL30.glClearBufferfi(buffer, drawbuffer, depth, stencil);
}
@Override
public String getStringi(int name, int index) {
return GL30.glGetStringi(name, index);
}
@Override
public void copyBufferSubData(int readTarget, int writeTarget, int readOffset, int writeOffset, int size) {
GL31.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
}
@Override
public void getUniformIndices(int program, String[] uniformNames, IntBuffer uniformIndices) {
GL31.glGetUniformIndices(program, uniformNames, uniformIndices);
}
@Override
public void getActiveUniformsiv(int program, int uniformCount, IntBuffer uniformIndices, int pname, IntBuffer params) {
GL31.glGetActiveUniformsiv(program, uniformIndices, pname, params);
}
@Override
public int getUniformBlockIndex(int program, String uniformBlockName) {
return GL31.glGetUniformBlockIndex(program, uniformBlockName);
}
@Override
public void getActiveUniformBlockiv(int program, int uniformBlockIndex, int pname, IntBuffer params) {
params.put(GL31.glGetActiveUniformBlocki(program, uniformBlockIndex, pname));
}
@Override
public void getActiveUniformBlockName(int program, int uniformBlockIndex, Buffer length, Buffer uniformBlockName) {
GL31.glGetActiveUniformBlockName(program, uniformBlockIndex, (IntBuffer) length, (ByteBuffer) uniformBlockName);
}
@Override
public String getActiveUniformBlockName(int program, int uniformBlockIndex) {
return GL31.glGetActiveUniformBlockName(program, uniformBlockIndex, 1024);
}
@Override
public void uniformBlockBinding(int program, int uniformBlockIndex, int uniformBlockBinding) {
GL31.glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
}
@Override
public void drawArraysInstanced(int mode, int first, int count, int instanceCount) {
GL31.glDrawArraysInstanced(mode, first, count, instanceCount);
}
@Override
public void drawElementsInstanced(int mode, int count, int type, int indicesOffset, int instanceCount) {
GL31.glDrawElementsInstanced(mode, count, type, indicesOffset, instanceCount);
}
@Override
public void getInteger64v(int pname, LongBuffer params) {
GL32.glGetInteger64v(pname, params);
}
@Override
public void getBufferParameteri64v(int target, int pname, LongBuffer params) {
params.put(GL32.glGetBufferParameteri64(target, pname));
}
@Override
public void genSamplers(int count, int[] samplers, int offset) {
for (int i = offset; i < offset + count; i++) {
samplers[i] = GL33.glGenSamplers();
}
}
@Override
public void genSamplers(int count, IntBuffer samplers) {
GL33.glGenSamplers(samplers);
}
@Override
public void deleteSamplers(int count, int[] samplers, int offset) {
for (int i = offset; i < offset + count; i++) {
GL33.glDeleteSamplers(samplers[i]);
}
}
@Override
public void deleteSamplers(int count, IntBuffer samplers) {
GL33.glDeleteSamplers(samplers);
}
@Override
public boolean isSampler(int sampler) {
return GL33.glIsSampler(sampler);
}
@Override
public void bindSampler(int unit, int sampler) {
GL33.glBindSampler(unit, sampler);
}
@Override
public void samplerParameteri(int sampler, int pname, int param) {
GL33.glSamplerParameteri(sampler, pname, param);
}
@Override
public void samplerParameteriv(int sampler, int pname, IntBuffer param) {
GL33.glSamplerParameteriv(sampler, pname, param);
}
@Override
public void samplerParameterf(int sampler, int pname, float param) {
GL33.glSamplerParameterf(sampler, pname, param);
}
@Override
public void samplerParameterfv(int sampler, int pname, FloatBuffer param) {
GL33.glSamplerParameterfv(sampler, pname, param);
}
@Override
public void getSamplerParameteriv(int sampler, int pname, IntBuffer params) {
GL33.glGetSamplerParameterIiv(sampler, pname, params);
}
@Override
public void getSamplerParameterfv(int sampler, int pname, FloatBuffer params) {
GL33.glGetSamplerParameterfv(sampler, pname, params);
}
@Override
public void vertexAttribDivisor(int index, int divisor) {
GL33.glVertexAttribDivisor(index, divisor);
}
@Override
public void bindTransformFeedback(int target, int id) {
GL40.glBindTransformFeedback(target, id);
}
@Override
public void deleteTransformFeedbacks(int n, int[] ids, int offset) {
for (int i = offset; i < offset + n; i++) {
GL40.glDeleteTransformFeedbacks(ids[i]);
}
}
@Override
public void deleteTransformFeedbacks(int n, IntBuffer ids) {
GL40.glDeleteTransformFeedbacks(ids);
}
@Override
public void genTransformFeedbacks(int n, int[] ids, int offset) {
for (int i = offset; i < offset + n; i++) {
ids[i] = GL40.glGenTransformFeedbacks();
}
}
@Override
public void genTransformFeedbacks(int n, IntBuffer ids) {
GL40.glGenTransformFeedbacks(ids);
}
@Override
public boolean isTransformFeedback(int id) {
return GL40.glIsTransformFeedback(id);
}
@Override
public void pauseTransformFeedback() {
GL40.glPauseTransformFeedback();
}
@Override
public void resumeTransformFeedback() {
GL40.glResumeTransformFeedback();
}
@Override
public void programParameteri(int program, int pname, int value) {
GL41.glProgramParameteri(program, pname, value);
}
@Override
public void invalidateFramebuffer(int target, int numAttachments, IntBuffer attachments) {
GL43.glInvalidateFramebuffer(target, attachments);
}
@Override
public void invalidateSubFramebuffer(int target, int numAttachments, IntBuffer attachments, int x, int y, int width,
int height) {
GL43.glInvalidateSubFramebuffer(target, attachments, x, y, width, height);
}
}

View File

@@ -3,7 +3,6 @@ apply plugin: 'maven'
dependencies {
api project(':vtm-gdx')
api "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion"
api 'com.github.blackears:svgSalamander:v1.1.1'
}

View File

@@ -1,7 +1,7 @@
/*
* Copyright 2010, 2011, 2012, 2013 mapsforge.org
* Copyright 2013 Hannes Janetzek
* Copyright 2016-2017 devemux86
* Copyright 2016-2019 devemux86
* Copyright 2017 nebular
* Copyright 2018 Gustl22
*
@@ -22,12 +22,7 @@ package org.oscim.awt;
import org.oscim.backend.canvas.Paint;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.*;
import java.awt.font.TextAttribute;
import java.awt.image.BufferedImage;
import java.text.AttributedCharacterIterator.Attribute;
@@ -125,8 +120,8 @@ public class AwtPaint implements Paint {
Font font = DEFAULT_FONT; // new Font("Default", Font.PLAIN, 13);
Stroke stroke;
Style style = Style.FILL;
private int cap = getCap(Cap.BUTT);
private int join = getJoin(Join.MITER);
private int cap = getCap(Cap.ROUND);
private int join = getJoin(Join.ROUND);
private float strokeWidth;
private float textSize = DEFAULT_FONT.getSize();

View File

@@ -3,9 +3,10 @@ apply plugin: 'maven'
dependencies {
api project(':vtm')
api 'com.fasterxml.jackson.core:jackson-core:2.8.4'
api 'org.locationtech.jts:jts-core:1.15.0'
api 'org.openstreetmap.osmosis:osmosis-osm-binary:0.46'
api 'com.fasterxml.jackson.core:jackson-core:2.9.9'
// https://github.com/locationtech/jts/issues/145
api 'org.locationtech.jts:jts-core:1.15.1'
api 'org.openstreetmap.osmosis:osmosis-osm-binary:0.47'
}
sourceSets {

View File

@@ -78,6 +78,6 @@ public class OverpassTileSource extends UrlTileSource {
@Override
public ITileDataSource getDataSource() {
return new OverzoomTileDataSource(new UrlTileDataSource(this, new OverpassTileDecoder(), getHttpEngine()), mOverZoom);
return new OverzoomTileDataSource(new UrlTileDataSource(this, new TileDecoder(), getHttpEngine()), mOverZoom);
}
}

View File

@@ -39,14 +39,14 @@ import java.io.InputStream;
import static org.oscim.core.MercatorProjection.latitudeToY;
import static org.oscim.core.MercatorProjection.longitudeToX;
public class OverpassTileDecoder implements ITileDecoder {
public class TileDecoder implements ITileDecoder {
private final MapElement mMapElement;
private ITileDataSink mTileDataSink;
private double mTileY, mTileX, mTileScale;
public OverpassTileDecoder() {
public TileDecoder() {
mMapElement = new MapElement();
mMapElement.layer = 5;
}

View File

@@ -3,7 +3,8 @@ apply plugin: 'maven'
dependencies {
api project(':vtm')
api 'com.squareup.okhttp3:okhttp:3.8.0'
// https://github.com/square/okhttp/issues/4481
api 'com.squareup.okhttp3:okhttp:3.12.5'
}
sourceSets {

View File

@@ -3,7 +3,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.5'
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.7'
}
}
@@ -15,7 +15,7 @@ sourceSets.main.java.srcDirs = ["src/"]
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
ext {
roboVMVersion = "2.3.5"
roboVMVersion = "2.3.7"
}
launchIPhoneSimulator.dependsOn build

View File

@@ -3,7 +3,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.5'
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.7'
}
}
@@ -16,7 +16,7 @@ sourceSets.main.java.srcDirs = ["src/"]
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
ext {
roboVMVersion = "2.3.5"
roboVMVersion = "2.3.7"
}
launchIPhoneSimulator.dependsOn build

View File

@@ -3,7 +3,7 @@ apply plugin: 'maven'
dependencies {
api project(':vtm')
api 'com.fasterxml.jackson.core:jackson-core:2.8.4'
api 'com.fasterxml.jackson.core:jackson-core:2.9.9'
}
sourceSets {

View File

@@ -3,7 +3,8 @@ apply plugin: 'maven'
dependencies {
api project(':vtm')
api 'org.locationtech.jts:jts-core:1.15.0'
// https://github.com/locationtech/jts/issues/145
api 'org.locationtech.jts:jts-core:1.15.1'
}
sourceSets {

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2014 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@@ -17,18 +17,11 @@
*/
package org.oscim.layers.vector;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.LineString;
import org.locationtech.jts.geom.Point;
import org.locationtech.jts.geom.Polygon;
import org.locationtech.jts.geom.*;
import org.locationtech.jts.simplify.DouglasPeuckerSimplifier;
import org.oscim.backend.canvas.Color;
import org.oscim.core.Box;
import org.oscim.core.GeoPoint;
import org.oscim.core.GeometryBuffer;
import org.oscim.core.MapPosition;
import org.oscim.core.Tile;
import org.oscim.core.*;
import org.oscim.event.Gesture;
import org.oscim.event.GestureListener;
import org.oscim.event.MotionEvent;
@@ -124,7 +117,7 @@ public class VectorLayer extends AbstractVectorLayer<Drawable> implements Gestur
*
* @param drawable
*/
public void add(Drawable drawable) {
public synchronized void add(Drawable drawable) {
mDrawables.insert(bbox(drawable.getGeometry(), drawable.getStyle()), drawable);
}
@@ -135,7 +128,7 @@ public class VectorLayer extends AbstractVectorLayer<Drawable> implements Gestur
* @param geometry
* @param style
*/
public synchronized void add(Geometry geometry, Style style) {
synchronized void add(Geometry geometry, Style style) {
mDrawables.insert(bbox(geometry, style), new GeometryWithStyle(geometry, style));
}

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2014 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@@ -94,7 +94,7 @@ public class Style {
public static class Builder {
private float strokeWidth = 1f;
private int strokeColor = Color.GRAY;
public int strokeColor = Color.GRAY;
private int fillColor = Color.GRAY;
private float fillAlpha = 0.25f;

View File

@@ -3,7 +3,7 @@ apply plugin: 'maven'
dependencies {
api project(':vtm')
api 'com.wdtinc:mapbox-vector-tile:3.0.0'
api 'com.wdtinc:mapbox-vector-tile:3.1.0'
}
sourceSets {

View File

@@ -65,6 +65,6 @@ public class MapilionMvtTileSource extends UrlTileSource {
@Override
public ITileDataSource getDataSource() {
return new OverzoomTileDataSource(new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()), mOverZoom);
return new OverzoomTileDataSource(new UrlTileDataSource(this, new TileDecoder(locale), getHttpEngine()), mOverZoom);
}
}

View File

@@ -69,6 +69,6 @@ public class MapzenMvtTileSource extends UrlTileSource {
@Override
public ITileDataSource getDataSource() {
return new OverzoomTileDataSource(new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()), mOverZoom);
return new OverzoomTileDataSource(new UrlTileDataSource(this, new TileDecoder(locale), getHttpEngine()), mOverZoom);
}
}

View File

@@ -66,6 +66,6 @@ public class NextzenMvtTileSource extends UrlTileSource {
@Override
public ITileDataSource getDataSource() {
return new OverzoomTileDataSource(new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()), mOverZoom);
return new OverzoomTileDataSource(new UrlTileDataSource(this, new TileDecoder(locale), getHttpEngine()), mOverZoom);
}
}

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
* Copyright 2018 boldtrn
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
@@ -25,7 +25,7 @@ import org.oscim.tiling.source.UrlTileSource;
public class OpenMapTilesMvtTileSource extends UrlTileSource {
private static final String DEFAULT_URL = "https://maps.tilehosting.com/data/v3";
private static final String DEFAULT_URL = "https://api.maptiler.com/tiles/v3";
private static final String DEFAULT_PATH = "/{Z}/{X}/{Y}.pbf";
public static class Builder<T extends Builder<T>> extends UrlTileSource.Builder<T> {
@@ -69,6 +69,6 @@ public class OpenMapTilesMvtTileSource extends UrlTileSource {
@Override
public ITileDataSource getDataSource() {
return new OverzoomTileDataSource(new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()), mOverZoom);
return new OverzoomTileDataSource(new UrlTileDataSource(this, new TileDecoder(locale), getHttpEngine()), mOverZoom);
}
}

View File

@@ -42,7 +42,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
public class MvtTileDecoder implements ITileDecoder {
public class TileDecoder implements ITileDecoder {
private final String mLocale;
private static final float REF_TILE_SIZE = 4096.0f;
@@ -52,11 +52,11 @@ public class MvtTileDecoder implements ITileDecoder {
private final MapElement mMapElement;
private ITileDataSink mTileDataSink;
public MvtTileDecoder() {
public TileDecoder() {
this("");
}
public MvtTileDecoder(String locale) {
public TileDecoder(String locale) {
mLocale = locale;
mGeomFactory = new GeometryFactory();
mMapElement = new MapElement();

View File

@@ -1,7 +1,7 @@
apply plugin: 'application'
dependencies {
implementation project(':vtm-desktop')
implementation project(':vtm-desktop-lwjgl')
file("${rootDir}/vtm-desktop/natives").eachDir() { dir ->
implementation files(dir.path)
}

View File

@@ -18,7 +18,6 @@
package org.oscim.test;
import com.badlogic.gdx.Input;
import org.oscim.core.BoundingBox;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;

View File

@@ -1,99 +0,0 @@
/*
* Copyright 2016-2018 devemux86
* Copyright 2017 Longri
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.test;
import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.canvas.Bitmap;
import org.oscim.core.GeoPoint;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.renderer.atlas.TextureAtlas;
import org.oscim.renderer.atlas.TextureRegion;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.OkHttpEngine;
import org.oscim.tiling.source.bitmap.DefaultSources;
import org.oscim.utils.TextureAtlasUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import static org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
public class AtlasMarkerLayerTest extends MarkerLayerTest {
@Override
public void createLayers() {
try {
// Map events receiver
mMap.layers().add(new MapEventsReceiver(mMap));
TileSource tileSource = DefaultSources.OPENSTREETMAP
.httpFactory(new OkHttpEngine.OkHttpFactory())
.build();
mMap.layers().add(new BitmapTileLayer(mMap, tileSource));
mMap.setMapPosition(0, 0, 1 << 2);
Bitmap bitmapPoi = CanvasAdapter.decodeBitmap(getClass().getResourceAsStream("/res/marker_poi.png"));
Bitmap bitmapFocus = CanvasAdapter.decodeBitmap(getClass().getResourceAsStream("/res/marker_focus.png"));
// Create Atlas from Bitmaps
java.util.Map<Object, Bitmap> inputMap = new LinkedHashMap<>();
java.util.Map<Object, TextureRegion> regionsMap = new LinkedHashMap<>();
List<TextureAtlas> atlasList = new ArrayList<>();
inputMap.put("poi", bitmapPoi);
inputMap.put("focus", bitmapFocus);
// Bitmaps will never used any more
// With iOS we must flip the Y-Axis
TextureAtlasUtils.createTextureRegions(inputMap, regionsMap, atlasList, true, false);
MarkerSymbol symbol;
if (BILLBOARDS)
symbol = new MarkerSymbol(regionsMap.get("poi"), HotspotPlace.BOTTOM_CENTER);
else
symbol = new MarkerSymbol(regionsMap.get("poi"), HotspotPlace.CENTER, false);
if (BILLBOARDS)
mFocusMarker = new MarkerSymbol(regionsMap.get("focus"), HotspotPlace.BOTTOM_CENTER);
else
mFocusMarker = new MarkerSymbol(regionsMap.get("focus"), HotspotPlace.CENTER, false);
mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this);
mMap.layers().add(mMarkerLayer);
List<MarkerItem> pts = new ArrayList<>();
for (double lat = -90; lat <= 90; lat += 5) {
for (double lon = -180; lon <= 180; lon += 5)
pts.add(new MarkerItem(lat + "/" + lon, "", new GeoPoint(lat, lon)));
}
mMarkerLayer.addItems(pts);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new AtlasMarkerLayerTest());
}
}

View File

@@ -17,7 +17,6 @@
package org.oscim.test;
import com.badlogic.gdx.Input;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.renderer.MapRenderer;

View File

@@ -20,13 +20,7 @@ import org.oscim.backend.canvas.Bitmap;
import org.oscim.backend.canvas.Color;
import org.oscim.core.GeoPoint;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.marker.ClusterMarkerRenderer;
import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerLayer;
import org.oscim.layers.marker.MarkerRenderer;
import org.oscim.layers.marker.MarkerRendererFactory;
import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.marker.*;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.OkHttpEngine;

View File

@@ -17,7 +17,6 @@
package org.oscim.test;
import com.badlogic.gdx.Input;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;

View File

@@ -28,7 +28,7 @@ import org.oscim.theme.VtmThemes;
public class ExtrusionsTest extends GdxMapApp {
enum GroundShape {
HEXAGON, RECTANGLE, SHAPE_L, SHAPE_O, SHAPE_T, SHAPE_U, SHAPE_V, SHAPE_X, SHAPE_Z, TEST
HEXAGON, RECTANGLE, SHAPE_L, SHAPE_M, SHAPE_O, SHAPE_T, SHAPE_U, SHAPE_V, SHAPE_X, SHAPE_Z, TEST
}
/**
@@ -123,6 +123,9 @@ public class ExtrusionsTest extends GdxMapApp {
case SHAPE_L:
shapeLGround(e);
break;
case SHAPE_M:
shapeMGround(e);
break;
case SHAPE_O:
shapeOGround(e);
break;
@@ -181,6 +184,19 @@ public class ExtrusionsTest extends GdxMapApp {
e.addPoint(0, 10);
}
private void shapeMGround(MapElement e) {
e.addPoint(0, 0);
e.addPoint(10, 0);
e.addPoint(10, 5);
e.addPoint(20, 5);
e.addPoint(20, 20);
e.addPoint(37, 20);
e.addPoint(37, 25);
e.addPoint(12, 25);
e.addPoint(12, 15);
e.addPoint(0, 15);
}
private void shapeOGround(MapElement e) {
hexagonGround(e);
e.reverse();

View File

@@ -24,7 +24,6 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
import org.oscim.backend.GL;
import org.oscim.core.Point;
import org.oscim.gdx.GdxMapApp;

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2014 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@@ -18,7 +18,6 @@
package org.oscim.test;
import com.badlogic.gdx.Input;
import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.canvas.Color;
import org.oscim.backend.canvas.Paint.Cap;
@@ -78,7 +77,7 @@ public class LineRenderTest extends GdxMapApp {
TextureItem tex = null;
try {
tex = new TextureItem(CanvasAdapter.getBitmapAsset("", "patterns/dot.png"));
tex.mipmap = true;
//tex.mipmap = true;
} catch (IOException e) {
e.printStackTrace();
}

View File

@@ -2,7 +2,6 @@ package org.oscim.test;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import org.oscim.backend.canvas.Color;
import org.oscim.core.GeometryBuffer;
import org.oscim.gdx.GdxMapApp;

View File

@@ -1,6 +1,6 @@
/*
* Copyright 2014 Hannes Janetzek
* Copyright 2016-2018 devemux86
* Copyright 2016-2019 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@@ -38,7 +38,7 @@ import java.util.List;
public class LineTexTest extends GdxMapApp {
private static final boolean ANIMATION = false;
private static final boolean ANIMATION = true;
private List<PathLayer> mPathLayers = new ArrayList<>();
private TextureItem tex;
@@ -54,7 +54,7 @@ public class LineTexTest extends GdxMapApp {
try {
tex = new TextureItem(CanvasAdapter.getBitmapAsset("", "patterns/pike.png"));
tex.mipmap = true;
//tex.mipmap = true;
} catch (IOException e) {
e.printStackTrace();
}

View File

@@ -14,6 +14,8 @@
*/
package org.oscim.test;
import okhttp3.Cache;
import okhttp3.OkHttpClient;
import org.oscim.core.MapPosition;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
@@ -29,9 +31,6 @@ import org.oscim.tiling.source.mvt.MapilionMvtTileSource;
import java.io.File;
import java.util.UUID;
import okhttp3.Cache;
import okhttp3.OkHttpClient;
public class MapilionMvtTest extends GdxMapApp {
// Metered API key for demonstration purposes

Some files were not shown because too many files have changed in this diff Show More