2026.1.01

ImprovementLuciadCPillar

LCP-1808
Added support for the symbol-spacing styling property in MbTilesFeatureLayerMbTilesFeatureLayerMbTilesFeatureLayer.

ImprovementLuciadCPillar

LCP-1783
Improved the performance of visualizing projected imagery. The improvement is most noticeable on mobile devices.

ImprovementLuciadCPillar

LCP-1794

It is now possible to configure the APP-6A and APP-6B "Antitank Ditch" symbols to be painted using the "Under Construction" stroke pattern. To paint these symbols using the "Under Construction" stroke pattern, set the MilitarySymbol::Modifier::TypeLabelMilitarySymbol::Modifier::TypeLabelMilitarySymbol::Modifier::TypeLabel modifier to "U" or "Under Construction".

ImprovementLuciadCPillar

LCP-1804
An on-path label of a geometry with several lines now prefers the line with the most segments.

ImprovementLuciadCPillar

LCP-1747
The country modifier is now shown as a label for APP-6D symbols from the Space symbol set.

Bug fixLuciadCPillar

Fixed several issues when the map was changed right after Map::setReferenceMap::setReferenceMap::setReference, before it was painted again: adding or removing a layer could fail, and a resize or a change like Map::setDisplayScaleMap::setDisplayScaleMap::setDisplayScale could be lost. Map::getCameraMap::getCameraMap::getCamera could also return the camera for the previous reference, and Map::setCameraMap::setCameraMap::setCamera could fail, for example in an IMapObserverIMapObserverIMapObserver that reacts to the reference change, or when the map is painted on the UI thread.

Bug fixLuciadCPillar

LCP-1805

Bug fixLuciadCPillar

LCP-1797
Fixed an issue where TileSet3DLayer::setTransformationTileSet3DLayer::setTransformationTileSet3DLayer::setTransformation would not be applied correctly to tilesets containing Gaussian splats.

Bug fixLuciadCPillar

LCP-1791
The Qt Widgets sample integration (QMapWidget) now calls Map::deliverNotificationsMap::deliverNotificationsMap::deliverNotifications after each paint. Previously, map events such as camera and busy changes were not delivered.

Bug fixLuciadCPillar

GeodesyCalculations::intersectLineSegmentsGeodesyCalculations::intersectLineSegmentsGeodesyCalculations::intersectLineSegments could return a line segment instead of a point for two rhumb lines that share an end point and leave it in different directions, when these directions differed by a multiple of about 6.28 degrees.

Bug fixLuciadCPillar

GeodesyCalculations::distance2DGeodesyCalculations::distance2DGeodesyCalculations::distance2D for rhumb lines now includes the north-south part of the distance for points whose latitudes differ by less than 1e-8 degree (about a millimeter).

Bug fixLuciadCPillar

GeodesyCalculations::interpolateGeodesyCalculations::interpolateGeodesyCalculations::interpolate for geodesic lines is now accurate for points on either side of the date line. Previously the result could be meters off the geodesic for points a kilometer apart, and centimeters off for points 100 kilometers apart. This also affected other computations on geodesic lines that cross the date line, such as their bounds.

Bug fixLuciadCPillar

LCP-1786
Rhumb line computations are now more accurate for rhumb lines that run nearly east-west.

Bug fixLuciadCPillar

FeatureModelBuilderFeatureModelBuilderFeatureModelBuilder now prevents creating a model with duplicate feature IDs: of the features with the same ID, it keeps only the first one. This also fixes an issue where a model with a spatial index returned the wrong features for a query with bounds, or threw an exception after such a feature was removed.

Bug fixLuciadCPillar

LCP-1820
Fixed an issue where GeodesyCalculations::distance3DGeodesyCalculations::distance3DGeodesyCalculations::distance3D with rhumb line interpolation returned the geodesic distance when both points have a height of 0.

Bug fixLuciadCPillar

LCP-1819
Fixed an issue where a TransformationTransformationTransformation between two topocentric references with the same geodetic datum but different origins returned the coordinates unchanged.

Bug fixLuciadCPillar

Fixed an issue where a query with a limit of 0 on a FeatureModelBuilderFeatureModelBuilderFeatureModelBuilder model returned all matching features instead of none.

Bug fixLuciadCPillar

LCP-1815
Fixed an issue where a query on an editable GeoPackage model with unsaved changes ignored the sort order and could return up to twice the limit.

Bug fixLuciadCPillar

