Skip to content

Changelog

What shipped, in plain language. Newest first.

This file lists every notable change to LansMap. The format follows Keep a Changelog; versioning follows Semantic Versioning.

Pre-1.0, the public API is unstable and renames land without deprecation shims.

[0.4.0] - 2026-09-19

Fixed

  • Adding, moving, hiding, or removing a clustered marker updates its bubble immediately while the exact hierarchy rebuild finishes in the background.

  • TileUrlBuilder handles long URL templates, and both tile fetchers reject responses over 64 MiB with TileFetchError.Protocol.

  • MapInteractionController finished scroll zoom smoothly and stopped trailing input from restarting a completed zoom.

  • ScreenMapView drew map overlays before transparent 3D objects in Built-in rendering and stopped redrawing them through other cameras.

  • ScreenMapView.FitToBounds keeps the whole box on screen when the map is rotated. It used to size the fit as if the map were north-up.

  • 3D markers in demo scenes no longer drifted off the ground when the view was pitched.

Added

  • Native platforms rebuilt marker clustering on a worker thread, while the Web build used a calibrated per-frame budget.

  • ScreenMapView.FitToPoints fits any set of coordinates under the current rotation, so a diagonal shape fills the padded screen instead of its north-up bounding box.

  • GeoUtils.LongitudeArcOf finds the smallest longitude arc around a set of coordinates, and every point fit (FitToMarkers, FitToPoints) now uses it, so a set crossing the antimeridian or wider than half the world fits its true span instead of an arbitrary hemisphere.

Changed

  • IMapFlyTarget gains a read-only RotationDeg. Add it to any custom implementation.

[0.3.0] - 2026-09-08

Changed

  • Tile streaming reuses download buffers across mixed tile sizes instead of allocating fresh large ones.
  • TileFootprint.WorstCaseCount and ScreenMapView.SelectionPinBudget reuse their last sizing results while view settings stay unchanged, cutting repeated rotation sweeps and their allocations.
  • SurfaceWorldMarkerRenderer refreshes changed marker filters and shapes, skips marker uploads during reanchors, and keeps marker drawing and picking aligned at half-world boundaries.
  • PolygonLayer applies pending edits without a reanchor. PolylineLayer uploads only changed segment blocks, shared stores included.
  • WorldMarkerInstance and WorldMarkerBinding are now PrefabMarkerInstance and PrefabMarkerBinding. Update code that names them.
  • ScreenMapView shows its prefab marker plane distance under the View settings in the inspector.

Added

  • Unity UI (Canvas) elements block map pointer input, like the built-in overlays: a Canvas raycaster hit counts as UI, a PhysicsRaycaster or Physics2DRaycaster collider hit does not.
  • Typing in a Canvas InputField or TMP_InputField suppresses WASD pan, zoom, and rotate.
  • BaseMapView gains GetCorners, Prefabs, ViewChanged, ViewChangedDetailed, TryLatLonToWorld, and LatLonToWorld.
  • MapFollowController follows any moving object (IMapFollowTarget, prefab markers included) with heading-up rotation, screen offset, and smoothing.
  • MapInteractionController gains ZoomOnPoint and button-aware Clicked events.
  • Prefab-tier markers gain press, hover, and click events. A drag starting on a marker pans the map underneath it, at the marker’s altitude; click and long press are unchanged.
  • MarkerTrailRecorder records a trail behind a moving marker.
  • A bulk MarkerHandle gains Position, AltitudeMeters, AltitudeMode, SizeParam, SizeMode, ColorRgba, and Shape, so moving or restyling a marker no longer needs handle.Store. Captions follow automatically.
  • Tile URL templates accept named placeholders beyond {z}, {x}, and {y}: {zoom}, {-y}, {q}, and {r}.
  • ScreenMapView.CapacityPitchCapDeg caps Automatic tile-capacity sizing at an app’s real maximum tilt instead of the full 85 degrees.
  • PolylineHandle rewrites and dashes a polyline every frame with no per-frame allocation. A line can stay constant on screen, follow a fixed ground distance with a zoom-out fade, ignore pitch, or lie flat in the ground plane.
  • Polyline joins and caps are rounded by default, with a per-line corner radius from sharp to fully round.
  • Polygons.AddPolygon returns a PolygonHandle, whose SetPositions rewrites the fill without removing and re-adding the polygon.
  • RegisterExternalOverlay accepts a named MapDrawOrder anchor, so a registered overlay can draw at any point in the layer order instead of always last.

