WorldWind Kotlin 2.0.3
11 commits since 2.0.2.
3D Tiles (new)
OGC / Cesium 3D Tiles 1.0 / 1.1 streaming layer. Supports b3dm / i3dm / cmpt / pnts / glTF binary / Gaussian-splat payloads, served via Cesium Ion + Google Photorealistic + Bearer / custom-headers auth providers, with per-feature picking through batch tables. Vertical-datum correction via altitudeOffset + altitudeMode (ABSOLUTE / RELATIVE_TO_GROUND / CLAMP_TO_GROUND). Stencil-masked skip-LoD keeps fallback tiles visible under refining children without inter-LoD flicker.
Niantic SPZ Gaussian-splat codec wired in via the gaussianLoader hook on Ogc3dTilesLayer.
Tutorials: OGC Container (Utrecht), Google Photorealistic, Cesium Ion (defaults to asset 96188 OSM Buildings; swappable to any Ion asset).
Codec modules — new, independent Maven coordinates at 1.0.0
Three optional native-backed glTF extension modules. Each ships per-platform binaries (JVM JARs for macos-aarch64 / macos-x86_64 / linux-x86_64 / windows-x86_64; Android AARs for all four ABIs; iOS klibs via cinterop) and registers itself with the engine at startup via the corresponding installXxxDecoder() call.
| Module | glTF extension(s) covered |
|---|---|
earth.worldwind:worldwind-formats-gltf-draco:1.0.0 |
KHR_draco_mesh_compression + 3DTILES_draco_point_compression |
earth.worldwind:worldwind-formats-gltf-ktx2:1.0.0 |
KHR_texture_basisu (Basis Universal) |
earth.worldwind:worldwind-formats-gltf-meshopt:1.0.0 |
EXT_meshopt_compression |
The engine has no compile-time dependency on these — add them to your build only if your tilesets use the matching extension.
Fixes
- Web — EGM96 geoid byte-order. The Kotlin/JS actual was viewing the fetched binary as a platform-native
Int16Array(little-endian on x86/ARM) while the NGA file is big-endian per spec, returning byte-swapped offsets. Terrain mesh drifted by the local geoid separation: Utrecht tilesets levitated ~44 m above terrain, Manhattan OSM Buildings sat ~34 m below it. Fixed inwebMain/EGM96Geoid.kt.
Other changes
- JVM rendering:
WorldWindowswapped fromGLJPanelto heavyweightGLCanvas. Fewer blit copies, no PBO contention with Swing's repaint, far better per-frame stability under continuous redraws. - GeoPackage caches: per-put LRU eviction across all stores; long-running sessions can no longer out-grow their byte budget.
CachePolicy: removed themaxBytescapacity cap. LRU eviction pressure makes the hard ceiling redundant; callers size caches by working-set instead.- Internal: project version externalised to
gradle.properties(worldwind.version,worldwind.codecsVersion) for CI-driven auto-release on master pushes when either advances past Maven Central.
Web tutorial host (GitHub Pages)
The Pages tutorial bundle now reads CESIUM_ION_TOKEN and GOOGLE_MAPS_API_KEY from repository Secrets at build time. Keys ship inside the public JS bundle, so they must be locked at the provider — HTTP-referrer restriction on the Google Maps Platform key (Map Tiles API only), asset-scoped + referrer-allowlisted Cesium Ion token (assets:read only). Placeholders fall back at build time for local dev without secrets configured.