LCP-1815
Fixed a crash when the updater of an editable FeatureModelBuilderFeatureModelBuilderFeatureModelBuilder model was used after the model was destroyed. The updater now reports each change to IFeatureUpdaterCallback::onFailureIFeatureUpdaterCallback::onFailureIFeatureUpdaterCallback::onFailure instead.

Bug fixLuciadCPillar

LCP-1815
Fixed an issue where a query on a FeatureModelBuilderFeatureModelBuilderFeatureModelBuilder model with feature ids, a sort order and a limit could return the wrong features: the limit was applied before sorting.

Bug fixLuciadCPillar

LCP-1815
Fixed a crash when a custom IFeatureModelIFeatureModelIFeatureModel removed a feature and quickly added it again with a FeatureChangeFeatureChangeFeatureChange that has only the feature id.

Bug fixLuciadCPillar

LCP-1815
Fixed an issue where an update of an editable FeatureModelBuilderFeatureModelBuilderFeatureModelBuilder model was partly applied when one of its changes was invalid. The updater now throws before applying any change.

Bug fixLuciadCPillar

LCP-1815
Fixed a possible deadlock in the updater of an editable FeatureModelBuilderFeatureModelBuilderFeatureModelBuilder model: an IFeatureUpdaterCallback::onFailureIFeatureUpdaterCallback::onFailureIFeatureUpdaterCallback::onFailure implementation that used the model, for example to query it, never returned.

Bug fixLuciadCPillar

LCP-1815
Fixed a memory leak when painting features with FeatureCanvas::drawIcon3DFeatureCanvas::drawIcon3DFeatureCanvas::drawIcon3D: every painted 3D icon kept some memory in use until the application stopped.

Bug fixLuciadCPillar

LCP-1815
Fixed an issue where an on-path label could stay hidden after the geometry of its line changed, for example when the line moved into the view.

Bug fixLuciadCPillar

LCP-1815
Fixed an issue in the C# API where passing a FeatureChangeFeatureChangeFeatureChange for a feature without id to LuciadCPillar, for example to IFeatureUpdaterCallback.OnFeatureAdded, threw an InvalidOperationException. FeatureChange.GetHashCode threw for such a change as well, and comparing two null instances with == returned false.

Bug fixLuciadCPillar

LCP-1801
Fixed an issue where a layer that was removed from the map while it was busy kept returning true when calling Layer::isBusyLayer::isBusyLayer::isBusy.

Bug fixLuciadCPillar

LCP-1800
Fixed an issue where a TransformationTransformationTransformation between two grid references that only differ in false easting, for example EPSG:25832 and EPSG:4647, was not correct.

Bug fixLuciadCPillar

LCP-1799
Fixed an issue where CoordinateReferenceProvider::createCoordinateReferenceProvider::createCoordinateReferenceProvider::create failed with an unexpected exception for the EPSG code of a compound reference, for example EPSG:7415, instead of reporting the code as unsupported.

Bug fixLuciadCPillar

LCP-1796
Fixed an issue where LonLatGridLonLatGridLonLatGrid's deltaLon would always be the same as deltaLat, even if set to a different value in the builder.
Also fixed an issue where a LonLatGrid::AdvancedBuilderLonLatGrid::AdvancedBuilderLonLatGrid::AdvancedBuilder would ignore the originLon/originLat if no settings were added.

Bug fixLuciadCPillar

LCP-1811
Fixed the dimension icon for the MIL-STD-2525c "Signals Intelligence Space Track" symbols (4.X.1). They now have a correct black filled top, instead of a thick bordered unfilled top.

Bug fixLuciadCPillar

LCP-1788
Fixed the placement of the headquarters and task force indicators for the MIL-STD-2525c and MIL-STD-2525d, and for the APP-6B, APP-6C and APP-6D "Unknown" symbols (1.X) with defined affiliations. These indicators are now positioned against the symbol instead of at an offset from it.

Bug fixLuciadCPillar

LCP-1780
Fixed an issue where MbTilesModelDecoderMbTilesModelDecoderMbTilesModelDecoder would not correctly infer whether the dataset contains raster or vector tiles.

Bug fixLuciadCPillar

LCP-1764
Fixed an issue where the outline of tactical graphics such as "Rectangular Target" was not drawn along geodesics, leaving the editing handles out of line with the symbol. This was especially visible close to the poles.

Upgrade considerationLuciadCPillar

The hostile text modifier now accepts only two values: ENY (the default) and an empty value.

