You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ImmersiveMapCameraTourController: runs the camera through a sequence of ImmersiveMapCameraTourShots (position, flight options, hold time), chaining flights back to back. Supports an optional establishing jump, looping, a finish callback, and stops automatically when the user starts a gesture (without occupying the public onUserInteractionBegan callback). Useful for cinematic fly-throughs, demo reels, and onboarding tours.
Declarative SwiftUI markers: .markers(items, coordinate:anchor:content:) on ImmersiveMapView anchors arbitrary SwiftUI views to geographic coordinates. Markers are repositioned every rendered frame (flat, globe, and through the morph, riding the unfurl wave), fade behind the globe horizon, and stay fully interactive: buttons and gestures inside marker content work while the map keeps gestures elsewhere. See Documentation/docs/markers.md.
Fixed
Toggling enableCameraUIControls no longer tears down and recreates the whole platform map view: the SwiftUI body keeps one stable view identity, so the renderer, tile caches and controller attachments survive UI chrome toggles.
A dismantled host view no longer detaches camera, avatars and selection controllers from a newer host view that reuses them (SwiftUI creates the replacement representable before dismantling the old one). Detach is now ownership-checked, which unbreaks camera commands, including ImmersiveMapCameraTourController tours, across view recreation.
Renderer recreation now completes an active camera flight with success == false instead of silently swallowing its completion, so chained fly calls cannot hang on a never-resumed continuation.
SwiftUI markers on the far side of the globe no longer leak through the horizon mid-morph. The horizon threshold now relaxes per point with the unfurl-wave local phase instead of the global transition: a still-spherical point keeps the strict spherical test. Tiles hide this leak behind the depth test, the view overlay has none.
The globe polar caps no longer flicker or break into gray triangle fans. The cap smears a single edge-texel row of the boundary tiles, but sampled it with automatic mip selection: near the pole the uv derivatives explode (meridians converge, the longitude wrap adds a derivative discontinuity), so the sampler dove into deep atlas mips where texels average unrelated tiles, and every atlas repack reshuffled the colors. The cap now samples the base mip explicitly and feathers toward the pole color, so narrow coastal features at the boundary row (like Ross Sea water) no longer smear radial needles across the cap.
Changed
CameraFlightAltitudeStyle.overviewFirst now flies a true van Wijk & Nuij overview arc: the camera climbs out (up to a full-globe view for intercontinental flights, proportionally lower for short hops), covers the distance at the apex, then dives to the target. Pan speed is coupled to altitude, so the camera crawls near the ground instead of streaking across street-level tiles. Previously the style merely delayed a direct zoom interpolation, so long flights panned the whole route at the start zoom.
Renamed the avatar tap API: the onMarkerTap modifier is now onAvatarTap, and ImmersiveMapMarkerTapEvent is now ImmersiveMapAvatarTapEvent (same fields). No compatibility shims. The term "marker" now belongs to the SwiftUI marker overlay API introduced in this release. The avatars guide moved from Documentation/docs/markers.md to Documentation/docs/avatars.md.