Mappedin JS, React & React Native SDK v6.30.0

Features

  • Added async MapData.Nodes for navigation Nodes. getAll(), getById(), getByExternalId(), and getByType() return the same Nodes as the synchronous getters. getByType() accepts a Floor, an EnterpriseLocation, a Connection, or a Directions result. Node.getNeighbors() returns the neighbouring Nodes. getAll() builds a Node for every node, so prefer getByType() with a Floor when one floor is enough. Compare Nodes by id. The synchronous getters still work and are deprecated: MapData.getByType('node'), MapData.getById('node', id), MapData.getByExternalId('node', id), Connection.nodes, EnterpriseLocation.nodes, and Node.neighbors.
const onFloor = await mapData.Nodes.getByType(floor);
const node = await mapData.Nodes.getById('n_1234');
const neighbors = await node?.getNeighbors();
  • Added travelDistanceOptions to Query.nearest() for mode: 'travel-distance'. excludedConnections and zones now rank results the same way getDirections does. A result that can only be reached through an excluded connection, or through a zone whose cost is Infinity, is omitted. The reported distance includes zone cost, so it can be larger than maxDistance. accessible and connectionIdWeightMap are not available on Query.nearest() yet.
const nearest = await mapData.Query.nearest(origin, evacuationPoints, {
    mode: 'travel-distance',
    limit: 'all-floors',
    travelDistanceOptions: {
        excludedConnections: elevatorsToAvoid,
        zones: avoidanceZones,
    },
});
  • Added costAccumulation on direction zones for getDirections and for Query.nearest() travel-distance zones. 'per-node' is the default, so existing routes are unchanged: every navigation node the route steps onto inside the zone adds the cost. 'per-zone-entry' charges the cost once each time the route enters the zone. Moving inside the zone adds nothing, and entering again charges again. A cost of Infinity still blocks the zone.
const directions = await mapData.getDirections(origin, destination, {
    zones: [
        {
            geometry: departmentPolygon,
            cost: 1000,
            costAccumulation: 'per-zone-entry',
        },
    ],
});
  • Added experimental __EXPERIMENTAL_outdoorPathWeightMultiplier on getDirections. It scales the cost of same-floor outdoor walking relative to indoor walking. Leave it unset to keep the map’s outdoor weights. 1 makes outdoor walking cost the same per metre as indoor walking, and 2 makes it cost twice as much. Cross-floor connections and indoor edges stay unchanged, and blocked outdoor edges stay blocked. The option has no effect on Enterprise map data. The name and behaviour may change, and no deprecation cycle is promised for this prefixed option.
const directions = await mapView.getDirections(start, end, {
    __EXPERIMENTAL_outdoorPathWeightMultiplier: 1,
});
  • Added shadows to show3dMap. Shadows stay off when the option is omitted. 'auto' is the recommended value: it picks a quality tier from the device and turns shadows off where they cannot render. true uses the default settings. An object sets the shadows explicitly. quality accepts 'low', 'medium', or 'high', and 'high' matches the previous defaults. On mobile, true and an object that omits quality are capped at 'medium'. Pass { quality: 'high' } to force the high tier. __EXPERIMENTAL_shadows is deprecated and still works. { enabled: false } becomes false, and { enabled: true, ... } becomes the remaining settings.
const mapView = await show3dMap(el, mapData, { shadows: 'auto' });
  • Added textWrap to Label appearance. 'max-width' is the default and fills each line up to maxWidth. 'balance' keeps the same number of lines and makes those lines as even in length as possible. Single-line Labels are unchanged, and maxLines still truncates with ....
mapView.Labels.add(space, 'Restrooms and guest services are straight ahead past the fountain', {
    appearance: {
        maxLines: 4,
        textWrap: 'balance',
    },
});
  • enableTestMode() now runs MapData and MapView headless in Node. Painting is skipped. Call it before show3dMap. setHeadlessViewport() sets the virtual size used when the container has no layout. The default size is 1920 by 1080.

Performance

  • Improved directions performance on large maps, including dp-optimal path smoothing.
  • Improved path arrow animation performance, resulting in lower CPU use while arrows animate.
  • Improved shadow rendering performance, resulting in higher frame rates while the camera moves and lower memory use.

Fixes

  • Fixed an issue where default greedy-los path smoothing drew a node-to-node zigzag through an open area with a clear line of sight. The path now collapses across that open area. The first step still follows the edge the router chose, so smoothing does not cut across a zone the route was avoiding.
  • Fixed an issue where onMVFParsed in hydrateMapData ran after the map was built, so in-place edits were ignored. The callback now runs before the map is built, matching getMapData.
  • Fixed an issue where a Space side texture also tinted the top face.
  • Fixed an issue where replacing a legacy Space texture with a plain texture kept the old repeat, offset, and rotation.
  • Fixed an issue where re-hydrating a bundle from toJSONBundle() drew each Enterprise Space texture twice.
  • Fixed an issue where dashes on a ribbon Path disappeared, and which dashes disappeared changed with zoom.
  • Fixed an issue where floor footprints were visible by default. Footprints stay hidden until multi-floor view shows them, or until updateState sets a floor’s footprint.
  • Fixed an issue where releasing a drag on a Model or Marker fired a click, including a drag that ended near where it started.
  • Fixed an issue where fading an instanced Model replaced each material’s own opacity, so transparent parts of the model appeared as a halo.
  • Fixed an issue where a Model with visibleThroughGeometry: true drew nested meshes twice, leaving stray geometry away from the pin.
  • Fixed an issue where Marker zIndex did not change stacking order. zIndex now sets stacking against sibling Markers, on add and on updateState. Passing zIndex: undefined to updateState clears it.
  • Fixed an issue where 'hidden' was tried in list order for Marker placement and Label textPlacement. 'hidden' is now always tried last, wherever it is listed. Also fixed an issue where creating a Marker with its own placement replaced the default ['center', 'hidden'] for Markers created afterwards.
  • Fixed an issue where a truncated right-to-left Label drew ... at the start of the text. The ellipsis now sits at the end of the text.
  • Fixed an issue where shadows on a floor high above the ground, or on a floor with a large altitude, drifted away from the walls and could disappear on the highest floors.
  • Fixed an issue where a tall shadow caster lost part of its ground shadow, and the missing piece shifted while panning.
  • Fixed an issue where shadows stopped rendering after a zoom change while they were faded out.