You can use the modifier to disable the ENY indicator: setting it to an empty value removes the annotation from both the icon label and the stroke decoration of tactical graphics. Previously, symbols with a hostile affiliation were always annotated with ENY, regardless of the modifier value.

The change affects all supported military symbology standards.

Upgrade considerationLuciadCPillar

LCP-1809

Upgrade considerationLuciadCPillar

LCP-1790
The libcurl library has been updated to version 8.22.0 to address security vulnerabilities (CVE-2026-80231, CVE-2026-80230, CVE-2026-13608, CVE-2026-80229, CVE-2026-18924, CVE-2026-82208, CVE-2026-82209, CVE-2026-19931, CVE-2026-80255).

2026.1

2026.1

New featureLuciadCPillar

LuciadCPillar now provides support for configuring how a 3D object is shaded, through a ShadingModelShadingModelShadingModel on its style.

Set the shading model through MeshStyleMeshStyleMeshStyle for OGC 3D Tiles and through FeatureCanvas::drawIcon3DFeatureCanvas::drawIcon3DFeatureCanvas::drawIcon3D for 3D icons.

See the Configure shading models article for more information.

The same asset with (1) no shading model, (2) a simple shading model and (3) a physically based one
The same asset with (1) no shading model, (2) a simple shading model and (3) a physically based one.

New featureLuciadCPillar

The map graphics effects are expanded with several new effects:
  • Light: configurable scene lighting using a headlight, a fixed directional light, or sunlight at a given time.
  • Atmosphere: this effect offers a physically-based Rayleigh/Mie scattering sky (ScatteringAtmosphereModelScatteringAtmosphereModelScatteringAtmosphereModel) alongside the existing gradient sky (GradientAtmosphereModelGradientAtmosphereModelGradientAtmosphereModel).
  • Depth of Field: an effect that blurs the scene outside a focus plane.
  • Fog: an effect that fades geometry into a fog color with distance and altitude, with an optional sun-glow tint.
  • Bloom: an effect that makes shapes and objects carry a BloomStyleBloomStyleBloomStyle glow, controlled by a map-wide strength and softness.
  • Environment map: an effect that supports a skybox and image-based reflections that physically-based rendering (PBR) objects, such as 3D icons and OGC 3D Tiles, reflect and are lit by.
A mesh of Marseille, visualized with the new graphics effects.
A mesh of Marseille, visualized with the new graphics effects.

How effects are configured has also changed: each effect is now set through an immutable model created with a fluent builder, instead of individual property setters. For the effects that already existed before version 2026.1, this is a source-incompatible change.

See the Configure Map Effects guide for the full API and per-effect guidance.

New featureLuciadCPillar

An OGC WFS model can now request and decode the GeoJSON output format, in addition to GML. Set the output format with WfsModelDecoderOptions::Builder::outputFormatWfsModelDecoderOptions::Builder::outputFormatWfsModelDecoderOptions::Builder::outputFormat, for example "application/json". The output formats advertised by a server are available through WfsFeatureType::getOutputFormatsWfsFeatureType::getOutputFormatsWfsFeatureType::getOutputFormats. If no output format is set, the server default (GML) is used. For more information, see the Decode and visualize WFS data article.

New featureLuciadCPillar

It is now possible to load non-georeferenced OGC 3D Tiles datasets, and georeference them by setting a GeoLocationGeoLocationGeoLocation on the ITileSet3DModelITileSet3DModelITileSet3DModel. See this guide for more details.

New featureLuciadCPillar

MapNavigatorMapNavigatorMapNavigator can now move the camera to a given eye position and orientation with a new look-from action. Create one with MapNavigator::newLookFromActionMapNavigator::newLookFromActionMapNavigator::newLookFromAction. This can for example be used to fly the camera to a known viewpoint.

New featureLuciadCPillar

LuciadCPillar can now decode and visualize Gaussian splats. Gaussian splatting is a novel scene-representation and 3D rendering technique that uses a large amount of tiny 3D Gaussian primitives ("splats") to create photorealistic views of real-world scenes.

A Gaussian splatting dataset of a restaurant
A Gaussian splatting dataset of a restaurant.

LuciadCPillar can consume Gaussian splats as OGC 3D Tiles with glTF payloads that make use of the KHR_gaussian_splatting or KHR_gaussian_splatting_compression_spz_2 extension of the glTF specification.

