Skip to content

Releases: massif-maps/MassifMaps

v6.0.2

Choose a tag to compare

@github-actions github-actions released this 07 Sep 11:14

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:

  1. In Xcode: File → Add Packages…
  2. Paste the package URL: https://github.com/massif-maps/MassifMaps-ios-swift
  3. Select version v6.0.2 and add it to your target.

Or download the prebuilt framework attached to this release.

v6.0.1

Choose a tag to compare

@github-actions github-actions released this 18 Aug 23:33
f94ef5c

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

Bug Fixes


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:

  1. In Xcode: File → Add Packages…
  2. Paste the package URL: https://github.com/massif-maps/MassifMaps-ios-swift
  3. Select version v6.0.1 and add it to your target.

Or download the prebuilt framework attached to this release.

v6.0.0

Choose a tag to compare

@github-actions github-actions released this 16 Aug 21:44

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::xparam::x, nutiparametersstyleparameters, and the placements
nutibillboardbillboard, nutibillboardlinebillboard-line, nutipointflat,
nuticalloutcallout.

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 its z by 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.setCameraClearance holds 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.ViewDistanceFactor ends the ground on tangram's rule
    and the background plane and sky pick up the same fog; FarPlaneFactor controls 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: setMaxTileZoomOffset caps terrain LOD relative to camera zoom, setExaggeration,
    setMeshResolution, setDrapeResolution, and getElevation/getElevations queries sharing the
    elevation cache. Terrain is PLANAR render 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 explicit setTileFormat, 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 a contour layer with ele and div matching the
    gdal_contour pipeline, so it drops into a normal VectorTileLayer with 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
  • DirAssetPackage and AndroidAssetPackage load 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

  • CompositeVectorTileLayer weaves 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...
Read more

v5.2.3

Choose a tag to compare

@github-actions github-actions released this 03 Jun 09:08

Bug Fixes

  • 42321f7 - HillshadeTileLayer getElevations fix

v5.2.2

Choose a tag to compare

@github-actions github-actions released this 30 Apr 20:48

Bug Fixes

  • 6243f7f - ValhallaOnlineRoutingService setHeaders fix

v5.2.1

Choose a tag to compare

@github-actions github-actions released this 30 Apr 16:06

Bug Fixes

  • cb137c5 - headers and timeout support for online valhalla routing

v5.2.0

Choose a tag to compare

@github-actions github-actions released this 13 Apr 06:57

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=64
  • 93ad761 - 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

Choose a tag to compare

@github-actions github-actions released this 04 Apr 08:19
chore: ios build fix

v5.0.4

Choose a tag to compare

@github-actions github-actions released this 02 Apr 14:50
73e0459
Merge pull request #9 from Akylas/copilot/fix-terrain-hillshading-issues

Fix hillshade transparency and intensity to match MapLibre

v5.0.3

Choose a tag to compare

@github-actions github-actions released this 02 Apr 10:13

New Features