Fixed

  • A URP project missing LansMapTilePassFeature logs an error naming the fix.
  • Tiles no longer render washed out in a project using Linear color space.
  • Draws deferred past pipeline detachment are ignored, preventing null-reference errors and stale tiles.
  • A sustained fast mouse-wheel scroll travels as far with ZoomSnap on as with it off.
  • Cancelling or tearing down an elevation fetch aborts its in-flight requests.
  • Polylines no longer get cut off at steep pitch. They stop at the same horizon markers and tiles already draw to.
  • Horizon fade reaches polylines, bulk markers, marker labels, and filled polygons, not only tiles.

[0.2.0] - 2026-08-31

Changed

  • WorldMarkerManager is now PrefabMarkerManager, naming what the type is rather than where a marker lives. Update code that names it.

Added

  • Markers gain altitude modes (MarkerAltitudeMode), ground stems under floating markers, batched shapes, and per-handle UpdateStyle.
  • Elevation, search, and directions are pluggable like tile providers. Two maps in one scene can each read from a different input device.
  • SurfaceMapView gains TileFadeSeconds/FadeAllLoads, and opt-in tile GPU pooling reduces web memory growth across scene switches.
  • RasterQualityComparisonOverlay: a diagnostic panel that cycles through every tile format the device supports (BC1, ETC2).

Fixed

  • Tiles decode in priority order, fade in smoothly, no longer stall after a fast pan, and stream with far less per-frame allocation.
  • StressMarkerDemo and FpsCounterOverlay now label their readout “ups”, not “fps”: both measure the update loop, not the screen.
  • Rotated maps no longer show a grey screen-edge wedge or caption flicker, and terrain tilt can no longer outrun tile coverage.
  • Scroll zoom blends wheel notches into one continuous motion, not separate jumps, and now feels consistent between a mouse wheel and a trackpad; fly-to goes straight to nearby targets (arc optional).
  • Overlapping bulk 2D markers now occlude by which one is nearer the camera instead of by the order they were added.

[0.1.0] - 2026-08-16

Removed

  • MarkerStoreManager.HideOutsideWorldBounds and the marker shader plumbing behind it. Under world wrap the world repeats, so “outside the world” stopped being a meaningful test. HideOffscreenMarkers already hides markers outside the current view. A scene that saved the old field loads fine, because Unity silently drops unknown serialized fields.

Changed

  • Longitude 180 now reads back as -180 everywhere. Both spellings name the same meridian and used to draw a world apart. Setting ScreenMapView.Longitude past the range no longer throws. The value wraps around the seam, as FlyTo always did.

  • MapBehaviour is now ScreenMapView, and MapSurfaceBehaviour is now SurfaceMapView. Behaviour described the Unity base class rather than the type. ScreenMapView states the role: it holds view state and drives the renderer, TileBatchRenderer. Scenes and prefabs are unaffected, because Unity resolves components by script GUID and both GUIDs are unchanged. Update code that names either type. Pre-1.0, so no deprecation shim, per the note above.

Added

  • Editor/LansMap.Editor.asmdef. Editor code compiled into the consumer’s Assembly-CSharp-Editor before this change, and UPM cannot package code without an assembly definition.
  • GroupedEditor base class: any serialized property a grouped inspector does not name renders under an “Other” foldout instead of vanishing.
  • package.json, README.md, this file.
  • Demo scene generators pin their tile provider explicitly, so the demos keep working once the shipped default is “none”.

Fixed

  • Public inspector fields hidden by the custom editors are visible again, including mobile touch tuning, cache limits, and fly timing.
  • Editor scripts now compile inside the packaged editor assembly instead of leaking into the consuming project’s editor assembly.

Documentation

  • Documented render pipeline support: Built-in RP only. URP and HDRP are not supported, and a URP port would be a separate release.
  • Documented the web target: WebGPU only. Plain WebGL2 renders no base map because the rendering path requires structured GPU buffers.
  • Documented the Latin-script label limitation.
  • Expanded the demo guidance for the samples included with the package.