You can visualize a Gaussian splatting dataset by decoding it with Ogc3DTilesModelDecoderOgc3DTilesModelDecoderOgc3DTilesModelDecoder and passing the resulting model to a TileSet3DLayerTileSet3DLayerTileSet3DLayer. Use TileSet3DLayer::Builder::gaussianSplatsStyleTileSet3DLayer::Builder::gaussianSplatsStyleTileSet3DLayer::Builder::gaussianSplatsStyle (or TileSet3DLayer::setGaussianSplatsStyleTileSet3DLayer::setGaussianSplatsStyleTileSet3DLayer::setGaussianSplatsStyle) with a GaussianSplatsStyleGaussianSplatsStyleGaussianSplatsStyle to customize the styling of the Gaussian splats, using expressions for example, and to tweak other performance-related settings.

See this guide for more details.

New featureLuciadCPillar

The new JsonDataAnnotationJsonDataAnnotationJsonDataAnnotation marks a string-typed DataPropertyDataPropertyDataProperty as containing JSON text, so that a plain string property can be distinguished from a property with a JSON string as its value.

New featureLuciadCPillar

A DataPropertyDataPropertyDataProperty can now carry metadata in the form of DataAnnotationDataAnnotationDataAnnotation instances. Attach them with DataProperty::Builder::addAnnotationDataProperty::Builder::addAnnotationDataProperty::Builder::addAnnotation and read them through DataProperty::getAnnotationsDataProperty::getAnnotationsDataProperty::getAnnotations. DataPropertyPathDataPropertyPathDataPropertyPath gained getTargetProperty to retrieve the property at the end of a path, so that a property and its annotations are reachable from a path.

New featureLuciadCPillar

FeatureFeatureFeature can now retrieve composite values as DataObjectDataObjectDataObject. For more information, see the Describing the feature structure in a data model article.

New featureLuciadCPillar

A DataPropertyDataPropertyDataProperty can now describe a list of values. Set its collection type to DataCollectionKind::ListDataCollectionKind::ListDataCollectionKind::List for a list-typed property. FeatureFeatureFeature gained the matching accessors, together with a getListSize method. For more information, see the Describing the feature structure in a data model article.

New featureLuciadCPillar

LuciadCPillar can now project a static image, a continuous stream of video frames, or 360-degree panoramas onto the map. To show such projections, you create a ProjectedImageryLayerProjectedImageryLayerProjectedImageryLayer backed by an IProjectedImageryModelIProjectedImageryModelIProjectedImageryModel, such as the ready-made ProjectedVideoModelProjectedVideoModelProjectedVideoModel for a live video source, or PanoramaModelPanoramaModelPanoramaModel for 360-degree panoramas, and add it to the LayerListLayerListLayerList of the map. For more details about using this feature, see this guide.

Projected images
A drone video projected onto a map.

New featureLuciadCPillar

LuciadCPillar now provides support for decoding GeoJSON files through GeoJsonModelDecoderGeoJsonModelDecoderGeoJsonModelDecoder. For more information, see the Decode and visualize GeoJSON data article. You can use the data formats sample to load a GeoJSON file.

New featureLuciadCPillar

You can now perform GetFeatureInfo requests on WMS and WMTS models. With a GetFeatureInfo request, you enable users to select and query features visualized in a WMS or WMTS raster layer.

To perform a WMS GetFeatureInfo request, you need a WmsGetFeatureInfoContextWmsGetFeatureInfoContextWmsGetFeatureInfoContext, obtained from a WmsRasterLayerWmsRasterLayerWmsRasterLayer.

To perform a WMTS GetFeatureInfo request, you need a WmtsGetFeatureInfoContextWmtsGetFeatureInfoContextWmtsGetFeatureInfoContext, obtained from a WmtsRasterLayerWmtsRasterLayerWmtsRasterLayer.

For more details on executing WMS and WMTS GetFeatureInfo requests and decoding their output, see this guide.

New featureLuciadCPillar

It is now possible to change the map reference at runtime. To support this, the following API was added: This functionality is demonstrated in most samples.

ImprovementLuciadCPillar

A new article in the documentation explains how to get the most out of agentic AI tools such as GitHub Copilot or Claude Code when developing applications against LuciadCPillar. The article also contains an AI skill bundle that can help you to improve your agent's output.

ImprovementLuciadCPillar

You can now ask the map to repaint with Map::invalidateMap::invalidateMap::invalidate.

