Releases: massif-maps/MassifMaps
Release list
v6.0.2
New Features
9cf7e31- datasources: accept setMetaDataElement("dem_encoding") alongside setEncoding (commit by @farfromrefug)
Installation
Android
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
dependencies {
implementation 'com.github.massif-maps:MassifMaps-android-aar:v6.0.2'
}Add the INTERNET permission to AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET"/>iOS
Use Swift Package Manager:
- In Xcode: File → Add Packages…
- Paste the package URL:
https://github.com/massif-maps/MassifMaps-ios-swift - Select version
v6.0.2and add it to your target.
Or download the prebuilt framework attached to this release.
v6.0.1
BREAKING CHANGES
-
due to
40ef746- fog the whole map in 2D and let an app replace the fog shader (PR #123 by @farfromrefug):TerrainOptions.FogColor/FogStartDistance/FogDistance and
SkyOptions.FogBlend/FogHorizon are gone - use FogOptions, whose range is in multiples of the
camera-to-focus distance rather than metres, so the old numbers do not carry over. The style
properties fog-start-distance / fog-distance become fog-range-start / fog-range-end. See
docs/migration.md. -
due to
d6f25d2- keep long mountain shadows when panning back, in view-relative units (commit by @farfromrefug):LightOptions.setShadowDistance takes a multiple of the
camera-to-focus distance, not metres. The signature is unchanged, so an app passing
20000 compiles and asks for 20000 times the view. Drop the call and take the
default, or scale from there. See docs/migration.md. -
due to
35174ea- keep mountain and building shadows sharp and present at every zoom and tilt (PR #128 by @farfromrefug):LightOptions.setShadowDistance takes a multiple of the
camera-to-focus distance, not metres. The signature is unchanged, so an app passing
20000 compiles and asks for 20000 times the view. Drop the call and take the
default, or scale from there. See docs/migration.md.
New Features
645c736- demo: add the style regression repro layer (commit by @farfromrefug)40ef746- renderers: fog the whole map in 2D and let an app replace the fog shader (PR #123 by @farfromrefug)6f13bb4- terrain: add LightOptions.shadowNormalOffset for cleaner building shadows (commit by @farfromrefug)525d15b- terrain: log how many shadow casters were skipped for missing elevation (commit by @farfromrefug)f94ef5c- labels: let one style pick flat labels in 2D and billboard ones in 3D (PR #136 by @farfromrefug)
Bug Fixes
97da528- vt: the reported style regressions in labels, lines and clipped text (commit by @farfromrefug)c999149- terrain: stop the previous zoom flashing over the map when zooming out (PR #124 by @farfromrefug)d6f25d2- terrain: keep long mountain shadows when panning back, in view-relative units (commit by @farfromrefug)be7f83f- terrain: keep building shadows sharp as the view tilts (commit by @farfromrefug)1351675- terrain: bound the shadow caster ring by the throw distance, not by a tile count (commit by @farfromrefug)6bf362a- terrain: size the shadow caster ring from the surrounding massif, not the visible cover (commit by @farfromrefug)0f10837- terrain: span the caster tiles with the shadow height slab, not the cover (commit by @farfromrefug)35174ea- terrain: keep mountain and building shadows sharp and present at every zoom and tilt (PR #128 by @farfromrefug)ff196c8- shadow strenght was too high (commit by @farfromrefug)fb4b533- terrain: shade contours with the ground they lie on (PR #130 by @farfromrefug)
Installation
Android
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
dependencies {
implementation 'com.github.massif-maps:MassifMaps-android-aar:v6.0.1'
}Add the INTERNET permission to AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET"/>iOS
Use Swift Package Manager:
- In Xcode: File → Add Packages…
- Paste the package URL:
https://github.com/massif-maps/MassifMaps-ios-swift - Select version
v6.0.1and add it to your target.
Or download the prebuilt framework attached to this release.
v6.0.0
The first release under the project's own name. The CARTO Mobile SDK is now Massif Maps: every
namespace, package, class prefix, artifact and debug token is renamed, the hosted CARTO services are
gone, and the project has moved to the massif-maps organisation.
The same release carries the whole 3D terrain, lighting and rendering-performance cycle that landed
since v5.2.3 — 3D terrain with GPU draping and cascaded shadows, a sky and sun model, MapLibre Tiles
(MLT) support, on-the-fly contours, composite vector-tile layers, celestial objects, custom shaders,
and a large body of measured performance work.
Full documentation: https://massif-maps.github.io/MassifMaps/
Migration from the CARTO Mobile SDK
Massif Maps is the CARTO Mobile SDK, forked and kept alive after CARTO stopped maintaining it.
The 4.x/5.x concepts, class shapes and CartoCSS styles all still apply — what changed is the name.
For most apps the migration is a dependency line and a find-and-replace.
1. Change the dependency.
// before
implementation 'com.carto:carto-mobile-sdk:4.4.+'
// after — JitPack overrides the declared groupId, so the coordinate is the GitHub path
implementation 'com.github.massif-maps:MassifMaps-android-aar:v6.0.0'On iOS the CocoaPod is replaced by a Swift package:
https://github.com/massif-maps/MassifMaps-ios-swift.
2. Rename the imports.
# Android / Java / Kotlin
grep -rl 'com\.carto\.' src/ | xargs sed -i '' 's/com\.carto\./com.massifmaps./g'
# iOS / Obj-C / Swift — class prefix NT -> MSF
grep -rl 'NT[A-Z]' Sources/ | xargs sed -i '' -E 's/\bNT([A-Z][A-Za-z0-9]*)/MSF\1/g'3. Replace anything that talked to CARTO's servers (see Removed below).
4. Styles need no change. nuti:: still parses, with a deprecation warning.
| Before | After | |
|---|---|---|
| Java / Kotlin | com.carto.* |
com.massifmaps.* |
| Java (routing-lib) | com.akylas.routing.* |
com.massifmaps.routing.* |
| Objective-C / Swift | NTMapView, NT_* |
MSFMapView, MSF_* |
| .NET | Carto.Ui, Carto.Layers |
Massif.Ui, Massif.Layers |
| C++ | carto:: |
massif:: |
| Build defines | _CARTO_*_SUPPORT |
_MASSIF_*_SUPPORT |
| Native library | libcarto_mobile_sdk.so |
libmassif.so |
| Gradle artifact | com.carto:carto-mobile-sdk |
com.massifmaps:massif |
| logcat tag | carto-mobile-sdk |
massif |
CartoCSS keeps parsing the old spelling, with one deprecation warning per token per stylesheet:
nuti::x → param::x, nutiparameters → styleparameters, and the placements
nutibillboard → billboard, nutibillboardline → billboard-line, nutipoint → flat,
nuticallout → callout.
Deliberately not renamed, because they name data users already have on disk or upstream work,
not this SDK: the NUTi bitmap magic, nutikeysha1, .nutigraph / .nutigeodb,
__Nuti_pkgmgr_, cartodb_id, CartoCSS the language, and the CartoDB attribution.
Every renamed token is listed in docs/migration.md
(online).
Rebrand PR: #99.
New Features
3D terrain
The map surface is displaced by a DEM elevation source (Mapbox or Terrarium RGB encoding), attached
with Options.setTerrainOptions(...). Every layer type renders on it — vector tiles, raster
overlays, hillshade, 3D buildings and vector elements — with a single shared depth model.
See docs/features/3d-terrain.md and
docs/internals/rendering/04-terrain.md.
- GPU draping. Elevation tiles are uploaded as GL textures and every draped vertex shader
replaces itszby sampling the shared texture, so all layers agree on heights exactly.
Polygon fills and backgrounds are baked into a per-tile render-to-texture drape (MapLibre's
model), cached across frames, so they follow the terrain with no holes or see-through.
TerrainOptions.NoDrapeLayerFilter(default^contour.*) keeps hairline content at screen
resolution. (#17,
#21) - Painter-order depth model, ported from tangram-ng: a terrain depth pre-pass is the single
depth source, so overlapping draped layers cannot z-fight while ridges still occlude what is
behind them. Red-green edge-local tesselation removes the T-vertex cracks at LOD transitions.
(#17) - Matching DEM heights across tile edges. Elevation texture borders are backfilled from real
neighbours (texel-exact at the same level, sampled at border texel centres from a coarser
ancestor), and visible tiles now prefetch their own elevation tile and its neighbours through a
background worker instead of relying on map-tile fetches. Opt out with
setSeamlessTileEdgesEnabled(false)/setElevationPrefetchEnabled(false).
(#35) - Camera and gestures are terrain-aware.
TerrainOptions.setCameraClearanceholds the camera
above the ground as a zoom bound rather than a corrective jump, panning keeps the touched terrain
point under the finger, and pinch/rotate take their scale and angle from the screen (tangram's
model) so a grazing ray can no longer cancel a gesture.
(#23,
#77) - View distance and fog.
TerrainOptions.ViewDistanceFactorends the ground on tangram's rule
and the background plane and sky pick up the same fog;FarPlaneFactorcontrols the far plane.
(#39,
#49) - Labels and billboards are anchored on the surface, hidden behind ridges via a depth readback
with hysteresis (setBillboardOcclusionEnabled), and keep a constant screen size. - Also:
setMaxTileZoomOffsetcaps terrain LOD relative to camera zoom,setExaggeration,
setMeshResolution,setDrapeResolution, andgetElevation/getElevationsqueries sharing the
elevation cache. Terrain isPLANARrender projection only.
Sky, sun lighting and shadows
LightOptions gains the sun (azimuth/altitude, or setSunPositionFromTime), intensity, ambient
and the shadow controls; TerrainShadowMap renders cascaded shadow maps (3×1024 by default),
snapped and cached so the caster pass only re-runs when the light box, caster set or tile content
changed. SkyOptions draws a ray-direction sky that an app can replace wholesale with
setShaderSource. StyleEnvironment::resolveLighting/resolveFog merge the app's options with
the CartoCSS Map block, per property and zoom-dependent, and light the fog itself — dark at
night, warm at a low sun — so ground, background plane and sky always agree.
(#27,
#40,
#29) —
docs/features/sky-sun-shadows.md
Data sources and tile formats
- MapLibre Tiles (MLT).
MBVectorTileDecoder.TileFormat=AUTO(default) /MVT/MLT.
Resolution order is an explicitsetTileFormat, then the source's own metadata, then per-tile
detection (measured at 1 ns/tile for MVT, 19 ns for MLT). Everything downstream of the decode is
unchanged, so an app pointed at an MLT source needs no code change.
TileDataSource::getMetaData(key)is now a base virtual, forwarded by the cache, contour, ordered
and combined sources. (#90) —
docs/features/maplibre-tiles.md ContourTileDataSource— on-the-fly contour lines from any RGB-elevation source via marching
squares, sharing its fetch and decode. Emits acontourlayer witheleanddivmatching the
gdal_contourpipeline, so it drops into a normalVectorTileLayerwith no style change.
Options for base interval, generation resolution, min zoom, simplify tolerance and seamless edges.
(#18) —
docs/features/contours.md- GeoJSON sources are tiled from a geojson-vt pyramid instead of rescanning every feature for
every tile and keeping one re-simplified copy per zoom.
(#54) —
docs/features/geojson-vector-tiles.md DirAssetPackageandAndroidAssetPackageload a style from a filesystem directory or from
the app's assets, so a style can be edited in place with no repackaging.
(#42)
Layers and styling
CompositeVectorTileLayerweaves named external sources (raster, hillshade, extra vector or
contour) into a master CartoCSS style's layer order, each placed at a matching layer name and
configured from a#name { … }block with zoom- and parameter-dependent expressions. Sources can
be added and removed at runtime. Single-pass rendering decodes the master style once and is the
default (`setSinglePassRenderingEnabled(f...
v5.2.3
Bug Fixes
42321f7- HillshadeTileLayergetElevationsfix
v5.2.2
Bug Fixes
6243f7f- ValhallaOnlineRoutingService setHeaders fix
v5.2.1
Bug Fixes
cb137c5- headers and timeout support for online valhalla routing
v5.2.0
New Features
bfbc0c9- implement standalone routing-lib with Valhalla datasource abstraction (commit by @Copilot)2d6b5c6- add ROUTING_WITH_HTTP_CLIENT flag and integrated C++ HTTP client for routing-lib (commit by @Copilot)8293e30- replace datasource abstraction with direct DB management, add profile injection (commit by @Copilot)
Bug Fixes
86ed63a- Implement custom glyph render size per font via query parameters like MyFont?glyph_size=6493ad761- use sqlite3pp::database instead of raw sqlite3* for Valhalla GraphReader (commit by @Copilot)8b127c5- rewrite routing-lib HTTPClient to match main SDK Impl pattern (no boost/BinaryData) (commit by @Copilot)f3a8f5c- add RAPIDJSON_HAS_STDSTRING=1 to routing CMakeLists for 64-bit build (commit by @Copilot)8396ab7- replace boost json_parser with picojson for config parsing in ValhallaRoutingProxy (commit by @Copilot)9b79821- remove unused swig java classes
Refactors
daef075- switch ValhallaRoutingProxy to picojson/boost-json, remove Variant from API (commit by @Copilot)
v5.1.0
v5.0.4
Merge pull request #9 from Akylas/copilot/fix-terrain-hillshading-issues Fix hillshade transparency and intensity to match MapLibre
v5.0.3
New Features
f68ae7b- Implement MapLibre hillshading rendering methods (commit by @farfromrefug)