An example where this would help is a Map::IRendererCallbackMap::IRendererCallbackMap::IRendererCallback that updates the camera on every paint. Such a callback can leave the camera alone once the view is at rest, which lets the map stop painting, and call Map::invalidateMap::invalidateMap::invalidate on new user input to get it painting again.

ImprovementLuciadCPillar

LCP-370
The HttpClientHttpClientHttpClient implementation now always performs SSL verification. In the class documentation you can find out where it looks for the certificate authority (CA) file for each of the supported platforms and how you can use a custom CA file location.

ImprovementLuciadCPillar

You can now decode images with Image::decodeImage::decodeImage::decode, either from a buffer of encoded bytes or from a file path. JPEG, PNG, TIFF, WebP and Radiance HDR images are supported.

ImprovementLuciadCPillar

FeatureModelBuilderFeatureModelBuilderFeatureModelBuilder can now assemble the model metadata itself through the new title, reference and dataModel convenience methods, which makes modelMetadata and featureModelMetadata optional.

ImprovementLuciadCPillar

The HERE Maps raster sample now performs its HTTP requests with Luciad.Net.Http.HttpClient, the HTTP client that LuciadCPillar itself provides, instead of System.Net.WebRequest, which .NET 8 marks as obsolete.

ImprovementLuciadCPillar

The WinForms and WPF sample integration code now ships as two separate libraries. The WinForms map control ViewControl has moved out of Luciad.CPillar.CSharp.Integration.Wpf into a new Luciad.CPillar.CSharp.Integration.WinForms.

ImprovementLuciadCPillar

DataType::BuilderDataType::BuilderDataType::Builder now has a property shortcut for each primitive type, so declaring a feature type no longer requires building a DataPropertyDataPropertyDataProperty for every property: addGeometryProperty, addIntProperty, addLongProperty, addFloatProperty, addDoubleProperty, addStringProperty and addBooleanProperty.

addGeometryProperty(name, mainGeometry) additionally attaches the GeometryDataAnnotationGeometryDataAnnotationGeometryDataAnnotation when mainGeometry is true, which removes the need for an IDataAnnotationFactoryIDataAnnotationFactoryIDataAnnotationFactory in the common case of a feature type with a single geometry. Pass false for the additional geometry properties of a type that has several geometries. A data type has at most one main geometry.

The shortcuts add scalar properties of a primitive type. Keep using DataType::Builder::addPropertyDataType::Builder::addPropertyDataType::Builder::addProperty for anything else, such as list-valued properties, properties carrying their own annotations, or properties of which the value type is another data type.

ImprovementLuciadCPillar

LCP-213
The C# LuciadCPillar samples no longer use CMake. The release now ships a ready-to-open Visual Studio solution, csharp/AllSamplesCSharp.sln, together with all sample project files, so you can open and build the samples directly. See the installation instructions for details.

ImprovementLuciadCPillar

ImprovementLuciadCPillar

The CoordinateReferenceProviderCoordinateReferenceProviderCoordinateReferenceProvider class now has a few accessors that return commonly used coordinate references directly.

ImprovementLuciadCPillar

You can now read and write FeatureFeatureFeature values by property name, without building a DataPropertyPathDataPropertyPathDataPropertyPath for each one. The getValue, value, resetValue and getListSize methods on FeatureFeatureFeature and its builder gained overloads that take a property name. For repeated access to the same property, DataType::getPropertyPathForDataType::getPropertyPathForDataType::getPropertyPathFor resolves a name to a reusable DataPropertyPathDataPropertyPathDataPropertyPath.

See Describing the feature structure in a data model for more details.

ImprovementLuciadCPillar

LCP-1715
Building the C# samples no longer requires a standalone NuGet installation. The Visual Studio solution restores its NuGet packages automatically, so you no longer need nuget.exe on your PATH, nor the -DCMAKE_PROGRAM_PATH CMake parameter that pointed to it.

Turning the samples into NuGet packages does not need one either. The generateNugetPackagesOfSamples.bat script and the per sample command in the installation instructions now use dotnet pack, so the .NET SDK that builds the samples is all you need. The script also reports a failed package instead of skipping it silently.

ImprovementLuciadCPillar

PixelFormat::Bgra8888PixelFormat::Bgra8888PixelFormat::Bgra8888 has been added as a supported pixel format.

ImprovementLuciadCPillar

The FeatureQueryFeatureQueryFeatureQuery API now provides an asBuilder method that returns a builder initialized with an existing query's settings, to create a modified copy of a query.

ImprovementLuciadCPillar

It's now possible to control the camera's near and far planes directly. By default, the map keeps adjusting them every frame to maximize depth precision. Call Map::setAutoAdjustDepthRangeEnabledMap::setAutoAdjustDepthRangeEnabledMap::setAutoAdjustDepthRangeEnabled with false to turn that off, and set the planes yourself with the new PerspectiveCamera::Builder::nearFarPerspectiveCamera::Builder::nearFarPerspectiveCamera::Builder::nearFar or OrthographicCamera::Builder::nearFarOrthographicCamera::Builder::nearFarOrthographicCamera::Builder::nearFar.

ImprovementLuciadCPillar

Added a new TileSet3DLayer::setTransformationTileSet3DLayer::setTransformationTileSet3DLayer::setTransformation, which can be used to translate, scale or rotate tilesets in 3D space.

ImprovementLuciadCPillar

WebGpuContext::setRenderTargetWebGpuContext::setRenderTargetWebGpuContext::setRenderTarget can now draw the map on top of what is already in the render target, instead of always clearing it first. The overload that takes a depth texture gained two parameters, clearColor and clearDepth, both true by default. Passing false makes sure the target's current color and depth isn't cleared. The map is then blended over the existing color, and correctly hides and is hidden by whatever is already in the depth buffer.

This makes it possible to combine LuciadCPillar with graphics produced by another renderer in the same textures, so the map and that content occlude each other correctly where they overlap.

ImprovementLuciadCPillar

The MbTilesFeatureLayerMbTilesFeatureLayerMbTilesFeatureLayer now uses the style declared in the MBTiles dataset by default (if one is present, and if no other style was given to MbTilesFeatureLayer::Builder::styleMbTilesFeatureLayer::Builder::styleMbTilesFeatureLayer::Builder::style). This is an extension to the MBTiles format introduced by LuciadFusion.

ImprovementLuciadCPillar

LCP-1694
The ExpressionExpressionExpression API now supports null literals, allowing you to filter on certain properties being null in an IFeatureModelIFeatureModelIFeatureModel. See ExpressionValue::createNullExpressionValue::createNullExpressionValue::createNull.

ImprovementLuciadCPillar

The LuciadCPillar Android samples are now bundled into a single launcher application instead of a separate application per sample.

ImprovementLuciadCPillar

LCP-1640
LuciadCPillar now avoids unnecessarily requesting tiles in a WMTS layer if the tile coordinates fall outside the limits specified in the capabilities (i.e. TileMatrixSetLimits).

ImprovementLuciadCPillar

The LuciadCPillar Android library and samples now support 16KB page sizes for compatibility with Android 15+. More information available here.

Bug fixLuciadCPillar

LCP-1752
Fixed a precision issue that could result in 3D icons having pixel-sized holes in their surfaces.

Bug fixLuciadCPillar

Fixed an issue where Map::getCameraMap::getCameraMap::getCamera and the view transformation returned by Map::getViewMapTransformationMap::getViewMapTransformationMap::getViewMapTransformation used slightly different camera positions while the map was being navigated. Combining their results could then be inconsistent. Map::getMapScaleMap::getMapScaleMap::getMapScale, Map::getMapBoundsMap::getMapBoundsMap::getMapBounds, Map::getVisibleAreaMap::getVisibleAreaMap::getVisibleArea and Map::queryFeaturesMap::queryFeaturesMap::queryFeatures could momentarily disagree with the camera in the same way.

Map::getCameraMap::getCameraMap::getCamera, the view transformation and these queries now consistently reflect the same view of the map, so their results can be safely combined, also while the map is being navigated.

Bug fixLuciadCPillar

Fixed an issue where raster layers were not clipped to the outline of a conic map reference. With a Lambert Conformal or Albers Equal Area projection, the projected world is fan shaped with a wedge shaped gap (the "V") at the far side of the map, which should be left empty. Raster data was instead drawn across that gap as stretched imagery. Raster tiles are now clipped to the conic projection's valid area, so the gap renders correctly. Vector data was already clipped correctly.

Bug fixLuciadCPillar

LCP-702
Fixed an issue where Map::getCameraMap::getCameraMap::getCamera did not reflect the near and far planes that the map adjusts automatically while rendering to keep good depth precision. It returned the near and far the camera was last set with, even when the map rendered with a different, tightened range. Map::getCameraMap::getCameraMap::getCamera now returns the near and far the map actually rendered with, and a camera change event is fired when the automatic adjustment changes them.

Bug fixLuciadCPillar

LCP-1701
Fixed an issue where Transformation::createTransformation::createTransformation::create would throw a RuntimeExceptionRuntimeExceptionRuntimeException for invalid transformations, rather than a InvalidArgumentExceptionInvalidArgumentExceptionInvalidArgumentException as documented.

Bug fixLuciadCPillar

On a 3D map, complex strokes with ComplexStrokeOrientation::CameraFacingComplexStrokeOrientation::CameraFacingComplexStrokeOrientation::CameraFacing are now evaluated in screen space. As a result, patterns (for example the dashes of a dashed line) keep a constant on-screen size regardless of the camera position. Previously, the pattern was perspective-deformed with distance.

Upgrade considerationLuciadCPillar

A number of control measure Line symbols in APP-6D and MIL-STD 2525D no longer display the generic PL ("phase line") label. Previously these symbols were labeled twice: once with PL followed by the first uniqueDesignation modifier, and once with the abbreviation specific to the symbol followed by the second uniqueDesignation modifier. They are now labeled only with their own abbreviation, followed by the first uniqueDesignation modifier.

The change affects the following symbols. All of them belong to symbol set 25 (Control Measure); the symbol code is given for each symbol.

  • APP-6D
    • Light Line: 110200
    • Final Coordination Line: 140700
    • Limit Of Advance: 140900
    • Line Of Departure: 141100
    • Line Of Contact: 140200
    • Probable Line Of Deployment: 141200
    • Bridgehead Line (BL): 141400
    • Holding Line: 141500
    • Release Line: 141600
  • MIL-STD 2525D
    • Light Line: 110200
    • Final Coordination Line: 140700
    • Limit Of Advance: 140900
    • Line Of Departure / Line Of Contact: 141100
    • Line Of Contact: 140200
    • Probable Line Of Deployment: 141200
    • Bridgehead Line (BL): 141400
    • Holding Line (HL): 141500
    • Release Line: 141600

Upgrade considerationLuciadCPillar

ErrorInfoErrorInfoErrorInfo no longer relies on std::error_code: it now stores a luciad::ErrorCodeluciad::ErrorCodeluciad::ErrorCode directly, which is always available.

Error messages of the OGC service formats (WMS, WMTS, WFS and LTS) are now prefixed with the format-specific error code, for example CapabilitiesSourceError - Error while connecting to WMTS url '...'.

Upgrade considerationLuciadCPillar

The default memory limits of the MapMapMap have changed. By default, the GPU memory limit is now 2000 MB instead of 1000 MB. The CPU memory limit remains unchanged at 500 MB. You can still create maps with the old limit by calling Map::Builder::maxMemoryUsageHintMap::Builder::maxMemoryUsageHintMap::Builder::maxMemoryUsageHint.

See the Managing memory usage guide on how to configure LuciadCPillar's memory management.

Upgrade considerationLuciadCPillar

In addition to getRequiredFeatures, WebGpuContextWebGpuContextWebGpuContext now also has a getRequiredLimits method, which returns the WGPULimits required by LuciadCPillar to function properly. You must satisfy these limits by including them in the device descriptor when creating your WGPUDevice. All samples demonstrate how this should be done.

Upgrade considerationLuciadCPillar

The ambient occlusion, eye dome lighting and atmosphere graphics effects are no longer configured through per-property setters. Each now exposes an immutable model, so existing configuration code is source-incompatible and must be updated:
  • Read the current settings with getModel()
  • Build a changed copy and apply it with setModel(...)
  • Turn the effect on or off with setEnabled(...)

The individual property setters these effects used to expose, such as AmbientOcclusionEffect::setPower(...), have been removed. Those properties are now configured on the model passed to setModel(...), through the matching method on its builder.

The atmosphere changes the most: its sky and horizon colors now live in a GradientAtmosphereModelGradientAtmosphereModelGradientAtmosphereModel, and the effect's model is the polymorphic AtmosphereModelAtmosphereModelAtmosphereModel base type, which also has the new ScatteringAtmosphereModelScatteringAtmosphereModelScatteringAtmosphereModel variant.

Eye dome lighting's window (a pixel count) is now unsigned rather than a signed int: on EyeDomeLightingModelEyeDomeLightingModelEyeDomeLightingModel it is a uint32_t in C++, surfacing as uint in C# and long in Java/Kotlin.

See the Configure map effects guide for the full API and per-effect guidance.

Upgrade considerationLuciadCPillar

The C# LuciadCPillar samples now target .NET 8 (net8.0-windows) instead of .NET Framework 4.7.2. The LuciadCPillar C# API itself is unchanged.

This changes the requirements for the samples: building them now requires the .NET 8 SDK, and running them requires the .NET 8 Desktop Runtime. See the system requirements for details.

The Luciad.CPillar.SDK binding is not affected: it still targets netstandard2.0, so it can be used from both .NET Framework and .NET applications.

The reusable sample libraries (Luciad.CPillar.CSharp.Integration.Wpf, Luciad.CPillar.CSharp.Samples.Common and Luciad.CPillar.CSharp.Samples.Wpf.Common) target both net472 and net8.0-windows. You can therefore still reference the sample integration code (such as the WPF WpfMapControl) from a .NET Framework 4.7.2 project, and the sample source remains compatible with .NET Framework 4.7.2.

The C# language version used to build the samples has been raised from 7.0 to 7.3.

Upgrade considerationLuciadCPillar

The WPF integration code in the LuciadCPillar samples has been reworked. The map is now rendered through WebGPU into a texture that is composited inside WPF's own visual tree (through a D3DImage), instead of hosting the map in a separate child window. This removes the WPF airspace limitation. The LuciadCPillar API itself is unchanged.

The airspace limitation came from hosting the map in a separate Win32 child window (through a WindowsFormsHost), which Windows composites as an opaque rectangle on top of every WPF pixel in that area. Because of that, no WPF element (a popup, tooltip, adorner, overlay or panel) could appear over the map. The reworked integration composites the map inside WPF's own visual tree, so WPF content can now be drawn on top of the map.

As an illustration, the WPF samples now place components directly on top of the map, such as the coordinate readout (the location control) that previously had to sit in a bar below the map.

The new WpfMapControl is a drop-in replacement for the previous one. It keeps the same public API and the same WpfMapControlViewModel as its DataContext, so application code that uses it does not need to change.

The previous WindowsFormsHost based integration still works and will keep working, but it is no longer included in the shipped samples.

To adopt the new integration, replace your copy of the integration_wpf sample library with the updated version (the one whose WpfMapControl renders through a D3DImage) and rebuild. No changes to your application code are required.

Upgrade considerationLuciadCPillar

The Qt integration code in the LuciadCPillar samples has been reworked. The map is now rendered through WebGPU into a texture that is shared with Qt's own graphics device (Direct3D 12 on Windows, Vulkan on Linux), instead of the map renderer and Qt sharing a single graphics device. The new approach is significantly more robust, and resolves the lag in map rendering that could occur with the previous approach. The LuciadCPillar API itself is unchanged.

For Qt Quick, QQuickMapItem is a drop-in replacement: application code that uses it does not need to change.

For Qt Widgets, the new QMapWidget replaces the old QMapWindow and works fundamentally differently: it is now a QWidget (a QRhiWidget), whereas QMapWindow was a QVulkanWindow. To upgrade, add the QMapWidget directly to your widget layout, instead of hosting a QMapWindow through QWidget::createWindowContainer. See the updated sample_qt_widget for the new usage.

The previous integration approach keeps working in this release, but it relies on behavior that is no longer guaranteed and may stop working in a future release. We recommend migrating to the reworked sample integration libraries (integration_common, integration_qt_quick and integration_qt_widgets).

Upgrade considerationLuciadCPillar

The LuciadCPillar Android samples now include the libyuv-android library version 0.44.0 to convert video frames decoded by the Media3 library to LuciadCPillar images. More information is available here.

Upgrade considerationLuciadCPillar

The LuciadCPillar Android samples now include the Jetpack Media3 library. Media3's ExoPlayer is used to play video in the video_projection sample. More information is available here.

Upgrade considerationLuciadCPillar

LCP-1601, LCP-1650, LCP-1692, LCP-1702, LCP-1704, LCP-1716, LCP-1743, LCP-1745
The following third party libraries have been updated:
Library New Version
GDAL 3.13.1+1
PROJ 9.7.0
libgeotiff 1.7.4
libzip 1.11.4
libexpat 2.8.3
libcurl 8.21.0
libtiff 4.7.2
sqlite3 3.53.3
openssl 3.5.8
dawn 7977_8+1

Upgrade considerationLuciadCPillar

The versions of Android Jetpack, Gradle, Android Gradle Plugin and Kotlin compiler used in the LuciadCPillar Android samples have been updated. This has no effect on the use of the LuciadCPillar API.