Aller au contenu

Changelog

The upgrade and integration notes sections aim to help API users port their application to the new version of Horizon by listing the changes needed to, respectively, maintain compatibility with the previous version, and integrate new or upgraded features optimally and efficiently. Please refer to RFC 2119 for the meaning of the terms must, should, and may.

Version 26.0.0 - 2026-09-16

Added

  • Added support for glTF animations to the single model layer. See the documentation for more details.
  • Flat overlay point outline colour and width can now be set per instance.
  • Added the disable_dtm field to TerrainSettings to deactivate DTM layers for a scene view. This deactivates all DTM layers for the scene view, i.e. it forces the ground to be at elevation 0.
  • Added the GetTerrainElevation method to ViewerService. It allows retrieving the elevation of the terrain at an arbitrary location, and uses cached DTM tiles as source.
  • Added a way to locate runtime files using a callback instead of just giving a base path, in the initializer of HrzCoreBackend, in the TypeScript @siradel-oss/horizon-core package. See Getting started for more information.
  • Added uint64Equals() to HrzProtocolHelper for comparing two uint64 values.
  • Added AMD Radeon and Intel Arc GPUs to the platform detection and auto-graphics level logic.
  • Added the --version command line switch to the native client and the testing kit viewer.

Changed

  • Vector tiles
  • Protocol & API
    • The following messages now use a oneof instead of a type enum field paired with numbered optional fields:
      • Raster
        • NodataValue: the type field has been replaced by the value_type oneof.
        • RasterProvider: the type field has been replaced by the provider_type oneof.
        • TilingSchemeParams: the type field has been replaced by the scheme_type oneof. The deprecated UNTILED value is gone.
      • Vector
      • Layers
      • Color
        • Palette: the type field has been replaced by the palette_type oneof.
    • In ShapeEditorMessage, the shape field has been split into shape_selection and shape_geometry_update to match their corresponding message types.
    • In ShapeEditorMessage, the mode and control_point fields have been renamed to mode_switch and control_point_selection to match their corresponding message types.
    • In the TypeScript API, path builders are now auto-cloning. This means that they can be reused, and thus the clone() method has been removed.
    • In BoundsView, the min and max altitude fields are now wrapped in the bounds fields which is now a geographic volume.
    • In the C++ protocol, string and bytes fields are now represented as std::string_view instead of std::string.
    • The values of GraphicsLevel have been renamed to be snake-uppercase.
    • Renamed the R_F32_SILICIUM variant of ImageFormat to SIRADEL_LEGACY_F32.
    • The protocol for palette definitions has been updated for better alignment with other tools and technologies, such as the Web platform. ColorPoint has been renamed ColorStop and the property color_points of NumericPalette has been renamed color_stops.
  • Multiview drawing order is now deterministic. When the viewports overlap, scene view 1 is drawn on top of scene view 0.
  • Camera translation movements encoded by CameraTranslate have had their default factor doubled.
  • The property experimental_adaptive_resolution of TerrainSettings has been removed. Adaptive resolution is now enabled by default. It can be disabled by setting the property disable_terrain_adaptive_resolution of ViewerOptions to true.
  • Improved 3D Tiles feature table parsing to make it compatible with global semantic fields whose values are in the table’s binary body.
  • Artifacts for Linux, such as the testing kit, are now compiled with the Steam Runtime SDK, for improved compatibility.
  • npm packages are now published under the @siradel-oss scope.
  • The target JS version has been upgraded to ES2021.

Removed

  • The NodataValueType, RasterProviderType, TilingSchemeType, VectorDataProviderType, VectorReprType, TransformSymbolComponentType, SymbolElementType, and LayerVisibilityConstraintType enums have been removed.
  • The InMemoryAttributeValue message has been removed and replaced with AttributeValue.
  • The MessageType enum and the type field of TypedMessage have been removed.
  • The ShapeEditorUpdateType enum and the type field of ShapeEditorMessage have been removed.

Fixed

  • Rasters
    • The properties has_min_level and has_max_level of LocalTilingSchemeParams are now taken into account.
    • Fixed display of tiled rasters with local tiling scheme and bottom tiling origin.
    • Fixed raster picking returning erroneous values for some combinations of tiling schemes and picking locations.
    • Fixed a crash that occasionally happened when updating a raster layer.
    • Fixed various instances of the scene model updates not being taken into account when applied at specific granularity levels around raster providers.
  • Vector tiles
    • Fixed the scene not refreshing when deleting a vector tiles representation.
    • Fixed vector tiles at higher zoom levels not loading when sufficiently close, even if tiles at lower zoom levels are missing.
    • Fixed a crash when a symbol element had no element type set.
  • 3D Tiles & glTF models
    • Fixed b3dm and pnts tiles of 3D Tiles tilesets not being displayed correctly when their batch length was misconfigured.
    • Improved compatibility with 3D Tiles tilesets whose content-type headers and extensions are incorrect.
    • Fixed lighting on glTF models with negative scaling factors.
  • Rendering
    • Fixed a black line sometimes appearing at the horizon, for example when the camera was below sea level.
    • Fixed visual instability (objects shifting positions back and forth by one pixel) of the views when adjusting scissor position in multiview.
    • Fixed a crash when a scene view had a viewport with zero or negative dimensions.
    • Fixed the sky colour being incorrectly rendered when using a static sky transition in pixels with transparency on the underground, atmosphere, or space colour.
  • Fixed a crash that happened when a large image could not be decoded.
  • Fixed invalid camera trajectory when origin and destination are very close during a camera animation with a ballistic trajectory.
  • Fixed the engine sometimes getting stuck when zooming-in extremely close to the ground while using a DTM.
  • Fixed Horizon initialization failing on the web when the canvas does not have an id attribute.

Upgrade notes

  • Camera
    • In BoundsView, move the min_altitude and max_altitude fields to the min_height and max_height fields of the bounds field.
    • In CameraTranslate, halve the angle_factor_x and angle_factor_y values to get the same movement as before.
  • Vector tiles
    • Any instance of FlatOverlayVectorRepr must be replaced by one or more of the new representations: FlatOverlayPolygonVectorRepr, FlatOverlayPolylineVectorRepr, and FlatOverlayPointVectorRepr.
      • The name of some fields have been shortened in the new representations as they did not need disambiguation anymore.
    • Scenes that used a single FlatOverlayVectorRepr with multiple geometry types (points, polylines, and polygons) must now use multiple representations, and the fork instruction in styling scripts with the feature type special attribute to emit those representations.
    • All dashes parameters of CylinderVectorRepr must be moved to the new dashes field.
      • The line_empty_color field has been renamed to secondary_color.
      • The dash_length and dash_length_unit fields have been renamed to primary_segment_length and primary_segment_length_unit, respectively.
    • All dashes parameters of FlatOverlayVectorRepr must be moved to the dashes field of FlatOverlayPolylineVectorRepr.
      • The same renaming as above applies.
    • All polygon pattern parameters of FlatOverlayVectorRepr must be moved to the pattern field of FlatOverlayPolygonVectorRepr.
    • In order to maintain the appearance of flat overlay points, the representations (FlatOverlayPointVectorRepr) must be updated as such:
      • The value of the former outline_color property must be set on the new outline_color.default_value.
      • The value of the former outline_width property must be set on the new outline_width.default_value.
      • The value of radius_unit property must be copied to outline_width_unit.
  • Messages must now be dispatched on their payload discriminator field instead of a type field.
    • In TypeScript, use protobufjs’ payload discriminator (e.g. msg.payload == "pick") instead of msg.type == MessageType.PICK_MESSAGE.
    • In C++, use TypedMessage::payload_case() (e.g. TypedMessage::kViewerReady) instead of comparing against MessageType. Same applies to ShapeEditorMessage::payload_case().
    • Many other messages have been converted to using oneofs. See their documentation to learn the new discriminant and variant field names.
  • Enabling terrain adaptive resolution in the terrain settings is no longer needed to benefit from its effects. You can still disable it by setting the property disable_terrain_adaptive_resolution of ViewerOptions if you encounter issues with the terrain geometry, such as spurious spikes.
  • The values of GraphicsLevel must be changed to their snake-uppercase counterpart.
  • All instances of R_F32_SILICIUM should be renamed to SIRADEL_LEGACY_F32.
  • Rename every mention of ColorPoint to ColorStop, and every mention of color_points of NumericPalette to color_stops.
  • Remove all instances of .clone() on path builders in TypeScript code, as they are now auto-cloning, and those methods have been removed.

Integration notes

  • Use HrzProtocolHelper.uint64Equals() to compare two uint64 values from the protocol, such as layer handles. (== and === do not work.)

Version 25.2.1 - 2025-12-18

Fixed

  • Fixed incorrect representation geometries that were occasionally generated by the untiled vector data provider.

Version 25.2.0 - 2025-10-31

Added

  • Added a new parameter bevel_width to ExtrudedGeometryVectorRepr which adds rounded corners to extruded polygons and polylines.
  • Static sky colours, as well as underground colour, now support transparency through their alpha channel. This can be used to show the web page containing the Horizon instance around the planet.
  • The background colour of the loading screen can be configured with the property loading_screen_background_color of ViewerOptions.

Changed

  • Colours
    • Colour blending is now performed in linear-sRGB space.
    • Interpret glTF vertex colours in linear-sRGB space, in accordance with the specification.
    • Take the linear bit in KTX2 colour textures into account.
    • Flat polyline and cylinder colours are now interpolated in the Oklab colour space.
    • Values PERCEPTUAL_OKLAB and LINEAR_RGB of ColorInterpolationMode have been renamed OKLAB and LINEAR_SRGB respectively. (Bringing the names closer to their CSS equivalents.)
    • Value SRGB_R_8 of ImageFormat has been renamed R8.
  • Symbols
    • Improved text legibility at small sizes.
    • Text outline widths are now automatically capped at the maximum value supported by the renderer (6/28 ≈ 0.21 ems).
    • Improved rendering of image symbol elements at small size, when the source image is not in a sprite sheet.
  • Vector geometry simplification for untiled vector data providers now takes into account the Z component of the geometry when it is present.
  • Web: Areas not covered by any scene view viewport (typically when using multiview) now show the underlying web page instead of solid black.
  • Web: Modules are now ES Modules instead of CommonJS modules.

Fixed

  • Rasters
    • Fixed ghost rasters being displayed after mutating and destroying a raster layer during the same frame.
    • Improved stability of raster layers when moving the camera.
  • Symbols
    • Character weight now matches the font’s definition in text elements.
    • Fixed a crash that could happen when generating text elements.
  • Fixed corrupted geometry at tile borders for untiled vector data providers.
  • Fixed ASTC compressed texture format support detection.
  • A VIEWER_LOADING_PROGRESS_MESSAGE is now sent when progress has reached 100% at engine initialisation time.

Upgrade notes

  • Colours
    • Representations using transparent colours can appear slightly different from before. Colour calculations have been corrected, but representations made with incorrect colour calculations in mind may need some tweaking to conform to the intended appearance. In particular, image files, used for example for symbols, when they contain partially transparent pixels, should be authored using image editing tools that work with linear colours.
    • Uses of the values PERCEPTUAL_OKLAB and LINEAR_RGB of ColorInterpolationMode must be replaced with OKLAB and LINEAR_SRGB respectively.
    • Uses of the value SRGB_R_8 of ImageFormat must be replaced with R8.
  • Because Horizon used to erroneously increase character weight in text elements, some symbols may need to be adjusted to use a font with a larger weight in order to maintain the previous appearance.
  • Wrap Horizon´s canvas in a div with a black background-color to preserve the previous behaviour when there are areas not covered by any scene view viewport. Otherwise, any other colour can be used, or none if showing the web page below is desired.
  • Due to the switch to ES Modules, import of symbols from @siradel/horizon-* packages using the require() syntax must be replaced with import statements.

Version 25.1.1 - 2025-07-24

Fixed

  • Fixed a crash that happened when a client vector data provider tried to load a tile with no features.

Version 25.1.0 - 2025-07-16

Added

  • Vector data
    • Rules for joining multiple data sources in a single vector data source have been clarified and combinations have been expanded:
      • The first source in the array is now known as the primary source. Following sources are secondary sources.
      • The geometry source can be a secondary source.
      • It is possible to join sources that are requested by tile coordinates.
        • The simpler way is by taking values in the order they are in, for both primary and secondary sources.
        • Features can also be matched by ID, and the values in the tiles be automatically reordered when required. To enable this feature ID attributes must be declared in both primary and secondary sources.
    • Geometries of type UNKNOWN are recognised when reading Mapbox vector tiles. Their geometry data, if it exists, is ignored. They can serve as support for attribute-only entries in MVT files.
  • Ambient settings
    • More customisation points have been added to the static sky. The atmosphere and space colours can both be set, as well as the distance from the horizon at which the transition between the two occurs. This distance can be expressed in either metres or pixels.
  • Elevations below zero are now supported for DTM layers. They can be overground location below sea level, or undersea terrain (i.e. bathymetry).

Changed

  • Ambient settings
    • The property static_color of SkySettings has been renamed static_atmosphere_color.
    • Instead of the whole sky transitioning from black to the static sky colour as the camera zooms in, the static sky now shows the atmosphere colour around the planet when viewed from afar.
  • Return message types for SceneModelService methods have been changed. SceneModelGet has been replaced with BytesValue, and SceneModelArrayCount with UInt32Value.
  • The camera’s minimum height above ground is immediately respected when switching to the orbit manipulator after an animation has finished.

Fixed

  • Vector data
    • Fixed an occasional crash when reloading an in-memory and vector data layers pair using the same IDs.
    • Fixed using an in-memory vector data source as an attribute-only source not working.
    • Fixed attributions from joined attribute-only vector data sources not being reported.
    • Fixed a simplification issue for untiled vector geometry where unconventional topologies such as overlapping would be simplified away.
    • Fixed all attributes of untiled vector datasets being used as feature ID instead of only those masked as such.
  • Vector tiles
    • Fixed styling being non-deterministic when using a random function inside a branch’s condition expression.
    • Fixed a crash that could happen when a symbol layer does not have features on every tile.
    • Fixed picking and highlighting not working on instanced model impostors.
  • Rasters
    • DTM layers are now refined at the camera’s location, to avoid issues such as the camera getting stuck below ground, or the surrounding terrain not loading if the camera does not point downwards.
    • Fixed raster layer flicker upon scene settings update, when scene views are unchanged.
  • Fixed 3D Tiles restyling upon vector data layer update.
  • Fixed camera angular viewpoints when the camera is below sea level.

Upgrade notes

  • Ambient settings
    • Set the static sky colour with the property static_atmosphere_color of SkySettings.
    • Set colour transition distances and unit for the static sky on SkySettings. Values of 15,000 for static_color_transition_start_distance, 60,000 for static_color_transition_end_distance, and STATIC_SKY_COLOR_TRANSITION_UNIT_METERS for static_color_transition_distance_unit allow approximating the simulated sky.
  • If you use the SceneModelService directly instead of using path objects, calls to the service need to be updated in order to conform to the new return types. The new types are functionally the same but the value field is named value instead of payload and count.

Version 25.0.0 - 2025-05-20

Added

  • Rasters
    • Added support for Mapbox’s Terrain-RGB terrain tile format.
    • Added support for Mapzen’s Terrarium terrain tile format.
    • Added the mime_type_override field to most raster providers to override the MIME type of the data. This can be used to specify decoding instructions for the downloaded data.
  • Data formats
    • Added support for PMTiles sources for vector & raster sources in Mapbox scenes.
      • The url field of those sources must be prefixed by pmtiles://.
    • Added support for WOFF and WOFF2 fonts.
    • Added support for decoding images using the image/x.raw MIME type. See the documentation for more details.
    • Added support for the BIL, BIP, and BSQ image formats through the image/x.raw MIME type.
  • Added the GetSceneViewScaleAndAltitude method to CameraService to retrieve information about a scene view.
    • The returned information is the scale on the view (in pixels per meter), and the relative and absolute altitude of the camera.
    • This can be used to implement a map scale on the viewer.
  • Added the draw_wireframe_from_position property to ViewshedSettings, to draw viewshed wireframes from the viewpoint position, instead of the near plane.
  • Added support for the IGNF:WGS84G SRID.
  • The NPM package for the TypeScript bindings of the monitoring protocol is now published as @siradel/horizon-monitoring-protocol.

Changed

  • Rasters
    • The terrain’s staircase effect when the DTM is incompletely loaded is no longer present on devices that support the OES_texture_float_linear WebGL extension.
    • The R_F32 and R_F32_SILICIUM image formats are now usable as DTM rasters.
    • The SIGNED_FIXED_24_8 image format is now usable in the palettised raster provider.
    • The NodataValue structure now has a type property of type NodataValueType, as well as dedicated properties for values of each type.
      • COLOR_NODATA, UINT_VALUE_NODATA, INT_VALUE_NODATA, and FLOAT_VALUE_NODATA allow matching a value in the source images, regardless of the actual encoding of the values in the images.
      • NAN_NODATA allow matching all NaN values in formats that support them (R_F32 and R_F32_SILICIUM).
      • BIT_PATTERN_NODATA allows matching values according to their exact binary representation in the source images. The value given in bit_pattern is interpreted as a little-endian binary array, whose length matches the size of one pixel of the image format. This mode can be useful to match float numbers without worrying about the value being altered when going through multiple representations (such as JSON).
    • The geometry field is now a member of the relevant raster providers parameters (TiledRasterProviderParams and UntiledRasterProviderParams) instead of being a member of RasterParams. For all other providers the geometry parameters are determined from the source data and the values of RasterGeometry were already ignored.
    • The tiling_scheme field has been removed from RasterGeometry and added to the only provider that uses it: TiledRasterProviderParams.
    • The sampling, blending, and display_bounds fields of RasterParams have been moved to Raster.
    • The RasterParams structure has been removed.
    • The nodata value is now specified in the nodata field of each raster provider parameter structure, instead of being part of RasterSampling. The value is now inside a RasterNodata structure, that allows explicitly enabling or disabling the nodata value.
    • All provider parameter fields (*_provider) have been moved from Raster and PalettizedRasterProviderParams to a new structure named RasterProvider. The new field is named provider in both Raster and PalettizedRasterProviderParams.
    • The field type of RasterProvider allows explicitly setting the type of the provider.
    • The field nodata_color has been added on PalettizedRasterProviderParams. It allows setting the colour for nodata values coming from the child provider, regardless of what the actual values are.
    • The field nodata has been added on PalettizedRasterProviderParams. It allows specifying a colour (after palettisation) that is considered nodata when the layer is drawn on the globe. This colour can be either displayed or discarded according to the value of the nodata_handling field of RasterSampling.
    • All raster providers have been renamed:
    • All values of RasterProviderType have been renamed:
      • SINGLE_IMAGE_PROVIDER to UNTILED_RASTER_PROVIDER.
      • TILED_IMAGE_PROVIDER to TILED_RASTER_PROVIDER.
      • PALETTIZED_IMAGE_PROVIDER to PALETTIZED_RASTER_PROVIDER.
      • ARCGIS_PROVIDER to ARCGIS_RASTER_PROVIDER.
      • TMS_PROVIDER to TMS_RASTER_PROVIDER.
      • WMS_PROVIDER to WMS_RASTER_PROVIDER.
      • WMTS_PROVIDER to WMTS_RASTER_PROVIDER.
      • CESIUM_TERRAIN_PROVIDER to CESIUM_TERRAIN_RASTER_PROVIDER.
      • TILEJSON_PROVIDER to TILEJSON_RASTER_PROVIDER.
      • PMTILES_PROVIDER to PMTILES_RASTER_PROVIDER.
    • Some fields of RasterProvider have been renamed:
      • tiled_image to tiled.
      • single_image to untiled.
      • palettized_image to palettized.
  • 3D models
    • The SIRADEL_data_texture glTF extension has been extended to detail how data bits from colour images are reinterpreted as scalar values. (What ImageFormat is used for in raster layers.) Entries of the textures array in glTF JSONs for data textures must now have a SIRADEL_data_texture extension object with a value for the dataInterpretation property. The only accepted value is rgba8BitsToFloat, which corresponds to the R_F32 image format.
    • The SIRADEL_data_texture glTF extension now allows defining a sampler for glTF data textures. Linear filtering and mipmaps must not be used. The default sampler (when no ID is given in the glTF JSON) is unchanged.
  • Picking
    • The fields imagery, dtm, and scalar of RasterPickResult have been replaced with color and number. Depending on the type of each raster that has been picked, the corresponding field gets filled. The image format of the raster is given explicitly in the image_format field.
      • ImageryPickResult, DtmPickResult, and ScalarPickResult have been removed.
    • The type field of RasterPickResult has been removed, as well as the RasterType enumeration. Instead colour and scalar imagery rasters can be distinguished with the image_format field and the type of the result. Imagery rasters and DTM rasters can be distinguished with the contents of the value in the layer field of PickLayerResult.
  • For WMS and WMTS raster providers, when a desired image format is specified, it is now always chosen if available in the source, even if it is not supported by Horizon.
  • On the web, when the client is served over HTTPS and a resource is requested from an HTTP URL, the request is made using the HTTPS protocol automatically, instead of failing immediately. (The resource may not be available from the HTTPS endpoint, but mixed content is not allowed so HTTP requests cannot succeed.)

Deprecated

  • 3D models
    • Using the SIRADEL_data_texture glTF extension without specifying a value for the dataInterpretation property is deprecated. Encoding scalar values in glTF data textures in the R_F32_SILICIUM format is deprecated.

Removed

  • The Horizon protocol descriptor (hrz-protocol.pbf) is no longer published. Please use the .proto files from the source tree at //hrz/proto instead.
  • The monitoring protocol file (hrz-monitoring-interface.proto) is no longer published. Please fetch it from the source tree at //hrz/monitoring/proto instead.

Fixed

  • Fixed a memory leak (including the whole Web Assembly memory) when the viewer module was released.
  • Fixed missing pixels in imagery and DTM rasters at high zoom levels (relative to the source raster resolution) for non-Web Mercator rasters.
  • Fixed an empty line appearing at the antimeridian on global web mercator raster datasets configured with slightly wrong bounds.
  • Fixed HTTP redirections not being followed on desktop.
  • Fixed untiled multi-polylines and multi-polygons having large artifacts at lower zoom levels.
  • Fixed a crash when the viewport size was zero in either of its dimensions.
  • Fixed support for geographic coordinate systems in WMTS raster layers.
  • Fixed nodata handling for RGBA rasters, when the alpha channel value of the nodata value is not 255.
  • (Web) Fixed HTTP headers not being decoded and read correctly. This affected resources that needed headers such as Content-Type for decoding, for example 3D Tiles.

Upgrade notes

  • Rasters
    • For rasters that had their nodata value defined as the binary representation of the value, cast to a signed integer (typically DTM rasters), either cast the value as an unsigned integer and use a BIT_PATTERN_NODATA value, or use another mode and give the number value.
      • SIGNED_FIXED_24_8 rasters with a nodata value of -2147483648 should be converted to INT_VALUE_NODATA and a value of -8388608.
    • Any nodata value that was set on a palettised raster should now be set on its scalar value child provider. If relying on the nodata_handling value of RasterSampling is desired, use the nodata_color field of PalettizedImageRasterProviderParams to choose how to palettise nodata values.
  • 3D models
    • Models conforming to the previous version of the SIRADEL_data_texture glTF extension, including its non-documented expectations, remain usable. Users are strongly advised to generate new models according to the updated version of the extension, and to convert existing models if possible.

Version 24.4.3 - 2025-04-16

Fixed

  • Fixed styling 3D Tiles layers with external tilesets using data from a vector data layer.
  • Do not show “no data” tiles from Bing Maps at high zoom levels.

Version 24.4.2 - 2025-01-08

Added

  • Added the experimental_adaptive_resolution parameter to TerrainSettings. This parameter improves terrain rendering at high elevations. It is experimental and should not be used in production.

Removed

  • Web: The hrz_core.worker.js file that used to be distributed with Horizon is no longer used, and has been removed.
  • The C# bindings for Horizon are no longer maintained nor distributed.

Fixed

  • 3D Tiles
    • Fixed materials updates not being taken into account without updating the whole layer.
    • Fixed 3D Tiles with material errors (like textures not being loaded) not being displayed nor updatable.
      • This might break situations that relied on models being hidden when they had material errors.
      • Now those models will be displayed with undefined appearance.
    • Fixed 3D Tiles layers not loading vector data in some cases after hiding and showing tiles again by moving the camera, or destroying and recreating layers.
  • Vector tiles
    • Fixed a crash when updating vector data layers by adding, moving, or deleting features.
    • Fixed the use_z parameter for vector tile feature clamping not being respected.
    • Fixed a crash when picking vector features right after updating their vector data layer.

Version 24.4.1 - 2024-12-17

Fixed

  • Fixed a crash when updating vector data used by a vector tiles layer that uses special attributes.

Version 24.4.0 - 2024-12-12

Added

  • 3D Tiles
    • Added support for point cloud (pnts) tiles.
    • Those tiles have the same styling and color blending capabilities as other tile variants, but don’t support multiple materials.
    • Added support for the SIRADEL_range_request extension, allowing 3D Tiles to be served with HTTP range requests.
  • Vector tiles
    • Added support for PMTiles vector data sources.
    • Added the missing_tile_policy property to VectorTilesLayer. It controls the appearance of vector tile layers when source tiles are missing. Either holes in the coverage, or—as the camera zooms in—the parent tile is shown until the children can be displayed. The latter is the default behaviour.
    • Added the feature_anchor field to VectorPickResult, which contains the position of the picked feature’s anchor.
    • Flat overlay discs can now have their radius specified in either metres or pixels, through the property disc_radius_unit of FlatOverlayVectorRepr.
  • The camera now remains above the terrain (taking DTM layers into account), unless configured otherwise. The property min_height_above_terrain has been added to CameraSettings to configure the minimum distance between the camera and the terrain. A positive value forces the camera to remain above ground, while a negative value allows going underground.
  • The MIME type of the data in client asset responses can now be specified with the property mime_type of AssetRequestResponse.
  • The ViewerOptions’s property run_actors_on_main_thread has been added. Setting it to true uses one fewer CPU core, at the expense of degraded performance.

Changed

  • The maximum number of color points usable for 3D model materials palettization and for heatmaps is now 32 instead of 16.
  • Forbidden HTTP header names are now checked and rejected.
  • Changing HTTP headers on a data source will now refresh the data if any content negotiation headers have changed. Those headers are all headers whose name begin with Accept, and are not forbidden.
  • Improved the visual stability (when zooming in and out) of WMTS layers that use the global Web Mercator tiling scheme without being explicitly marked as “Google Maps compatible”.
  • Horizon now requires the bulk memory operations Web Assembly extension. This does not affect compatibility with supported browsers.

Removed

  • Removed the numeric_type field from NumericPalette. It had no effect since attribute values had been made dynamically typed, in version 24.3.0.
  • Removed the wmerc_coords field from VectorPickResult. It was redundant with the position given by the picking result message.

Fixed

  • 3D Tiles
    • Fixed a few cases where empty tiles would not load and block parent tiles from refining.
    • Fixed 3D Tiles with scaling not being culled and refined properly.
    • Fixed i3dm tiles not using the blending mode & strength defined on their 3D Tiles layer for feature colors.
  • 3D models
    • Fixed glb files with a declared size smaller than the file size not being accepted.
    • Fixed the relative paths of b3dm, i3dm, and glTF resources not being handled correctly inside 3D Tiles tilesets.
  • Vector tiles
    • Fixed a crash caused by duplicate vertices in polygons.
    • Fixed flat overlay vector tiles disappearing for some camera angles when a DTM is loaded.
    • Fixed a crash triggered by loading vector tiles with a large quantity of polyline data.
    • Fixed picking and selection for text symbol elements.
    • Fixed picking a vector tile feature not returning any attribute when picked outside of the strict bounds of its tile. This happened when features exceeded the bounds of their tiles, and clip_to_tile was not set.
  • Platform-specific
    • Made an attempt at fixing a TextDecoder issue in Chromium-based browsers, when Horizon is instantiated multiple times from an iframe.
    • Worked around an issue in Chromium-based browsers where repeated HTTP range requests could fail randomly.
    • Support HTTP return code 204 (“No Content”) on desktop.
  • Fixed HrzProtocolHelper.attributeAsAny returning null for all non-number values.

Upgrade notes

  • To keep the previous behaviour of allowing the camera to go under the terrain, set CameraSettings’s min_height_above_terrain to a large negative value, such as -6378137 (the Earth’s radius).
  • Set the property missing_tile_policy of VectorTilesLayer to USE_EMPTY_TILE to preserve the behaviour of showing holes in the coverage of vector tile layers when source tiles are missing.
  • The default unit for flat overlay discs is metres, which is the only unit that was available previously. No change is needed to maintain the same visual aspect.

Integration notes

  • We were unable to reproduce the issue related to TextDecoder in Chromium-based browsers with Horizon running in multiple iframes. Please give us feedback about this issue.

Version 24.3.0 - 2024-10-21

Added

  • Rasters
  • Vector data
    • Added AttributeTransforms to apply transformations to attributes upon reading them.
    • Attributes are now optional. Values that are missing are null.
  • Styling
    • Added the mapbox_typeof function to get the Mapbox-compatible type of a value.
    • Added the is_null function to check whether a value is null or not.
    • Added the is_nan function to check if a value is null, NaN, or converts to NaN.
    • Added the value_or function to conditionally select non-null values.
    • Added the to_string, to_int, to_uint, to_number, to_boolean, and to_color functions, that act like AttributeTransform, but in styling scripts.
  • Heatmaps
    • Added a new accumulation parameter to HeatmapVectorRepr to specify how the value of points are accumulated.
    • The previous mode is now HEATMAP_ADDITIVE.
    • The new HEATMAP_WEIGHTED_BLENDED mode improves readability in areas with high point density, but is only usable on values between 0 and 1.
  • Added two new camera notifications: motion_started and motion_ended, to detect when a camera starts and stops moving for any reason: animation, automated movement, user movement, etc.

Changed

  • Vector data
    • Attributes can now be heterogeneously typed, meaning that each value of an attribute can have a different type.
    • The available types are boolean, uint64, int64, double (number), string, and null (when no data is given).
    • Colors must be encoded as 0xaabbggrr in numbers, or as #rrggbbaa or HTML color names in strings with the TO_COLOR AttributeTransform.
    • In the TypeScript API, utilities have been added to HrzProtocolHelper to work with these attributes.
  • Mapbox
    • Using hrz:attributes metadata is no longer necessary in Mapbox scenes.
  • Shape editor
    • Double-clicking the left button of the mouse no longer zooms the view in when appending a point to a shape.
  • Made loading flat overlay polygons faster at low zoom levels.

Fixed

  • Fixed clicking editable shapes to activate them not working.
  • Fixed a crash happening with some flat overlay polylines along the antimeridian.
  • Fixed a case of missing flat overlay features due to numerical instability.
  • Fixed random functions returning the same values for each expression.
  • Fixed image symbols having a dark halo when partially transparent.
  • Windows & Linux: Fixed range requests with HTTP caching being empty when fetched from cache a second time.

Upgrade notes

  • Vector data
    • In AttributeValue and InMemoryAttributeValue:
      • int_value is now int64_value, but prefer number_value unless values outside of [-253 - 1, 253 - 1] are expected.
      • uint_value is now uint64_value, but prefer number_value unless values greater or equal to 2^53 are expected.
      • float_value is now number_value.
      • color_value is now number_value with 0xaabbggrr, or string_value with the TO_COLOR AttributeTransform.

Version 24.2.2 - 2024-09-25

Fixed

  • Fixed 3D models of i3dm tiles sometimes using models from other i3dm tiles.
  • Fixed vector data invalidation not being taken into account right after modifying the representations of a vector tiles layer.
  • Fixed in-memory vector data not being displayed at longitudes above 90° or below -90°.
  • Fixed vector tile representations not updating after deleting the last feature of a tile.

Version 24.2.1 - 2024-08-08

Added

  • Mapbox
    • Raster group and starting raster slot for raster layers can now be specified in the translation settings.
    • Starting z-indices for flat overlay and symbol representations can now be specified in the translation settings.
    • The number of raster slots that have been used for raster layers is now returned in the translation results.
    • The number of z-indices that have been used for flat overlays and symbols when translating a scene are now returned in the translation results.
  • 3D models
    • Added support for the CESIUM_RTC glTF extension. This is an outdated way of placing a model in ECEF coordinates. See the single model documentation for explanations.
    • Added a clamp_to_ground parameter to SingleModelLayer to automatically clamp single models to the ground using their anchor as reference.
  • Added a blur_size parameter to heatmaps, used to control the fall-off of the points.

Changed

  • Styling scripts
    • Styling scripts are now evaluated using dynamic typing. See the documentation for a detailed explanation of the new typing rules.
  • TileJSON descriptors without a tilejson version field are now parsed on a best-effort basis.

Removed

  • Styling scripts
    • The to_uint and to_int functions have been removed as they are no longer necessary.
    • The xor logical operator has been removed.

Fixed

  • Mapbox
    • Fixed the default background color being gray instead of white.
    • Fixed the camera going very far away when transitioning to a Mapbox scene encompassing most of the planet.
  • Camera
    • Fixed continuous camera movements sometimes not starting when requested before the first frame.
  • Fixed empty 3D Tiles nodes flickering during refinement.
  • Fixed a crash that occurred when invalidating client attributes of a vector data layer with an untiled vector data provider.
  • Fixed a crash when loading a Bing layer that uses their new URL format.
  • Fixed heatmaps points being half as small as they should have been.

Upgrade notes

  • To approximately match the previous appearances of heatmaps, set the blur_size parameter to 1.2, and halve the disc radius.

Version 24.2.0 - 2024-07-15

Added

  • Vector tiles
    • The static_tiles property has been added to VectorTilesLayer. Setting it to true prevents the representations of a vector tile layer from being automatically updated on source data invalidations, but decreases the CPU and memory costs.
    • UntiledVectorDataProviderParams now have the tolerance parameter, to control how much geometries are simplified.
    • The VectorGeometryType enumeration can now be used in style scripts.
    • The clip_to_tile parameter has been added to ModelVectorRepr. It allows discarding features that are in the margin of the tiles, to avoid duplicated model instances.
  • Styling
    • Added lerp and mix_colors functions to respectively interpolated linearly between two numerical values or two colours.
    • Added the ability to read properties once they are assigned a value. This can help to avoid duplicated expressions in style scripts.
    • Some enumerations defined in the protocol are now available in style scripts, namely TextAlignment and VectorGeometryType.
      • A new operator has been introduced to access enumeration values: enum().
    • Added the round, floor, and ceil operators.
    • Added uniforms which are values that are constant for all features inside a tile.
    • Added the tile_z and tile_depth uniforms, for vector tiles and 3D tiles respectively, which give access to a tile’s depth inside styling scripts.
  • Symbols
    • Some properties of TextSymbolElement have been made stylable per-instance: outline_width, alignment, and line_spacing.
    • Text outline width can now be expressed using one of two units: em (like before) and pixels. Ems are relative to the font size, pixels are not. This is configured through the outline_width_unit property of TextSymbolElement.
    • Added culling priorities.
      • The new culling_priority property of AnchorSymbolElement can be used to control how features within representations of equal z-index cull each other.
      • The z_index property of SymbolVectorRepr can now be used to control how features within different representations cull each other.
      • In case of equality, the farthest feature is culled away.
      • Note that this only affects symbols whose anchors have culling enabled. When it is disabled, the overlap continues to be determined by the anchor positions.
  • Mapbox
    • Polygon patterns (configured through the fill-pattern property) are now translated into flat overlay polygon patterns.
    • The properties text-halo-width, text-justify, and text-line-height are now translated more faithfully when they use expressions.
    • The round, floor, and ceil operators are now supported.
  • Camera
    • Added the ability to retrieve the view box & polygon for all views associated with a given a camera through the GetCameraViewBox and GetCameraViewPolygon methods of CameraService.
    • Orbit camera bounds can now straddle the antimeridian. (When the East border has a lower value than the West border.)
    • Orbit camera bounds can now be restricted to a line (for example, along the Equator) or a single point.
  • 3D Tiles
    • Added support for composite (cmpt) tiles.
  • Ambient settings
    • Added the option to render up to two layers of ambient fog in the scene.
      • Their color, density, proximity and falloff can be customized. Refer to the documentation for detailed explanations of each parameter of FogSettings.
    • Added the wrap_lighting parameter, which allows polygons facing away from the sun to receive some amount of sunlight.
      • It is advised to disable shadows when using this feature.
    • Added the option to specify the sun position in a non-simulated manner using angles.
      • In addition, the sun can now be set to rotate with the camera, so that its azimuthal angle remains constant from the point of view of the camera.
    • Added the option to use a static sunlight color instead of a simulated value.

Changed

  • Camera
    • The old GetCameraViewBox and GetCameraViewPolygon methods of CameraService have been renamed to GetSceneViewViewBox and GetSceneViewViewPolygon.
    • Orbit camera bounds straddling the antimeridian are no longer considered as invalid and are not ignored.
  • Vector tiles
    • Assignments to unknown properties now emit a warning instead of generating an error that prevented styling scripts to be executed.
    • Instanced models now support non-uniform scale values, so the type of the scale property of ModelVectorRepr has been changed to a Vec3fProperty.
  • Vector data
    • Minimum level, maximum level, and bounds are now defined on vector data sources instead of directly on vector data layers.
    • Memory usage of untiled vector data providers has been decreased.
  • Ambient settings
    • Reorganized AmbientSettings.
    • Options related to the sky, sun and ambient lighting have been grouped in the respective dedicated messages SkySettings, SunSettings and AmbientLightingSettings.
      • See the documentation or the upgrade notes for more information.
    • The enable_atmosphere toggle has been replaced with three different mode parameters, which makes it possible to mix and match simulated or non-simulated behaviors for the sky, sun and ambient lighting.
    • The sun_strength and ambient_strength have been replaced with two parameters:
      • sun_ambient_balance controls the impact of sunlight in relation to the ambient light. The default is 0.5 and applies both of them equally. At 0.0 there is no sunlight, and at 1.0 there is no ambient light.
      • lighting_strength applies a uniform scaling factor to both sources equally. The default is 1.0.

Removed

  • Vector data
    • The guess_max_level parameter of UntiledVectorDataProviderParams has been removed. Tiles are now always generated up to the level required to preserve all details. The max_zoom parameter value is still used as an upper bound.

Fixed

  • Vector tiles
    • Fixed geometries from untiled vector data providers being sometimes simplified too aggressively.
    • Text outlines whose width is expressed in em have been visually halved in order to respect the meaning of the unit.
    • Improved vector tile layers loading time when clamping is enabled, including when there are no DTMs in the scene.
  • Mapbox
    • Text outlines (defined with the text-halo-width property) have been adjusted to better match the intended appearance.
  • Avoid downloading external glTF models from i3dm 3D Tiles multiple times when a tileset has external tilesets.
  • Fixed camera movements not being handled when submitted right after a transition relative to the terrain.
  • Fixed a freeze that occurred when zooming in too far beyond the max level of an imagery raster layer in the Web Mercator tiling scheme.
  • Fixed some interactions with symbols that have the ignore_occlusions flag enabled:
    • They can now be selected when occluded by other scene elements.
    • Their selection highlight now appears above other scene elements.
    • They now occlude the selection highlight of other scene elements.

Upgrade notes

  • Camera
    • Previous calls to GetCameraViewBox and GetCameraViewPolygon from CameraService must be renamed to GetSceneViewViewBox and GetSceneViewViewPolygon respectively.
  • Vector tiles
    • Minimum level, maximum level, and bounds must be moved from the vector data layers to their sources. For most layers, there is nothing more to do.
      • For untiled vector data sources, bounds covering the whole planet can be used if no clipping of the source data is needed, then the effective vector data layer bounds will be those of the source data.
      • For in-memory vector data sources, there are no bounds because such a source can provide tiles at any coordinates. In order to avoid generating too many tiles, bounds can be set on the vector tile layers that use the data. For typical uses, bounds covering the whole planet and levels ranging from 0 to 6 should work.
    • In order to preserve text outline widths visually when upgrading, outline_width_unit (of TextSymbolElement) must be set to OUTLINE_WIDTH_IN_EM and the numerical value must be doubled.
    • Style scripts that use number literals to test values of the feature type special attribute can now use values of VectorGeometryType directly with enum("VectorGeometryType", "<type>").
  • AmbientSettings
    • sun_ambient_balance and lighting_strength should be set according to the values of the now removed sun_strength and ambient_strength parameters:
      • If sun_strength == ambient_strength:
        • sun_ambient_balance should be set to 0.5.
        • lighting_strength should be set to their value.
      • If sun_strength < ambient_strength:
        • sun_ambient_balance should be set to 0.5 * sun_strength / ambient_strength.
        • lighting_strength should be set to ambient_strength.
      • If sun_strength > ambient_strength:
        • sun_ambient_balance should be set to 1.0 - 0.5 * ambient_strength / sun_strength.
        • lighting_strength should be set to sun_strength.
    • The mode parameter of the SkySettings, SunSettings and AmbientLightingSettings messages inside AmbientSettings should be set according the the value of the now removed enable_atmosphere parameter:
      • If it was true, they should be set to respectively SKY_SIMULATED, SUN_LIGHTING_SIMULATED and AMBIENT_LIGHTING_SIMULATED.
      • If it was false, they should be set to respectively SKY_STATIC, SUN_LIGHTING_STATIC and AMBIENT_LIGHTING_STATIC.
    • SkySettings’s attenuation should be set to the value of the now removed atmosphere_attenuation.
    • SkySettings’s static_color should be set to the value of the now removed sky_color.
    • SunSettings’s static_color should be set to pure white.
    • AmbientLightingSettings’s static_color should be set to the value of the now removed ambient_color.
    • SunDirectionSettings’s mode should be set to SUN_DIRECTION_RELATIVE_TO_DATE, and day_of_year and local_solar_time to the same value they had in AmbientSettings.

Integration notes

  • Vector data
    • Set the static_tiles property of VectorTilesLayer to true for all layers that are not meant to receive source data updates. This typically includes basemap layers, as well as all layers that don’t represent live data.
  • ModelVectorRepr
    • The three components of the default value of the scale property of ModelVectorRepr should all be set to the previous default value.
    • Styling scripts that assign values to the scale property should be updated to assign values to all components of the property.
    • Unless there is a need for displaying instanced models for features that are outside of the tiles’ bounding boxes, set the clip_to_tile parameter to true, so as to avoid duplicated instances. (The same feature can be present in multiple neighbouring tiles when they are generated with a data margin, which is common for MVTs.)

Version 24.1.3 - 2024-07-29

Fixed

  • Fixed a crash when loading a Bing layer that uses their new URL format.

Version 24.1.2 - 2024-06-05

Fixed

  • Fixed an issue where the scene never settled when one of the active cameras had an altitude under 1m.

Version 24.1.1 - 2024-05-29

Added

Fixed

  • Fixed 3D Tiles with a size of zero along one axis but not the other two not being displayed.
  • Fixed a GPU memory leak when using 3D Tiles tilesets containing i3dm tiles.
  • Fixed editable shape control points not clamping to the terrain when a DTM is loaded.
  • Fixed the screen going black when the camera would go below the sea level with the atmosphere enabled.
  • Fixed impostors culling not accounting for clamping, which could lead to situations where neither model or impostor would be rendered.
  • Fixed the lighting of instanced model impostors, making them blend better with their surroundings.
  • Flat polygon baking is now faster in some cases where it was unexpectedly slow.
  • Suppressed an error message when all features of a tile are culled because of the clip-to-tile configuration setting.

Version 24.1.0 - 2024-04-15

Added

  • 3D Tiles
    • Added support for the Instanced 3D Model (i3dm) 3D Tiles format.
  • Vectors
    • Image patterns can now be drawn on flat polygons. They are small images that are repeated on both axes in order to cover the whole polygon’s surface. They use the same sprite format that sprite symbol elements use.
    • Added the clip_to_tile parameter to SymbolVectorRepr. It allows discarding features that are in the margin of the tiles, to avoid duplicated symbols.
  • Mapbox
    • Added support for translating symbol layers.
    • Added support for parsing arithmetic operators with a variable number of arguments. More details are to be found in the documentation.
    • Added the ignore_ambient_params and ignore_terrain_params properties to MapboxTranslationParams. which leave the current scene views’ AmbientSettings and TerrainSettings unchanged.
  • Style scripts
    • Added support for boolean properties with BoolProperty.
    • Improved conversion between types in styling scripts. Notably, all types can now be naturally converted into booleans.
    • Added type conversion functions in style scripts to explicitly cast values to signed integers or unsigned integers. See the documentation for more details on types in style scripts.
  • Camera
    • Added a continuous_movement_interruption field to CameraMovement to specify how to handle interruptions by other events.
    • Continuous movements can be non-interruptible, interruptible, or interruptible but made to resume after the interrupting action has ended.
    • Added a new CameraNotification message to the message queue that notifies when animations and continuous movements begin, end, or are interrupted.
  • Attributions
    • Added a ViewerService method SetAttributionEnabled to enable periodically retrieving attribution information about the current scene.
    • The attribution information is retrieved through the message queue, in an AttributionsMessage.
    • The list of attributions must be displayed according to the data providers’ policies.
    • More information is available in the documentation.
  • Editable shape line segment can now follow either geodesics (which they always did before) or rhumb-lines, which are lines of constant bearing. Two types of rhumb lines are available: those that cross the antimeridian, and those that cannot. This is configured through the line_type property of EditableShapeGeometry.
  • The Windows and Linux builds can now load OpenGL through EGL. This allows using OpenGL ES on the desktop, and using ANGLE as the OpenGL implementation provider. This implementation translates OpenGL ES calls into regular OpenGL, Vulkan, or Direct3D. ANGLE is used by multiple web browsers, such as Chrome and Firefox, to provide WebGL 2. Doing this allows reproducing potential issues that may arise with these browsers.

Changed

  • The loading of vector tiles now takes terrain elevation into account, making tiles at high levels of detail appear more naturally as the camera approaches them.
  • Vector tiles with clamping enabled are updated when the terrain changes, which prevents it from appearing disjointed from the planet.
  • The enable_shadows parameter of LightingSettings has been split into cast_shadows and receive_shadows, which respectively control objects casting shadows on other objects, and objects receiving shadows from other objects.
  • Changed the display_child property of OptionalSymbolElement to a BoolProperty.
  • 3D Tiles are now unloaded when they go out of view, even if they are close to the camera.
  • 3D Tiles and vector tiles are culled when occluded by the horizon, to improve performance.

Fixed

  • Fixed image symbol elements sometimes not aligning correctly when using multiple sprites.
  • Fixed the excessive loading of vector tiles when the camera is under 2 kilometers of altitude.
  • Fixed fill colour of editable polygons going out of bounds for counterclockwise polygons.
  • Fixed a crash when manipulating the scene model on non-existing layers.
  • GeoJSON files containing data exceeding the domain bounds of the Web Mercator projection are now supported.
  • Flat overlay polylines and polygons are smoother and more correct when they cover large distances and areas.
  • Extruded vectors no longer intersect the ellipsoid surface when they are large and close to the ground.
  • Fixed some 3D Tiles being considered visible and loaded despite being out of view. They are now left unloaded.
  • Fixed flat overlays being applied differently on 3D Tiles and on the terrain, giving them different colours when the same colour was expected. They are now applied on 3D Tiles as they already were on the terrain.

Upgrade notes

  • The cast_shadows and receive_shadows fields of LightingSettings should be set to the previous value of enable_shadows to reproduce the previous behaviour.
  • The default_value of the display_child property of OptionalSymbolElement is now a boolean instead of an int64. The boolean must be set to false if the previous value was 0, or true otherwise.

Integration notes

  • If building an editor for vector data with editable shapes, use rhumb-line as line type as this matches how vector data polylines and polygons are defined and drawn in the scene. If the generated geometries are then used as-is as vector data, use rhumb lines that cannot cross the antimeridian to have the same behaviour in both the shape editor and vector layers. Continue using geodesics for measurements, as they allow getting the actual distance as the crow flies between positions.
  • Unless there is a need for displaying symbols for features that are outside of the tiles’ bounding boxes, set the clip_to_tile parameter of SymbolVectorRepr to true, so as to avoid duplicated symbols. (The same feature can be present in multiple neighbouring tiles when they are generated with a data margin, which is common for MVTs.)

Version 24.0.3 - 2024-07-29

Fixed

  • Fixed a crash when loading a Bing layer that uses their new URL format.

Version 24.0.2 - 2024-03-05

Fixed

  • Fixed abnormal memory consumption and processing time when loading vector data from MVT files.

Version 24.0.1 - 2024-02-14

Fixed

  • Fixed the is_working indicator being stuck to true when vector tiles layers were hidden by their scene views bitset.
  • Fixed symbols flickering after tiles are loaded or restyled when using culling.
  • Fixed symbol images sometimes disappearing after deleting another representation using the same image URL.
  • Fixed element_alignment property of AnchorSymbolElement being applied incorrectly when set through the styling script.
  • Fixed passing a null attribute value to Horizon using ProvideVectorData triggering type mismatch warnings.
  • Fixed WebGL warnings when displaying text on symbols.
  • Fixed the downloaded Mapbox sprite index data being freed before it is used.

Version 24.0.0 - 2024-01-26

Added

  • Vector data
    • Added the new UNTILED_VECTOR_DATA_PROVIDER.
      • It takes an untiled vector data source as input (GeoJSON or Geobuf) and tiles it, clipping and simplifying features as needed.
      • The amount of tiles generated is based on the VectorDataLayer’s min_level, max_level and bounds.
        • The provider’s guess_max_level setting uses a level where all features look close enough to their most detailed version. The layer’s max_level is used as an upper bound.
    • Added the clip_to_tile option to ExtrudedGeometryVectorRepr.
    • Added scene views settings at the root of VectorTilesLayer.
      • This setting controls the visibility of the entire layer in each scene view.
      • This value has an AND relationship with the scene views settings on vector representations.
    • Flat overlays (flat vector representations and heatmaps) can now be drawn over 3D Tiles layers, with the property draw_under_flat_overlays of ThreeDTilesLayer.
    • Flat overlays can be disabled by setting the property disable_flat_overlays of ViewerOptions to true. This can be used to lower video memory usage when the client does not need the flat overlay functionality.
    • Added support for dash period, length, and speed in pixels for cylinders.
  • Symbols
    • Added screen-space symbols culling.
      • Three new flags have been added to AnchorSymbolElement to control this behaviour: can_overlap_other_symbols, hides_other_symbols, and is_optional.
    • Added a new keep_upright option to AnchorSymbolElement to keep symbols readable when they would normally look flipped or upside down.
    • Added position_offset_relative_scaling and element_size_relative_scaling to AnchorSymbolElement, which only applies if the size unit of the corresponding property is set to SYMBOL_SIZE_IN_PIXELS.
      • SYMBOL_RELATIVE_SCALING_NONE gives all symbols on screen the exact pixel size specified in their configuration.
      • SYMBOL_RELATIVE_SCALING_REF_DISTANCE scales the specified symbol size based on their distance relatively to the reference_distance, min_relative_size and max_relative_size.
      • SYMBOL_RELATIVE_SCALING_CAMERA_HEIGHT scales the specified symbol size based on the height of the camera, min_relative_size and max_relative_size.
    • Added an option to draw symbols over everything else in the scene.
  • Mapbox scenes
    • Added the new MapboxService, that can be used for translating Mapbox scenes into Horizon scenes. Support for Mapbox layers is still limited and works on a best-effort basis.
    • Added support for the following Mapbox style sources: vector, raster, geojson. See the documentation for a list of supported properties per source and the associated limitations.
    • Added support for the following Mapbox style layers: fill, line, raster, circle, fill-extrusion, heatmap. See the documentation for a list of supported properties per layer and the associated limitations.

Changed

  • Attribute IDs are now local to their vector data layer. (They already were in practice, but the documentation stated that they were global.)
  • The property disable_terrain of ViewerOptions no longer disables flat overlays when enabled. It still makes them invisible over the terrain, as there is no terrain, but they are visible when drawn over 3D Tiles.
  • Multiple layers of the same MVT tileset can be loaded by different vector data sources (potentially on different vector data layers) without having the MVT files re-parsed for each source.

Removed

  • Removed the deprecated sprite, text, and stem vector representations. Use symbols instead.
  • Removed AnchorSymbolElement’s position_offset_is_relative and element_size_is_relative. See position_offset_relative_scaling and element_size_relative_scaling instead.

Fixed

  • Fixed impostors having random invisible or garbled atlas images.
  • Fixed impostors missing atlas images when loaded immediately at startup.
  • Fixed impostors when viewed from above, when the atlas has an odd number of images on both axes.
  • Fixed stuttering in scenes with very high amount of vector tiles.
  • Fixed styling script comparisons when boolean literals or boolean attributes are involved.
  • Fixed the is_working status when a vector data layer with a TileJSON descriptor could not be loaded.
  • Fixed an innocuous error message at startup when the loading screen is enabled.

Upgrade notes

  • The scene_views field of VectorTilesLayer should be set to show all views to preserve the behaviour of previous versions.
  • AnchorSymbolElement’s position_offset_is_relative and element_size_is_relative booleans have been replaced by the position_offset_relative_scaling and element_size_relative_scaling properties.
    • To match the previous behavior, if the booleans were set to false, SYMBOL_RELATIVE_SCALING_NONE should be used for their equivalent : otherwise, SYMBOL_RELATIVE_SCALING_REF_DISTANCE should be used instead.
    • SYMBOL_RELATIVE_SCALING_CAMERA_HEIGHT can be used to scale the symbol automatically based on the height of the camera, instead of having to manually set the reference_distance.
      • It is easier to set up, but gives less control over the final sizes than SYMBOL_RELATIVE_SCALING_REF_DISTANCE.
  • Use symbols to replace the former sprite, text, and stem vector representations.

Integration notes

  • When displaying untiled vector data from a single GeoJSON or Geobuf source, the new UNTILED_VECTOR_DATA_PROVIDER should be preferred over a TILED_VECTOR_DATA_PROVIDER, although the more efficient option remains to tile the data before loading it into the engine.

Version 23.3.2 - 2023-12-01

Added

  • Styling scripts now support boolean literals true and false.

Fixed

  • Fixed flat overlays re-rendering too often while the camera moves.
  • Fixed a crash occurring during the evaluation of constant branch conditions.
  • Fixed selection sometimes not working for symbols when using conditional styling.
  • Fixed count methods of the scene model on vector data layers not working.

Version 23.3.1 - 2023-11-14

Added

  • Symbols
    • Added the COVER mode to BoxFit.
    • Added a BoxFit parameter to decorated shapes & image symbol elements.
    • Added an aspect ratio and alignment parameters to decorated shape symbol elements.
  • Styling scripts
    • Styling scripts now support single line comments using ‘//’.
    • Styling script literals now support escape sequences.
  • Added a scene dump migration tool to the testing kit. This tool can migrate any scene dump to the latest version of the scene model.
  • The duration before a client vector data request timeouts is now configurable.

Changed

  • Symbols
  • Flat overlays are re-rendered at interactive rate (similar to animations) when forced.
  • A hard cap of 10,000 tiles has been set on vector tile layers. This avoids the runaway consumption of resources by incorrectly configured layers (for example if the max screen-space error is too low), that lead to freezes and crashes.

Fixed

  • Symbols
    • Fixed symbol anchors properties when they are children of Optional or Variant elements.
    • Fixed swapped top and bottom values in padding symbol element.
  • Vector data
    • Fixed updates to one vector tile layer causing other vector tile layers using the same vector data layer to reload as well.
    • Fixed updates to vector data layer IDs not causing vector tile layers to load the expected data.
    • Fixed the Z component of in-memory features not being properly passed down to the anchor Z special attribute.
    • Geometry data isn’t reloaded any more after invalidating attribute values from a client data source that doesn’t provide the geometries.
  • Native HTTP cache
    • Fix endlessly repeating requests when a server 304 response couldn’t be matched to a cached entry.
    • Fixed data: requests corrupting data when the HTTP cache was enabled.
  • The is_working flag is no longer set to true when the render is forced every frame, and no loading operation is being carried out.
  • Flat overlays are now properly redrawn after an instantanous camera movement.
  • Fixed a crash occurring when too many consecutive changes to a representation were made.
  • Fixed crash when shutting down the viewer.

Upgrade notes

  • The IMAGE_FIT_ enum values must be renamed to BOX_FIT_AXES_.
  • The fit parameter of ImageSymbolElement must be renamed to fit_axes.
  • To reproduce the previous layouting behaviour, the fit_mode parameters of ImageSymbolElement and DecoratedShapeSymbolElement should be set to BOX_FIT_FILL.
  • A duration before a client vector data request timeouts and fails has been introduced in version 23.3.0, with a fixed duration of 5 seconds. This duration is now configurable through the timeout field of ClientVectorDataProviderParams. The value 0 (which is the default) means no timeout: the client can take as much time as it needs before responding to a request. Set the value to 5 to reproduce the behaviour of version 23.3.0.

Version 23.3.0 - 2023-10-17

Added

  • Symbols
    • Added the symbol vector representation.
    • This representation supersedes the sprite, text, and stem representations.
    • Symbols can combine images, texts, and other primitives inside complex layouts.
    • Symbols can either point towards the camera, or be flat on the ground, or have a fixed rotation, etc.
    • Image elements can use sprite sheets whose sprite can be selected using styling scripts.
    • Text elements now support line wrapping inside constrained boxes.
    • More information can be found in the documentation.
  • Styling scripts
    • Added variable representation property names in styling scripts. Representation properties must now be provided with a name to be usable in styling scripts.
    • Multiple properties can share the same property name, but properties that were previously shared can now be split using different names.
    • Added the ability to configure a default value for the scale property of the text and sprite representations.
    • Added the ability to configure a default value for the text property of the text representation.
    • Added the random functions: rand_unif_u, rand_unif_f, rand_norm_u, rand_norm_f. The functions can generate either integers or decimal numbers following either a uniform or normal distribution. Upper and lower bounds can be defined for uniform distributions. Similarly, the normal distributions can be tweaked by providing the mean and standard deviation.
    • Added the hsl() and hsla() functions in styling scripts. They allow defining colours in the HSL color space.
    • Added color manipulation functions: invert_color, rotate_hue, lighten, brighten, darken, saturate, and desaturate.
    • Added constant expression folding: expressions that only depend on constant values are evaluated only once instead of once per feature. (Except for fmt, which is always evaluated for every feature. String literals must be used for constant strings.)
  • Client-provided vector data
    • Client providers of VectorDataSource can now be used to request tile geometries from the client, and is no longer restricted to attribute values.
    • Client attribute values can now be requested by tile coordinates rather than feature IDs.
      • This is controlled by the access field of ClientVectorDataProviderParams, which was previously unused.
      • Responding to a tile-based attribute request requires sending attribute values for every feature of the requested tile, in the same order as features are defined in the original data source.
  • High DPI rendering
    • In web browsers, the engine now detects the required device pixel ratio, which is the ratio from physical to logical pixels, and renders the scene at the correct resolution so as not to look blurry.
    • All rendering primitives that used pixels as unit now use logical pixels. This makes the appearance of those primitives independent of the screen DPI.
    • Added a device_pixel_ratio parameter to ViewerOptions to override the detected value.
  • Added the ability to interpolate the color of extruded vector geometry using the new styling properties lower_color, upper_color and roof_color (see ExtrudedGeometryVectorRepr).
  • Added default grid and line configuration for new gizmo layers.
  • Added default grid configuration for new clipping plane layers.
  • Added the ability for Horizon to use assets provided by the client, by using URLs with the client: scheme.
    • An AssetRequestMessage will be sent to the message queue, which the client should answer using the ProvideAssetData method of ClientDataService.
    • Additional request messages will be sent if other assets are required.
  • Added an atmosphere_attenuation parameter to AmbientSettings to reduce the strength of the atmosphere when it is enabled.
  • Added the ability to choose which components of a gizmo are displayed.
  • Added the ability to select the GizmoReferenceFrame of each component.
  • Added a new special attribute for retrieving the angle at the anchor of polylines. See anchor_angle_attribute_name in VectorTilesStyle.
  • A new testing kit has been made available. It includes tools for running visual tests inside Horizon. For more information, see the artifacts page.

Changed

  • Feature anchors
    • The anchor (the point at which punctual representations are attached) of polylines is now their middle instead of their centroid.
    • The centroid_z_attribute_name field of VectorTilesStyle has been renamed to anchor_z_attribute_name.
    • The CENTROID variant of VectorClampMode has been renamed to ANCHOR.
  • Client-provided attribute values
    • The values of multiple attributes are now requested per message. The values for all attributes of a given message must be included in the same response.
    • Renamed AttributeService to ClientDataService.
    • Removed the AddAttributeValues and InvalidateAttributeValues methods of AttributeService. ProvideVectorData and InvalidateVectorData of ClientDataService must be used in their place.
  • Vector data
    • FeatureAttributeValue has been renamed to AttributeValue.
    • FeatureIdAttributeValue has been renamed to FeatureAttributeValue.
      • Its attribute_id field has been renamed to id.
    • The values field of FeatureId has been renamed to attributes.
  • Changed styling script rgb() and rgba() functions to behave like actual functions and not constant literals. They now accept expressions as parameters.
  • Changed the names of SpriteRepr, ModelRepr and StemRepr to SpriteVectorRepr, ModelVectorRepr and StemVectorRepr respectively to be more consistent with the naming of the other representations.
  • Changed the names inside VectorReprType enum to be more consistent.
  • Terrain tiles that would have a negligible impact on the current view because of their visible size are not loaded any more. The limit is set at 10 pixels. This allows loading fewer raster tiles.
  • The max_screen_space_error field of VectorTilesLayer now accepts floating point values instead of integers.
  • The active_component field of a gizmo layer has been removed and is replaced by an array of GizmoComponent.
  • The reference_frame fields of a gizmo has been moved to its components.

Deprecated

  • The sprite, text, and stem vector representations are deprecated and will be removed in a future version. Use symbols instead.

Removed

Fixed

  • Fixed a memory leak when unloading vector tile layers.
  • Fixed the terrain not stabilising in some cases, that made it swap tiles at a given location forever.
  • Fixed dash animations on segmented flat polylines not always matching perfectly from one part of the polyline to another.
  • Fixed compilation with older versions of GCC.

Upgrade notes

  • Styling scripts
    • SpriteRepr, ModelRepr and StemRepr must be renamed to SpriteVectorRepr, ModelVectorRepr and StemVectorRepr respectively.
    • VectorReprType enum names must use the new values.
    • Representation properties are no longer named by default. A name must be provided in the property to be usable in styling scripts. To keep old scenes working, give the properties the same name they had before. For instance sprite and text size property must be named “size”. For non-scalar properties name them without appending “_x”, “_y” or “_z”. For instance, when the world offset property is named “world_offset”, Horizon will automatically derive the name to create the per component properties “world_offset_x”, “world_offset_y” and “world_offset_z”.
    • Set the default value of the scale property of sprites and texts to 1.
  • ExtrudedGeometryVectorRepr
    • To match their previous appearance, set the property name of the lower_color, upper_color, and roof_color styling properties to color, and their default value to that of the old color property.
    • Consider varying the brightness across their three colors instead: having the lower part of the geometry appear darker than the upper part can help image readability and aesthetics.
  • Client-provided attribute values
    • ATTRIBUTE_REQUEST messages have been removed, VECTOR_DATA_REQUEST_MESSAGE messages must be handled instead to respond to generic vector data requests (which include attribute values).
      • Messages do not request the values of a single attribute anymore. Values for all attributes defined in the corresponding VectorDataSource are requested per message instead.
    • Calls to the AddAttributeValues and InvalidateAttributeValues methods of AttributeService must be replaced by calls to ProvideVectorData and InvalidateVectorData of ClientDataService.
  • Vector data
    • References to FeatureAttributeValue must be updated to AttributeValues.
    • References to FeatureIdAttributeValue must be updated to FeatureAttributeValue. References to its attribute_id field must be updated to id.
    • References to the values field of FeatureId must be updated to attributes.
  • Feature anchors
    • In VectorTilesStyle, the centroid_z_attribute_name field must be renamed to anchor_z_attribute_name.
    • The CENTROID variant of VectorClampMode must be renamed to ANCHOR.
  • The value of atmosphere_attenuation in AmbientSettings should be set to 0 to reproduce the previous atmosphere appearance. The default value is 0.5 which improves scene readability while keeping a realistic appearance.
  • A gizmo now uses an array of components to select which parts of it are visible. The old active_component field needs to be replaced by the appropriate components in the new array. The following lists gives which components types are required in the components array to copy the previous behaviour:
    • GizmoComponent.NO_COMPONENT needs the array to be empty.
    • GizmoComponent.TRANSLATION_COMPONENT needs components of type GIZMO_ORIGIN, GIZMO_TRANSLATION_AXIS_X, GIZMO_TRANSLATION_AXIS_Y, GIZMO_TRANSLATION_AXIS_Z, GIZMO_TRANSLATION_PLANE_X, GIZMO_TRANSLATION_PLANE_Y, GIZMO_TRANSLATION_PLANE_Z and GIZMO_TRANSLATION_PLANE_CAMERA_PLANE.
    • GizmoComponent.ROTATION_COMPONENT needs components of type GIZMO_ORIGIN, GIZMO_ROTATION_RING_X, GIZMO_ROTATION_RING_Y, GIZMO_ROTATION_RING_Z and GIZMO_ROTATION_RING_CAMERA_PLANE.
  • A gizmo reference_frame field need to be copied to all of its components.

Integration notes

  • Invalidating the values of an attribute will now also invalidate the values of all attributes declared within the same VectorDataSource. Multiple data sources should be used to avoid having to communicate the values of multiple attributes when only invalidating a few.

Version 23.2.2 - 2023-10-16

Fixed

  • Fixed vector tile layers using clamping getting stuck when a DTM layer is hidden.
  • Fixed HTTP headers not being properly updated for tiled and TileJSON vector data sources.
  • Fixed terrain tiles getting stuck at under-detailed levels.
  • Fixed vertex colors of glTF models being interpreted as sRGB instead of linear RGB and thus appearing too dark.
  • Fixed flat polylines with filled dashes of same length and period looking aliased.
  • Fixed flat overlay vector tiles sometimes not appearing until the camera is moved.

Version 23.2.1 - 2023-08-08

Changed

  • Web: Out-of-canvas key presses and releases of the control, alt, and shift keys are now detected.

Fixed

  • Camera
    • Fixed GetCameraViewPolygon and GetCameraViewBox being imprecise at high latitudes.
    • Fixed view boxes being wrong when some edge of the screen covered a longitude span of more then 180°.
    • Fixed camera bearing sometimes being lost in very specific scenarios when using positional and angular viewpoints.
  • Cesium terrain provider
    • Fixed Cesium terrain tilesets where the tiling scheme was empty erroring out instead of using TMS tile coordinates.
    • Fixed parsing of Cesium terrain tilesets using XYZ tile coordinates (aka slippyMap).
  • Vectors and styling
    • Fixed vector attribute invalidation not refreshing all relevant tiles.
    • Fixed styling sometimes failing when using if-elif-else chains.
    • Fixed instanced models selection.
  • Fixed the anchor of editable shapes not respecting their configured size on screen.
  • Fixed noticeable lag spikes occuring when loading vector data with no feature ID attributes.
  • Fixed the atmosphere not being rendered correctly after picking was requested during the first frame.
  • Web: Fixed mouse drags being detected even when starting outside the canvas.
  • Windows: Fixed all keys being released when all mouse buttons were released.

Version 23.2.0 - 2023-07-10

Added

  • 3D models
    • Added support for compressed textures with the KHR_texture_basisu glTF extension. They are usable with both single models and 3D Tiles.
    • The KHR_materials_unlit glTF extension is now supported.
    • Added the rotation_order representation property to ModelRepr, which defines the order in which the three components of the rotation are applied to the models.
  • 3D Tiles
    • The 3DTILES_content_gltf 3D Tiles extension is now supported, which allows the use of glTF or GLB files to define the contents of tiles, without having to use a b3dm file.
    • The refinement_hysteresis property has been added to the ThreeDTilesLayer structure. It allows controlling how sensitive the tile refinement process is to small camera movements.
  • Heatmaps
    • Added the new HeatmapVectorRepr representation. It is used to display aggregations of points as a flat overlay on the planet.
    • Added the heatmaps field to VectorPickResults, which contains the picked value and ID of each heatmap representation of the vector tiles layer.
  • Polylines
    • Added dashes to the cylinder representation.
    • Added the ability to disable backface culling for cylinders, which makes their inside visible.
    • Added the ability to animate the dashes of lines and cylinders with the new default_animation_speed property and animation_speed styling property.
    • Added the ability to define the color of gaps between dashes with the new default_empty_color property and empty_color styling property.
    • Added gradient dashes which can be toggled with the new dash_mode property.
    • Added the ability to specify the units used for the dash period, length, and animation speed: in pixels (for flat polylines only), in meters, or relative to the polyline length.
  • Vector data
    • Added the ability to represent multi-polylines using InMemoryVectorFeatureGeometry by specifying a series of sizes using the linestring_sizes property.
    • Vector data layers described by TileJSON files are supported (versions 1.0.0 through 3.0.0). Tile URLs, min/max levels, and bounds are extracted from the TileJSON files. Attributes still need to be explicitly declared to be usable by representations.
    • Vector data layer sources now have providers: tiled data, in-memory data, client data, and TileJSON layers. Each provider has its own set of properties, instead of having every type of supported source putting all its parameters in VectorDataSource.
  • Styling
    • Added a new alpha() built-in function in style scripts used for modifying the alpha channel of a given colour.
  • Rasters
    • TileJSON rasters can be loaded with the new TileJSON raster provider.
  • Camera
    • All camera movements now have inertia, given by the inertia fields of CameraSettings.
    • The LatLonAltToPixelCoords method now returns a new below_horizon field to indicate that the position is in the camera frustum, but below the horizon.
  • Graphics configuration
    • Added the GetConfiguration method to ViewerService, which allows to query the engine for the graphics level that was deduced at initialization (if the graphics_level property of ViewerOptions was set to GraphicsLevelAuto), memory restrictions, as well as the features that are enabled and various other graphics settings.
    • Added the graphics_settings_overrides property to ViewerOptions, which allows to replace the values of different graphics settings and features of Horizon (which are otherwise set by the engine according to the selected graphics_level and the hardware used).
    • Imagery raster atlases are automatically compressed before being uploaded to the GPU in order to save video memory. This is triggered when the total amount of available video memory is below 800 MiB, unless the raster_atlas_texture_compression_enabled graphics setting is overriden to false with the graphics_settings_overrides property of ViewerOptions.
    • The CPU-based 3D renderer SwiftShader is now detected and low graphics settings are applied when it is used.
    • Added the force_flat_overlay_render viewer option, which is used for development.
  • Added the desktop-exclusive native_http_referrer viewer option, which sets the value given to the Referer header of HTTP requests made by the native client.
  • Added the SetUserInteractionsEnabled method to ViewerService, which tells the engine whether platfom events should be listened to.
    • This method only affects events related to user interactions (keyboard, mouse and pointer events). Resizing or removing the canvas or window will work as usual.
    • User interactions are enabled by default, unless disable_events_capture was true in the ViewerOptions. In that case, they cannot be enabled.

Changed

  • Polylines
    • Replaced the default_dash_ratio property of FlatOverlayVectorRepr and its associated styling property dash_ratio with the new default_dash_length and dash_length. Dashes are now given an explicit length value, instead of a value relative to the period.
    • Changed the dashes to also be rounded when round_tips is set to true.
  • Vector data
    • Renamed ring_sizes to linestring_sizes in InMemoryVectorFeatureGeometry and EditableShapeGeometry.
    • Changed the parsing of GeoJSON MultiLineString features to produce separate polylines for each linestring, instead of one polyline made of different linestrings joined together.
    • The relevant properties for tiled data, in-memory data, and client data sources have moved into their respective providers instead of being in VectorDataSource.
    • Fetching data from in-memory data layers does not require setting a VectorDataSourceAccess any more.
    • The completion status of vector data downloads is less often checked (i.e. not every frame), freeing some CPU time.
  • Styling
    • Style script functions now accept multiple variable arguments.
    • Style script emit_named and emit_id instructions are now grouped under a unique emit instruction. The emit instruction accepts a string or integer operand.
  • Rasters
    • New raster layers have display bounds encompassing the whole planet, instead of having a zero area.
  • Camera
    • Transitions can now interrupt all other transitions, including uninterruptible ones. This means that the client won’t have to wait for a previous uninterruptible transition to finish before applying a new transition.
    • The accuracy of the polygon given by GetCameraAngularViewpoint has been greatly improved. The returned polygon is now a list of points and some more information aimed at aiding in drawing this polygon on a map.
    • Zoom movements (both instant and continuous) now avoid going under the terrain by approaching the closest scene element instead of the WGS84 ellipsoid.
    • Translation movements now use a frame and a 2-dimensional movement instead of an axis and a 1-dimensional movement.
    • Zooming using a touchpad is now much more precise.
  • Key events associated to the MOD_KEY HrzProtocol.KeyAction are now tracked even when the canvas is out of focus.
  • The desktop build now requires SSE4.1 SIMD instruction set support.

Removed

  • Camera
    • Removed the is_interruptible field from ResetNorthParams. Those animations are now always interruptible.
    • Removed the is_interruptible and animation_options fields from CameraMovement. Movements (both instant and continuous) are now driven by the camera inertia and are always interruptible.

Fixed

  • Rasters
    • Cesium terrain layers determine their bounds with the contents of the available property from the layer.json file instead of bounds, similarly to Cesium.
    • The Cesium terrain tile provider has been made more cache-friendly when multiple URL patterns are used.
  • Vectors
    • Some feature ID requests were never cleaned after they were used, and remained in memory.
    • Fixed impostors being incorrectly baked and rendered when the model wasn’t centered at the origin.
    • Fixed aliasing on flat overlay discs.
  • 3D Tiles
    • Prevented the transient apparition of holes when zooming-in on tilesets containing empty tiles sandwiched between non-empty tiles. (These tilesets rely on Cesium’s non-standard refinement strategy for smooth loading and display.)
  • Fixed setting the orbit camera from bounds being inaccurate when using very large bounds.
  • Windows: Fixed multi-button mouse drag events ending too early when only one of the mouse buttons was released.
  • Fixed the default names given to newly created layers containing an unused null terminator.

Upgrade notes

  • 3D Tiles
    • The 3D Tiles refinement hysteresis is now a property of the layer instead of being hardcoded. The default value is 0, meaning no hysteresis. The previous behaviour can be approximated by using a value of 0.3.
    • The inertia fields of CameraSettings should be set to a positive value. The default value given by Horizon is 0.06. The lower this value is, the stiffer the camera feels.
  • Vectors
    • The new rotation_order representation property of ModelRepr should be set to EULER_ZYX to match the behaviour of previous versions.
    • Dashed polylines, in order to keep the same appearance, should have their property dash_mode in FlatOverlayVectorRepr set to DASH_ENABLED_FILLED, dash_period_unit and dash_length_unit set to DASH_SIZE_IN_METERS, and dash_length set to the product of their previous dash_ratio by their dash_period.
    • Convert all vector data layers to providers. In VectorDataSource, the provider type is determined by the value of the provider_type property, and the configuration of the providers themselves takes place in their respective structure: TiledVectorDataProviderParams, InMemoryVectorDataProviderParams, and ClientVectorDataProviderParams.
  • Styling
    • emit_named and emit_id in style scripts must be replaced by the emit instruction.

Integration notes

  • Adding some hysteresis to the 3D Tile refinement process allows scenes to be more visually stable when the camera moves. It also allows downloading slightly less data.
  • Graphics configuration
    • While the graphics_settings_overrides property of ViewerOptions has been added to provide a more granular configuration of the engine when needed, the graphics_level should be the preferred way of controlling the quality and performance of the engine, and can be seen as safe presets to use. Overriding those settings by yourself can have radical consequences!
    • Note that the graphics configuration of the engine is set only once during initialization, and remains unchanged throughout its execution.
    • Imagery raster atlases are compressed on the GPU when the total video memory is below 800 MiB. This gives significant gains in video memory usage, at the cost of a decrease in image quality and slightly longer loading times. Set raster_atlas_texture_compression_enabled to false in the graphics_settings_overrides property of ViewerOptions at initialisation time if the situation favours image quality and CPU usage instead of video memory usage.

Version 23.1.2 - 2023-06-01

Fixed

  • Fixed a long freeze on iOS and MacOS devices after the engine was initialized.
  • Fixed requests with relative URLs not using the correct base URL. document.baseURI is now used instead.

Version 23.1.1 - 2023-05-04

Fixed

  • Fixed requests with relative URLs not using the current page URL as base.
  • Fixed raster losing precision around the antimeridian.
  • iOS: Fixed rasters lacking precision.
  • iOS: Fixed the screen turning black on some scenes by using the native provoking vertex convention and avoiding a bug in the WebGL-to-Metal translation layer.
  • C++ API: Fixed mutating primitive and enum fields via the path builder API triggering compilation errors.

Version 23.1.0 - 2023-04-06

Added

  • Native HTTP caching
    • Added HTTP caching to the native version, which handles basic caching and validation with ETag and Last-Modified.
    • The web version still uses the browser’s cache.
    • The size of the cache can be configured using the native_http_cache_size field of ViewerOptions.
    • The cache can be cleared using the ClearHttpCache method of ViewerService.
  • Initialisation
    • Shaders required at startup are now compiled across multiple frames. This should prevent web pages from being frozen while the engine is booting. Shader compilation now uses KHR_parallel_shader_compile on browsers that support it to further reduce page freezing.
    • Added a loading screen during startup to give a visual feedback while shaders are being compiled. The loading screen can be disabled in the ViewerOptions with the show_loading_screen parameter.
    • Added MessageType.VIEWER_READY_MESSAGE message that lets the user know when the engine is ready to render scenes.
    • Added MessageType.VIEWER_LOADING_PROGRESS_MESSAGE message that regularly informs the user on how far is the viewer from being ready.
    • Added an option in the ViewerOptions named force_shader_compilation to force the compilation and link of all the shaders during startup. Refer to the documentation for more details.
  • Memory management
    • The max_video_memory_size property has been added to ViewerOptions. It allows limiting how much video memory can be allocated by the viewer.
  • Styling scripts
    • Added a new style script function fmt() providing string formatting. The function uses {fmtlib} under the hood so more information about the format string syntax can be found on their website. Further information about function limitations and its syntax can be found in the documentation in the Styling API section.
  • Monitoring
    • Added the new MonitoringService to control the engine’s monitoring features and access the collected information.
    • Added a name field to LayerCreateInfo. It is an optional string that is only used to identify the layer in the monitoring tools. If left empty, a default name based on the layer’s type will be used.
    • Added the RenameLayer and GetLayer methods to LayerService.
    • The force_render option of ViewerOptions can now be enabled or disabled at runtime using the developer UI, under the Monitoring menu.
  • Added the disable_terrain option to ViewerOptions which disables features related to terrain (raster layers, editable shapes, and flat overlay vector representations).
  • A new WSI is available for Linux: headless EGL. It allows initialising the engine without creating a window. This is useful for integration tests. (User interaction isn’t supported.)

Changed

  • The base video memory usage (i.e. before loading any layer) has been reduced when the quantity of available video memory is low, or when the low or medium graphics levels are used.
    • Imagery raster merge group count, raster atlas sizes, flat overlay texture sizes and cascade count, and shadow map texture sizes and cascade count are now decreased if the quantity of available video memory is low.
    • The actual max screen-space error used for raster layers is now adjusted at runtime. If the raster atlases are too small to contain the list of tiles that should be loaded, the max screen-space error is dynamically increased to reduce the number of requested tiles, and obtain a more uniform rendering of the planet’s surface. (The max screen-space error cannot go below the value set in the scene settings.)
    • Flat overlays may not be drawn as far as the horizon when the camera is near the ground and looking towards the horizon, and the quantity of available video memory is low.
  • Files are now downloaded from a dedicated worker in the web build, freeing the main thread from this task.
  • It is now possible to quit the append mode of the shape editor by clicking on the last point that has been appended. (Or equivalently, by clicking twice when appending a point.)
  • The stability of raster layers has been improved.

Removed

  • Removed the disable_dev_ui option in ViewerOptions. Not providing a KeyBinding for the TOGGLE_DEV_UI KeyAction is enough to prevent its usage.
  • Removed the monitoring_auto_connect and monitoring_server options from ViewerOptions. Their utility lives on with the SetMonitoringServerAddress and ConnectToMonitoringServer methods of MonitoringService.

Fixed

  • Fixed SetOrbit using bounds not working when called just after initializing the engine.
  • Fixed IsWorking() in the ViewerService always returning true when the force_render option was enabled in the ViewerOptions.
  • Fixed downloaded data not freed as soon as it could, needlessly increasing memory usage.
  • Fixed rasters lacking precision on macOS.
  • Fixed palettisation of NaN values in model data textures on some platforms.
  • Fixed incorrect terrain geometry and imagery on some devices.
  • Fixed atmosphere causing incorrect colors on some devices.
  • Fixed planet not being rendered in high settings on some devices.
  • Fixed profiling and metrics data never being cleared when enabled using the dev UI while not connected to the monitoring application.

Integration notes

  • When the value of max_video_memory_size of ViewerOptions is left to its default value (0) on the web, and the viewer is running on a mobile device, an actual value is automatically computed at initialisation time, to avoid out-of-memory situations, which can lead to crashes. The value is determined from the information the browser has on the device, which includes the OS and can include the declared RAM size. Set an explicit value instead if you know precisely how much video can be used on the device.
  • The engine now compiles its shaders across multiple frames. This has the main advantage of letting the browser main thread do some of its work and should reduce frozen pages during Horizon initialisation. The engine emits a message to let users know when it is ready to render.

Version 23.0.2 - 2023-03-06

Fixed

  • Fixed a crash occurring when the camera was set to the “current” viewpoint right after initialization, before the first frame was processed.
  • Fixed handling of zero-width outline distance of clipping planes. This could make layers invisible on some GPUs, even when no clipping planes were defined.
  • Fixed flat shading being randomly applied to glTF models with included normals.

Version 23.0.1 - 2023-02-17

Added

  • The initialisation function of the web build (HrzCoreBackend.init()) now takes a new parameter indicating where the runtime files of the engine can be found.
  • Added the ability to configure the modifier key used in some user interactions. The configuration is done by using the KeyAction viewer option. Events coming from the defined modifier key are consumed by the engine. The key enables alternative camera movements: from panning to rotating when dragging the planet, from orbit rotations to fixed position mode.
  • Flat normals are now automatically computed when glTF models (including those in 3D Tiles) don’t have them, as required by the specification. This fixes shadows and viewsheds.

Changed

  • Major performance improvements on all platforms.
  • The low_graphics field of ViewerOptions has been replaced by graphics_level. This allows setting more quality levels or letting the engine decide what settings to apply.
  • If the properties max_wasm_memory_size, blob_memory_pool_size, and worker_count of ViewerOptions are left to their default value (0) on the web, the initialisation process determines effective values based on the detected platform, instead of fixed values. See the documentation for more details.
  • Capturing the current view is now done asynchronously by calling the ScheduleFrameCapture method of ViewerService and waiting for a frame_capture message from the message queue.
  • 3D tiles
    • Multiple tiles can now be loaded per frame.
    • Download priorities are updated more quickly after the camera moves.
  • 3D models
    • The declared glb file size is checked against the actual size before attempting to decode the file.

Removed

Fixed

  • Vectors
    • Fixed a crash when selecting the last feature of a tile in a vector layer with extruded or flat overlay representations.
    • Fixed a crash that could happen when loading vector features.
    • Fixed an error when loading polylines from MVT files that created many duplicated features.
    • Fixed a crash when filtering text representations.
  • 3D models
    • Errors while loading glTF models are now tracked more closely. This allows not having gaps in 3D Tiles layers when some tiles cannot be loaded. (When there isn’t enough memory for example.)
    • Fixed loading textures for tiles that only have WebP textures.
    • Fixed the implementation of the glTF WebP extension so that its uses the WebP texture and not the JPEG or PNG texture when both are present.
  • Fixed Web Mercator raster tiles not being joined correctly.
  • Fixed terrain shading not being accurate at low sun angles.
  • Fixed atmosphere not rendering on Android devices.

Upgrade notes

  • Calls to the FrameAndCapture method of ViewerService must be changed to calls to ScheduleFrameCapture, followed by checking the message queue for a frame_capture message. Note that it is necessary to let the engine run normally to eventually receive a result.
  • The low_graphics field of ViewerOptions has been replaced by graphics_level. Set this value to High to match low_graphics = false. Set this value to Low to match low_graphics = true. Using Auto is recommended unless you want a specific features set. Medium offers a good compromise between performance and quality.
  • The Ctrl key used to activate alternative camera movements can now be remapped to any key. In order to preserve the previous behaviour, the key Ctrl must be mapped to the KeyAction MOD_KEY in the ViewerOptions.

Integration notes

  • If the web runtime files (hrz_core.js, hrz_core.worker.js, and hrz_core.wasm) are not located in the same directory as the page’s HTML file, use the runtimeFilesBaseUrl parameter of HrzCoreBackend.init() to indicate where they can be found. This URL can be relative to the current page’s URL.

Version 23.0.0 - 2023-01-20

Added

  • Memory management
    • The maximum amount of memory that a web instance is allowed to use can be configured in ViewerOptions, with the max_wasm_memory_size property.
    • Allocation of resources (images, meshes, etc.) is now made in a dedicated memory region. These allocations are called blobs. The amount of memory dedicated to blobs (internal memory chunks mostly corresponding to external resources that are loaded by layers) is configurable in the ViewerOptions, with the blob_memory_pool_size property. A larger amount allows loading heavier scenes, but at the expense of increased memory usage.
    • An option to allocate blobs using the system allocator (i.e. malloc) has been added in the ViewerOptions: use_system_allocator_for_blobs.
  • Styling scripts
    • Added the mod operator to compute integer or floating-point division remainder in value expressions.
  • 3D Tiles
  • Interactions
    • Gizmo components can now have a larger interaction area while having the same rendered size. This is particularly useful on touch devices where it can help interacting with the gizmo. See GizmoLayer for more details.
    • Added support for touch pens.
    • Parameters for showing a line when translating a gizmo along an axis have been added to GizmoLayer.
    • It is now possible to specify which raster layers should be checked during picking in the PickScreen method of ViewerService.
    • Added the FetchRasterData method to ViewerService to fetch precise data from a list of raster layers at a given world position.
      • This method does not require tile caches for the providers, unlike the other picking methods.
      • The data will always be fetched from the tiles with the highest LOD, which makes the operation more expensive than the other picking methods.
  • Blend modes
    • New blend modes have been introduced: multiply, screen, and overlay.
    • A blend mode can be selected for single model layers and 3D tiles layers (in MaterialProperties), as well as for vector tiles layers’ sprite and 3D model representations, with the feature_color_blend_mode property which controls the way feature colours are blended with the source texture.
    • Along with the blend mode, the new feature_color_blend_strength property controls the intensity of the colour blending.
  • Features
    • Feature IDs of vector tiles can be loaded as regular attribute values, by setting the is_source_feature_ids of VectorAttribute to true.
    • Vector tile features styling does not rely on IDs anymore. However, picking, selection, highlighting, and combining data from multiple sources are still not possible without IDs.
  • Rasters
    • ArcGIS raster layers with the “mixed” image format are now supported. They use a combination of JPEG and PNG images.
    • Tiles at levels below “minLOD” and above “maxLOD” are not requested when these properties are defined on the ArcGIS server. (Even if the “tileInfo” object has entries for such levels.)
    • URL query parameters can now be preserved when requesting ArcGIS raster images.

Changed

  • Horizon now uses calendar versioning: version numbers use the year and quarter of release.
  • Memory and threading
    • The web build now uses shared array buffers and atomics in order to have better threading support and enhance running performance.
    • The files of the web version of Horizon are now hrz_core.js, hrz_core.worker.js, and hrz_core.wasm.
  • Interactions
    • The argument given to the PickScreen method of ViewerService is now a PickRequest object instead of a Vec2ui.
    • Raster layers are now excluded from the picking process when their handles are not passed to the PickScreen method.
    • The position and geo_pos fields of PickResults and MouseHoverInfoMessage can now be undefined, meaning that the mouse was hovering nothing.
  • Features
    • Vector tile and 3D Tiles features are not identified with a 32-bit integer value anymore, but with a tuple of any number of attribute values, of any types. Feature IDs are now declared by listing the attributes that constitute the ID for each layer. (feature_id_attributes in VectorDataLayer, is_feature_id in InMemoryAttribute and ThreeDTileAttribute.)
    • In-memory layer attribute values are now declared alongside their corresponding features.
    • Attribute value request messages now give a list of attribute values for each feature, identifying them according to the feature ID declaration of the layer.
    • A response to an attribute value request message must include a value for each requested feature ID, in the same order as in the request message.
    • Picking results, as well as selection messages, now identify features by a tuple of attribute values.
    • Attributes of 3D Tiles layers now have a source field, that takes a ThreeDTileAttributeSource enum value. It replaces the from_vector_data_layer field of ThreeDTileAttribute.
    • The SelectObjects, DeselectObjects, and DeselectAllObjects methods of ViewerService have been renamed to, respectively, SelectFeatures, DeselectFeatures, and DeselectAllFeatures. The ObjectReferences message has been replaced with FeatureReferences.
  • Gizmos
    • The size of a gizmo can now be defined in meters or relative to the screen size using its new size_unit property (See UiSizeUnit).
      • This also applies to the Line and Grid shown when translating a gizmo and displaying a clipping plane, using their extent_unit property.
    • The lines and grids shown during a translation now keep their correct orientation when the translation happens at a high altitude.
  • Rasters
    • Matching the image format specified in the model of ArcGIS layers with what is available on the server is now done without taking case into account.

Removed

  • The blend mode property for raster layers is gone. The “normal” blend mode is now always used.
  • The fields id_field_name of VectorDataSource and id_attribute_name of ThreeDTilesLayer have been removed as now feature IDs are made from regular attribute values.
  • The field has_feature_ids of VectorDataSource has been removed. This information is now deduced from the attributes declarations.

Fixed

  • Fixed editable polyline shapes being invisible on some devices.
  • Fixed incorrect flat overlay polylines width when specifying a width in pixels on some devices.
  • Fixed the ResetNorth method of CameraService moving away from the set target of a camera in fixed target mode.
  • Fixed coordinate parsing of Geobuf multilinestrings and multipolygons.
  • Fixed the IsWorking method of ViewerService returning false when only one out of multiple single models layers was ready.
  • Fixed the delay before being able to move a gizmo on touch devices.

Upgrade notes

  • Geographics coordinates
  • Blend modes
    • Single model layers and 3D Tiles layers’ material properties, as well as vector tiles layers’ sprite and 3D model representations should have their feature_color_blend_mode field set to BLEND_MULTIPLY and feature_color_blend_strength to 1.0 in order for the feature color to be applied in the same way.
  • Interactions
    • The Vec2ui that was previously given to the PickScreen method of ViewerService must now be passed through the coords field of a PickRequest object.
    • Raster layers are now excluded from the picking process by default. The ones that should remain included must have their handles passed using the included_rasters field of PickRequest.
  • Features
    • Ensure that attributes that form feature IDs are declared as such whenever IDs are necessary. (That are not necessary if combining multiple data sources and neither picking nor selection are needed.)
    • If you relied on the fields id_field_name of VectorDataSource or id_attribute_name of ThreeDTilesLayer, declare regular attributes for them, and use these attributes in feature IDs.
    • Ensure that responses to attribute request messages list their values in the same order as the incoming requests.
    • Replace the calls to the SelectObjects, DeselectObjects, and DeselectAllObjects methods with their corresponding new versions: SelectFeatures, DeselectFeatures, and DeselectAllFeatures.
  • Size units
    • The size_unit field of the gizmo layers should be set to UI_SIZE_IN_PIXELS to keep their previous behaviour.
    • The references to the enum PolylineSizeUnit must use its new name InWorldSizeUnit. Its values LINE_SIZE_IN_METERS and LINE_SIZE_IN_PIXELS must be replaced with IN_WORLD_SIZE_IN_METERS and IN_WORLD_SIZE_IN_PIXELS.
    • The references to the enum SizeUnit must use its new name SymbolicSizeUnit. Its values SIZE_IN_METERS, SIZE_IN_PIXELS and SIZE_RELATIVE_TO_IMAGE must be replaced with SYMBOLIC_SIZE_IN_METERS, SYMBOLIC_SIZE_IN_PIXELS, and SYMBOLIC_SIZE_RELATIVE_TO_IMAGE.

Integration notes

  • Shared array buffers and atomics have been added to the requirements for running Horizon in a web browser.
  • The HTML file of the page containing the Horizon instance, as well as hrz_core.worker.js, must be served with the COOP and COEP headers. The values must be respectively same-origin and require-corp.
  • All the files (web pages, Horizon files, scene data files) must be served with the HTTPS protocol.
  • The max_wasm_memory_size setting in ViewerOptions can be used to limit the memory usage of the Horizon instance on the web. The value can be adapted according to the device which is being used. A combination of 200 MiB for blob_memory_pool_size and 600 MiB for max_wasm_memory_size should be suitable for typical mobile devices. (Note that Safari allocates all max_wasm_memory_size at startup, and therefore requires that the system have enough RAM for this. Other browsers reallocate as needed, and support a value of up to 4 GiB for max_wasm_memory_size, even if the system does not have that much RAM, as long as the effectively used memory fits the RAM.) The default values are suitable for a desktop environment.

Version 0.15.1 - 2022-10-21

Fixed

  • 3D Tiles
    • Fixed client-provided attributes not being applied correctly when multiple batches used the same feature ID in a single tile.
    • Fixed selection not working when multiple batches used the same feature ID in a single tile.
  • Shape editor
    • Fixed not being able to interact with editable shapes through touch events.
    • Fixed geometry update messages not being sent before mode switch messages when appending a position to a point editable shape.
  • Fallback to the actual GeoJSON ID field when the attribute for ID values that has been specified doesn’t exist.

Version 0.15.0 - 2022-10-06

Added

  • 3D models
    • Added support for multi-texturing on single models and 3D Tiles.
      • Two materials can be displayed at once.
      • The opacity of the top material can be changed.
  • Vectors
    • Vector data can now be loaded from Geobuf files.
    • GeoJSON files with Feature or Geometry root objects are supported.
    • The GeometryCollection GeoJSON geometry type is supported.
    • A background rectangle can now be displayed under text representations.
      • It can have configurable rounded corners and padding.
      • Its color can be set per instance.
      • See TextVectorRepr for more information.
  • Rasters
    • The tile cache size can now be configured instance-wide, with an override for each provider.
  • Editable shapes
    • Added the “point” editable shape geometry type. It limits the shape to a single position.

Changed

  • Vectors
    • The bounds and zoom levels set on VectorTilesSource are only used if override_bounds and override_levels, respectively, are set to true. Otherwise the values from the vector data layer are used.
    • GeoJSON features with no ID are now loaded with ID 0, instead of being skipped.
    • Use the value from the attribute named id_field_name and not the regular feature ID when id_field_name has been set.
    • Put tiles with client-provided attribute values in error state if the client does not respond within five seconds of a request, or if it responds with values of a wrong type.
    • Do not reload geometry tile files when client-provided attribute values are invalidated.
  • Rasters
    • The special case for empty display bounds has been removed. Settings to bounds to ((0, 0), (0, 0)) will prevent the raster from being displayed altogether. In order to display a raster on the whole planet, use ((-180, -90), (180, 90)) as display bounds.
    • The default tile cache size for providers is now 0 tiles instead of 150.
    • Keep terrain raster tiles in cache when the camera has just moved away from them, as they may be needed soon after.
    • The default max screen-space error for rasters has been changed to 2.0 (from 1.33).
  • Mouse hover info and highlight now request less picking frames.
  • HTTP range requests are now used when redownloading part of a glTF model data. This decreases the amount of data transfered over the network.
  • On Windows, the system’s CA store is now used instead of the one shipped with libcurl.

Fixed

  • Vectors
    • Fixed feature attribute handling when more attribute values were received than there are features in a given tile. It could lead to inconsistent values used for styling, or crashes.
    • Fixed vector tile layer update when adding a feature in a in-memory vector data layer that is used by a vector data layer in which all attributes get their values from the client.
    • Fixed sprites being invisible when their color’s alpha was < 0.5.
    • Compute the centroid’s Z coordinate of vector features from in-memory layers.
    • Fixed selection not working on text and instanced model representations emitted multiple times for the same feature.
  • Rasters
    • Fixed incorrect tiles when updating the palettized raster provider’s palette multiple times in a short time span.
    • Prevent orphaning jobs when updating a palettized raster provider.
    • Fixed releasing terrain raster tiles in some cases when they are no longer needed and the cache is full, as they would gradually accumulate in memory.
    • Fixed ArcGIS imagery requests not using the ’transparent=true’ query parameter with PNG formats.
  • Editable shapes
    • Fixed crash when pressing the delete key while appending a point to an editable shape.
    • Prevent moving another point after deleting a point that is being dragged.
    • Prevent starting unexpected point drag operations after switching modes or selection.
    • Prevent deleting a mid-point control point, as it makes no sense, and deleted another point instead.
    • Return an index when querying the index of the currently selected control point, and a mid-point control point is selected.
    • Appending a point to an editable line containing only a single position has been made possible.
    • Corrected the geographical length of simple lines when more than two positions are set in the model.
    • Send a geometry update message only once when appending a point to a shape.
    • Do not send a redundant geometry update message before the mode switch message when transitioning to append mode.
    • Send update messages in the correct order (geometry update then mode switch) when a line has been completed and cannot be appended to any more.
    • Fixed the ring size values when the user is appending a new point to a polygon using the mouse with the shape editor.
  • Fixed camera becoming tilted after zooming with tactile input.
  • Fixed data textures (with format R_F32_SILICIUM) not being loaded properly from WebP files.
  • Fixed Horizon not running on Safari on macOS.
  • Actually use smaller index data type for Draco meshes when possible.
  • Fixed the is_working state getting stuck to true when a single image raster couldn’t be decoded. (For example, if it was too large.)

Upgrade notes

  • The default max screen-space error for rasters has been increased, i.e. the terrain is (by default) a bit less detailed, in order to download fewer tiles. If you were using the default value, and want to preserve the previous level of detail, explicitly set the value in RasterSettings.
  • Use display bounds of ((-180, -90), (180, 90)) in order to display rasters on the whole planet.
  • Set the override_bounds and override_levels properties of VectorTilesSource to true if values that are more restrictive than what is set in the vector data layer are set to bounds and min_level/max_level, respectively.
  • The active_material property of SingleModelLayer and ThreeDTilesLayer must now be set in material_properties.base_material.
  • In order to preserve the previous terrain raster tile cache sizes, set the default size to 150 in the viewer options. However, in web environments a size of 0 is usually better, thanks to the browser’s cache.
  • Since picking uses cached raster tiles, keep the tile cache size at a value around 150 for layers you want picking for.

Version 0.14.2 - 2022-08-24

Fixed

  • Fixed a crash when restyling 3D Tiles datasets containing external tilesets.
  • Fixed glTF with embedded resources not being able to be loaded.
  • Fixed a crash during elevation queries when using a DTM raster with deferred geometry settings.
  • Vectors
    • Fixed the 3D model representation of vector tiles switching to impostors too early when using a single level of detail or when using an in-memory data source.
    • Fixed a crash that could happen when updating then immediately destoying sprite and stem representations.

Version 0.14.1 - 2022-07-18

Changed

  • Mouse hover info and highlight now request less picking frames.

Fixed

  • Fixed exceptions triggered on mouse hover in web contexts after re-creating a Horizon instance.
  • Fixed flat overlay features not updating with mouse hover highlight.
  • Fixed visibility constraints not updated immediately for flat overlay representations.
  • Fixed ArcGIS imagery requests not using the ’transparent=true’ query parameter with PNG formats.
  • Removed useless source files that were included in the npm packages and that created issues for downstream consumers.
  • Fixed the “base64” scene dump functions not being exposed despite it being advertised in the 0.14.0 changelog for the TypeScript library.

Version 0.14.0 - 2022-06-30

Added

  • Added the value of data textures to the picking result of single models and 3D Tiles. See the data_texture_value field of SingleModelPickingResult and ThreeDTilesPickResult.
  • The width of flat overlay polylines can now be expressed in meters or pixel using the line_width_unit field of FlatOverlayVectorRepr.
  • The query parameters of the layer data descriptor’s URL can now be preserved and passed along when requesting tiles for 3D Tiles, Cesium terrain, and TMS raster layers, as well as external data for 3D models.
  • Events
    • Key bindings for actions such as re-orienting the camera, toggling the development UI or deselecting all the features can now be specified in ViewerOptions. See KeyAction for the full list of key-bindable actions.
    • Added ToggleDevUi and MoveDevUiToCursor methods to ViewerService to open and move the development UI programmatically.
    • Added a DeleteSelectedControlPoint method to ShapeEditorService.
    • Added a ResetNorth method to CameraService to reorient the camera towards the north pole in accordance with the manipulator used.
  • Rasters
    • The image format can now be specified for ArcGIS raster layers that use the “export image” service.
    • Added jpgpng to the list of supported image formats for ArcGIS raster layers.
  • The GPU resources in the dev UI now have some metadata associated, such as their source URL, or their pixel size for images.
  • Added a new SceneDumpService with two methods (DumpScene and LoadDump). This service can be used to dump the entire scene model and state of the engine, and restore it later. This is mainly used for debugging and sharing scenes between developers. Do not use this as a user-facing format.

Changed

  • Events
    • Actions triggered by key presses, such as ‘R’ to reorient the camera or ‘P’ to toggle the development UI, are no longer set by default but need to be specified in the ViewerOptions.
    • Web: Keyboard events that are not used by the engine are not captured anymore.
  • Scene dumps TypeScript library
    • This library is now just a façade in front of the SceneDumpService. It can be used to dump and load scene dumps in three formats: JSON, binary, or base64.
    • The old JSON scene dumps are no longer supported.
    • The binary and base64 formats can be migrated to future versions of the engine, JSON ones cannot (not easily anyway).
    • The base64 format is the same as binary, but encoded as base64.
    • The Sync versions of the scene dump library functions no longer return a Promise.
  • Internals
    • Decreased the video memory consumption of vector tile layers.
    • Desktop: File download requests are now immediately halted when they are cancelled.
    • Web: Upgraded Emscripten to version 3.1.10.
  • The release and debug variants of the C++ packages are now shipped in a single archive.

Removed

  • Removed the emit instruction from styling scripts. It had been deprecated in version 0.13.0.
  • Removed gsl-lite dependency from the public C++ API.

Fixed

  • 3D Tiles
    • Fixed HTTP headers not being used to load resources of external tilesets.
    • Fixed clipping plane ID and lighting settings updates not being applied to external tilesets.
    • Alpha values now map to transparency when palettising data textures on 3D models.
    • Fixed 3D models with absolute paths not being reloaded with the correct URL.
    • Fixed 3D Tiles not being restyled when changing their styling script if the layer had been initialized with an empty script, and is using a vector data layer source for its attributes.
  • Vectors
    • Fixed the orientation of impostors when viewed from above.
    • Fixed impostors leaking memory.
    • Fixed instanced models primitives having wrong transformations.
    • Prevented unnecessary redraws when flat overlay layers are or have been present in the scene.
    • Fixed the visibility of flat overlay features not updated when the visibility of their parent layer changed.
    • Fixed a crash when loading vector tile data, that could happen on some platforms.
  • Camera
    • Prevented the camera from getting irremediably stuck when setting it to an angular viewpoint with the default values (all zeroes).
    • Web: Fixed programmatic camera movements not working with the fixed target and fixed position manipulators.
  • Rasters
    • Fixed loading Cesium terrain tile layers whose URLs have query parameters.
    • Fixed ArcGIS raster layers IDs not taken into account by the ArcGIS raster provider when set in the model.
    • Restored the ability to load ArcGIS raster layers whose descriptor has no supportedImageFormatTypes field.
    • Fixed raster settings not updating when set in a single API call.
  • Web: Fixed an object iteration error in the assets loading library.
  • Fixed the viewshed frustum having an incorrect field of view when using low aspect ratios.
  • Fixed ambient lighting updating too late when the camera is not moving.
  • Fixed ViewerService.IsWorking() not accurately reflecting the state of raster and vector layers.
  • Fixed touch gestures being broken after using the dev UI.

Upgrade notes

  • Keys that trigger actions, such as ‘P’ for the development UI, must now be explicitly passed in ViewerOptions.

Integration notes

  • Prefer binary or base64 scene dumps to JSON ones, because they can be migrated to future versions of the engine.
  • The emit instruction can no longer be used. Use emit_id and emit_named instead.

Version 0.13.0 - 2022-03-31

Added

  • 3D Tiles
  • Rasters
    • Raster layers now have a “display bounds” setting, a bounding-box that allows restricting where rasters are displayed.
    • Added an option for ArcGIS raster provider to ignore the reported bounds (extent) of the layer. This can be used for layers where symbols go outside the bounds, or when the reported bounds are incorrect.
    • WMTS and WMS rasters can now be palettised. (If their images are in the right format.)
    • ArcGIS MapService rasters supporting the “export image” operation, but not the “export map” operation can now be loaded and displayed.
    • The desired source image format can now be specified in the configuration of WMTS, WMS, and ArcGIS raster providers. If the field is left blank, an image format is selected automatically.
    • Cesium terrain tiles can now be used as data source for DTM layers, using the dedicated CESIUM_TERRAIN_PROVIDER raster provider.
  • Horizon now only draws new frames when the visual contents have changed. This allows for a decrease in power consumption for most uses.
    • A new startup option has been added to deactivate this (i.e. to force drawing every frame).
  • A grid can now be displayed when translating a gizmo along a plane. It can be configured using the grid field of GizmoLayer.
  • Each representation now has a mandatory id field that must be unique to the layer. This ID is now used with the emit_id instruction instead of the index of the representation.
  • The background color of the planet can now be changed using the terrain_color field of TerrainSettings, which is part of SceneViewSettings.

Changed

  • Rasters
    • The property layersIds on ArcGisRasterProviderParams has been renamed to layerIds.
    • Pre-generated ArcGIS raster tiles are now used for layers that are neither in Web Mercator nor latitude-longitude.
    • When no layer name is given in the configuration, all layers in a WMTS service are checked for displayability instead of only the first one.
    • Fewer raster tiles are now downloaded for non-Web-Mercator rasters. (Less than half, usually.)
  • Vectors
    • The name of each VectorRepr is now optional but can still be used with the emit or emit_named instructions.
    • Representations now respond correctly to add, remove, and update notifications such that only the ones that have been modified will be updated.
    • When a representation is updated, the previous version of it now remains visible until the new one has been baked.
    • Made the distance function for vector tiles more precise. Screen-space error values for vector tiles are now closer to those of raster layers.
  • UI elements (clipping plane grids and gizmos) now use enhanced techniques to properly handle transparency. This mode is disabled when low_graphics mode is enabled.
  • The mouse pointer can now leave the canvas (or window) without interrupting ongoing drag operations.

Deprecated

  • The emit instruction in styling scripts has been deprecated and should be replaced by emit_named. It will be removed in a later update.

Removed

  • Removed the prioritize_lossless_images parameter from the configuration of WMTS, WMS, and ArcGIS raster providers.

Fixed

  • Rasters
    • Fixed loading ArcGIS raster tiles when the levelValue property is present.
    • Do not load pre-generated ArcGIS raster tiles when a layer ID list has been provided (as they wouldn’t contain the correct layers).
    • Fix potential crash when loading a WMS layer.
    • Fixed empty raster tiles after switching layer visibility on and off.
    • Avoid overloading the system with tile requests when viewing a raster layer with a high min level from afar. This could lead to crashes.
  • 3D models & 3D Tiles
    • Fixed 3D Tiles not displayed when they should have been, after moving the camera.
    • Fixed a crash when glTF (including 3D Tiles) with templated materials are destroyed.
    • Fix glTF parsing errors, that could lead to a crash.
    • Fix colours when loading glTF model textures with an alpha channel in the browser.
  • Fixed intersecting clipping planes hiding each other.
  • Fixed a crash when dragging gizmos on a device with touch input.
  • Fix small impostor grid sizes that lead to an empty impostor texture.

Upgrade notes

  • 3D Tiles
    • The data_texture_palette field of ThreeDTilesLayer has been removed. Its value must be specified in a Material in the materials field.
    • The name of the material containing the palette must be set in the active_material field for it to still be applied to the model.
  • Rasters
    • Set the layer ID list on ArcGisRasterProviderParams structures with the layerIds property instead of layersIds.
    • If the prioritize_lossless_images parameter of the configuration of WMTS, WMS, and ArcGIS raster providers was used with the aim of requesting PNG images with transparency, specify an image format with the expected characteristics explicitly instead, using the source_image_format parameter.
  • The id field of each VectorRepr must be filled with a unique ID per layer.
  • The emit instruction in styling scripts should be replaced by emit_named. When possible, it is even better to use emit_id.
  • The terrain_color field of TerrainSettings in each SceneViewSettings should be set to r = 0, g = 0, b = 1, a = 1 to match the previous color.

Integration notes

  • Native packages are now published in two variants: “release” and “debug”.
  • Forcing every frame to be fully drawn should not be necessary, especially given that it significantly increases the power consumption. Use this option only when encountering bugs that prevent the canvas from being refreshed when it should.
  • Using emit_id instead of emit (or emit_named) in styling scripts is now recommended, although the latter is better for readability.

Version 0.12.2 - 2022-02-28

Added

  • Events
    • Added a new ViewerService.SendEvents method to send events (keyboard, mouse, touch, etc.) directly to the engine from the integrating application.
    • Added a new disable_events_capture option in ViewerOptions that can be used to disable all events being captured from the engine. In this case it is necessary for the integrating application to handle those events, and to send them to the engine using the SendEvents method.

Changed

  • C++ bindings
    • hrz_core::Backend and hrz_api::Api are now both instantiated using their static create method. Their constructor is now private.

Fixed

  • C++: Fixed missing scene model accessor methods that prevented manipulating primitive types.

Version 0.12.1 - 2022-02-21

Added

  • Added new color interpolation modes to numeric palettes.
  • Added an option for ArcGIS raster providers to ignore the reported bounds (extent) of the layer. This can be used for layers where symbols go outside the bounds, or when the reported bounds are incorrect.

Changed

  • Tile Map Service raster providers with no profile will now fail to load.
  • The OSGEO:41001 SRID is now accepted. It is an alias of EPSG:3857.

Fixed

  • Fixed flat overlay features disappearing when the camera was really far from the planet.
  • Fixed flat overlay polylines sometimes appearing on the other side of the planet at low level of details.
  • Fixed z-index not being respected between texts and sprites at some camera angles.
  • C#: Fixed an object pinning exception during the Core backend initialization.

Upgrade notes

  • All numeric palettes should set their interpolation_mode field to PERCEPTUAL_OKLAB to match the 0.12.0 behaviour.
  • All numeric palettes should set their interpolation_mode field to SRGB to match the pre-0.12.0 behaviour.

Integration notes

  • Integrating applications should strive to use the OkLab color interpolation mode for all numeric palettes since it’s the most visually intuitive.

Version 0.12.0 - 2022-01-07

Added

  • 3D models
    • Single model layers can now define and use multiple materials.
      • The KHR_materials_variants extension is now supported, allowing multiple materials to be defined by a glTF model. The variant_name field of a Material can reference such variants to switch between them at runtime.
      • The SIRADEL_templated_image_url extension is now supported, allowing glTF models to reference images using templated URLs that can be defined at runtime. Such templated URLs can be declared through the urls field of a Material.
      • The SIRADEL_data_texture extension is now supported, which allows glTF models to use textures containing scalar values than can be colorized using a palette defined in the data_texture_palette field of a Material.
  • Rasters
    • WMTS layers can now be displayed. The URL to the capabilities XML document, a layer name, and optionally a style name, are needed to configure the provider. See WmtsProviderParams for more information.
    • WMS layers can now be displayed. Server-side layer composition, style selection, custom background colour, and additional dimensions are supported. See WmsRasterProviderParams for more information.
    • Added ArcGIS provider for imagery rasters. Two configurations can be used whether the user wants to use pre-cached tiles when possible or use the on-the-fly service. Both configurations only work when using either the WGS84 (EPSG:4326) or web Mercator (EPSG:3857) coordinate systems. See ArcGisRasterProviderParams for more information.
    • tilemapresource.xml files where each zoom level has a different base URL are now supported.
    • The zoom level offset can now be explicitly set for local tiling schemes.
  • Shape editor
    • Added a new shape type: line. It is a single segment line.
    • Length, bearings, angles, and areas can be queried for an editable shape.
    • Colour and line width when the shape is selected can be decided for each shape.
    • Colours of controls points can be set for each shape.
    • Midpoint control points can be hidden.
    • Control points can be shown even when the shape is deselected.
    • A new setting has been added: it allows the user to be notified of geometry changes when a point is being appended or dragged.
    • Enable exiting append mode with a right click.
  • Feature highlighting
    • Added a built-in system to highlight features when hovered.
    • It is enabled by calling the ConfigureMouseHover method of the ViewerService. Its update rate can be configured the same way.
    • The highlight colour can be configured using the mouse_hover_highlight_color field of the HighlightSettings field in the scene view settings.
  • Clipping planes can now be visually represented by a grid. The grid colour and size are configurable.
  • 3D Tiles layers can now use in-memory vector data layers as a source of attribute values.
  • An empty mouse hover info message is now sent when the mouse cursor leaves the canvas.
  • Add third party licenses to delivered packages and documentation.

Changed

  • Rasters
    • Tile Map Service (TMS) raster layers (i.e. using a tilemapresource.xml file as input) are now their own RasterProviderType: TMS_PROVIDER.
      • When their model is dumped, these layers now remain defined as TMS raster layers, instead of switching to a tile URL pattern.
    • The source_type field of the TiledImageRasterProviderParams structure has been removed, as now raster layers with a TILED_IMAGE_PROVIDER can only use a tile URL pattern.
    • Imagery rasters are now visible in all scene views by default.
  • Shape editor
    • Surfaces of degenerate polygons are no longer drawn, as they were incorrect.
    • Switching from append to select mode now removes the point under the mouse pointer.
    • The click target of control points has been made bigger than their visual representation.
  • Palettes
    • Numeric palettes are now interpolated using the Oklab colour space. This should result in more visually pleasing gradients.
    • All colour points of numeric palettes now behave the same way.
      • Previously the last colour point used its first colour when the palettised value was equal to its value.
      • Now it uses its second colour like all other colour points.
  • Mouse hover info
  • Vectors
    • High resolution vector tiles are loaded before low resolution ones. High resolution tiles cover a smaller geographical area, but are usually closer to the centre of the screen, and have a bigger impact on the view.
    • Flat polylines with non-round tips are now anti-aliased.
  • Shadows now look softer.
  • All bearing values are now increasing in a clockwise direction.
  • Updating HTTP headers no longer re-downloads data.

Fixed

  • Shape editor
    • A mouse button press and release event pair was considered as a click even if the mouse had moved in the meantime, as long as the button event positions were close enough.
    • Points could be dragged using the right mouse button.
  • Vectors
    • Fixed the order of “special attributes” computed at runtime (feature type and centroid Z component) being incorrect.
    • Made vector tiles not reload their geometry when client-provided attribute values are invalidated.
    • Fixed visual artifacts when viewing flat overlay polylines from far away at specific angles.
  • Fix 3D Tiles attributes invalidation.
  • Fixed glTF models material color being interpreted as sRGB instead of linear RGB.
  • Fixed shadows and flat overlay not being displayed on some Intel GPUs.
  • Fixed raster layer groups getting stuck when one provider was in an error state.

Upgrade notes

  • Rasters
    • Raster layers using a TILED_IMAGE_PROVIDER with a FROM_TILEMAP_RESOURCE source_type must now use a TMS_PROVIDER.
    • The source_type field of remaining TILED_IMAGE_PROVIDER raster layers should no longer be defined.
  • Mouse hover info
    • Calls to the EnableMouseHoverInfoMessages method of the ViewerService should be replaced with calls to ConfigureMouseHover.
    • Its former boolean parameter is now the enable_info field of MouseHoverConfiguration.
    • The info_rate_ms field should be set to 250 ms to match the previous behaviour.
  • Scene view settings
    • Multiple fields of the HighlightSettings have been renamed: color, outline_alpha, outline_size, and occlusion_alpha are now prefixed with selection_. Their meaning remains unchanged.
  • Camera
    • All bearing values must be reversed.

Integration notes

  • Using the mouse hover information and highlighting system is the preferred way of adding these high frequency interactions features to an integrating application because it is optimised for high frequency update, and does not require a round-trip through the application. Using the picking system is discouraged for these interactions because it is a heavier workflow that is aimed at retrieving the maximum amount of information instead of being fast.
  • The rate of mouse hover highlighting and info messages can be set fairly high but there is an upper limit of 30 updates per second (about 33 ms).

Version 0.11.1 - 2021-10-28

Fixed

  • Fixed HTTP headers not being taken into account when using a tilemapresource.xml source in a tiled palettized image provider.
  • Fixed impostor models looking too dark when lighting was enabled.
  • Fixed editable shape drawing order not always respecting z-index.

Version 0.11.0 - 2021-10-07

Added

  • Multiview
    • Each scene view can now use a different camera, making it possible to view the scene from different points of view.
  • Vectors
    • For polylines in flat overlay, the period and ratio of the dashes can now be set per instance using the dash_period and dash_ratio properties in the styling script.
    • The altitude offset of extruded vectors can now be set per instance using the altitude_offset property in the styling script.
    • The type of a feature can be provided to the styling script as an attribute using the feature_type_attribute_name field of VectorTilesStyle.
  • Lighting
    • Lighting and shadow casting can now be disabled on the terrain from the scene view settings.
    • Lighting and shadow casting can now be disabled individually for single model layers, vector tiles layers, and 3D Tiles layers.
    • Lighting and shadow casting can now be disabled individually for extruded geometry, cylinder, and instanced model vector representations.
    • On any scene element, lighting will be enabled only if all enable_lighting parameters are set to true all the way up the hierarchy, including in the ambient settings of the scene view.
    • On any scene element, shadow casting will be enabled only if all enable_shadows parameters are set to true all the way up the hierarchy, including in the ambient settings of the scene view.
  • A new layer type: EDITABLE_SHAPE, and a new service: ShapeEditorService, enable drawing polylines and polygons on the planet’s surface. This can be used by the client to implement edition capabilities for vector layers.
  • Add a new API in the CameraService for simpler camera movements. This can be used when creating a UI for camera manipulation or binding keys to some movements.
    • Add the ability to translate, rotate and zoom by fixed steps.
    • Add the ability to translate, rotate and zoom continuously. See continuous movements in the CameraService.
  • New emit_id instruction in styling scripts: it can emit a representation based on its id using a dynamic value expression.
  • New startup option low_graphics: it reduces the GPU load by disabling shadows and atmosphere rendering.
  • Add GPU monitoring on developper UI for desktop and web (only Chrome supports it for now).
  • Data URLs are now supported on desktop platforms.

Changed

  • Flat extruded polygons will now appear double-sided when their extrusion is null.
  • Shadows are now automatically disabled when lighting is disabled in the scene view settings.
  • The threshold for impostors is now defined as a size in pixels on screen instead of a distance to the camera.
  • In styling scripts, emit can now use a dynamic value expression for the name of the representation to emit.
  • Rasters FailurePolicy has been replaced by MissingTilePolicy, which is now specified inside raster providers.
  • Decreased jitter of vector feature representations for low-zoom-level tiles, containing data that covers only a comparatively small geographical area.

Fixed

  • Fixed angular viewpoints being very imprecise at high altitude.
  • Fixed animation offset when rotating around a target point.
  • Fixed the appearance of the South Pole when drawing raster layers. The blue region has been replaced by a streching of the southernmost tiles.
  • Fixed 3D models with negative scale factors or left-handed reference frames not being backface-culled correctly.

Upgrade notes

Version 0.10.1 - 2021-08-06

Added

  • Added a new API to invalidate (and subsequently reload) attribute values that have been provided by the client.

Changed

  • The default clipping plane ID of vector tiles and 3D tiles layers is now -1.
  • Using an undefined clipping plane will now have the same effect as not using one at all.

Fixed

  • Fixed a crash when updating an in-memory vector source layer with no features.
  • Fixed a crash when setting a ring size larger than the point count on a polygon of an in-memory vector source layer.
  • Fixed nested if-blocks in styling scripts wrongfully preventing some vector layer representations from being emitted.
  • Fixed large artifacts when displaying flat overlay polylines with lots of microsegments (usually happens when they are not tiled and simplified).
  • Fixed subsampled raster tiles not being blended correctly.
  • Fixed the underground color leaking around the planet.

Version 0.10.0 - 2021-07-13

Added

  • Layers can now be made visible/hidden under certain constraints. Visibility constraints currently include an altitude threshold and latitude/longitude bounds, both are based on the current camera position.
  • Multiview
    • New scene model root: SceneViewSettings. This uses a SceneViewIndex as root parameter.
    • New viewport field in the scene view settings: this configures what part of the screen is used to draw a view.
    • The scene view can be set to only occupy a fraction of the canvas or window Horizon is rendering into using the viewport field of the viewport settings.
    • It is also possible to only display a fraction of this viewport using the scissor field of the viewport settings.
    • Single model, 3D Tiles, and imagery raster layers can be hidden invidivually in each scene view.
    • Each representation of a vector tiles layer can be hidden individually in each scene view.
  • Clipping
    • Added clipping plane layers.
    • To use clipping plane layer, every layer eligible can modify their clip_id property to match the clipping plane layer’s clip_id property.
  • Gizmos
    • Added gizmo layers.
    • Gizmos are small interactive components that allow users to translate and rotate objects in the scene. They can be used to move clipping planes, viewsheds, etc.
    • Linking gizmos to objects is left to the integration. Please refer to the documentation for a working example.
  • In-memory vector source layers
    • New type of layer, used to store vector data inside Horizon through its API. This data can then be used as a source for vector data layers.
    • Geometries (points, polylines, and polygons) and attribute values can be stored.
    • Changes to the vector data are automatically reported to the vector tile layers.
  • Aesthetics
    • Added more settings to AmbientSettings to control the appearance of the scene.
    • The strength of the sun and ambient lighting can be adjusted independently.
    • The color of the sky and the ambient lighting can be changed when not using the simulated atmosphere.
    • A color can now be assigned to the underground. This is useful when using a transparent terrain.
    • Added more settings to SceneSettings to control the appearance of raster layers.
      • compensate_raster_inclination and mix_raster_lods make raster LOD transitions less abrupt, by attenuating the effect of uneven terrain and interpolating between LODs.
      • max_screen_space_error controls how much rasters can be stretched before having to be refined when zooming-in.
  • Sprites can now have their size relative to their image by using the SizeUnit SIZE_RELATIVE_TO_IMAGE.
  • The Z component of the centroid of each feature can be provided to the styling script as an attribute using the centroid_z_attribute_name field of VectorTilesStyle.

Changed

  • The properties offset_{xyz} on sprite, text, and model vector representations have been renamed to world_offset_{xyz}.
  • The PickScreen and PickScreenArea methods now return tickets optionally. For example when the request was outside of all viewports, no ticket is returned.
  • The GetCameraViewBox, GetCameraViewPolygon, and LatLonAltToPixelCoords methods of the CameraService now take into account what scene view to use.
  • Camera settings (the CameraSettings structure) now have their own scene model root instead of being embedded in the scene settings.
  • The previous scene settings have been moved to the SceneViewSettings scene model root.
  • The SceneSettings root now contains the global configuration of the scene views.
  • Bounds in the VectorDataLayer, VectorTilesSource, and BoundsVisibilityConstraint now use the Wgs84Bounds structure. This avoid potential confusion about axis order.
  • Suppressed some irrelevant warnings about missing data sources when creating a vector data layer.
  • An attempt at loading b3dm tiles (from 3D Tiles) sent with the wrong MIME type is now made, based on the file extension.
  • Bing raster tiles are now retrieved through HTTPS.

Fixed

  • The tiles of 3D Tiles external tilesets were drawn too soon, leading to overlapping geometries of different zoom levels being drawn in some cases.
  • Some vector tiles were not drawn when the bounding box of the layer was covering the whole planet.
  • Fixed the is_working state when files used by the vector representation configurations failed to load.
  • Fixed crashes when using API paths with invalid feature indices.
  • Fixed the camera moving too much in some cases when changing viewpoints with a BALLISTIC trajectory.
  • Fixed transparent impostors being drawn opaque.
  • Fixed 3D models (including b3dm 3D Tiles) with the mask alpha mode being hidden when using low instance opacity.
  • Fixed terrain rendering issues near the 180th meridian.
  • Fixed crash when loading glb files without a binary chunk.
  • (Android/Web) Fixed alpha mode (mask and blend) rendering for 3D models (including b3dm 3D Tiles).
  • (Android/Web) Instanced 3D models were not drawn.
  • (Web) Fixed blurry display on canvas with non-integer size.

Upgrade notes

  • Picking
    • The PickScreen and PickScreenArea now return new structures (PickRequestResult and PickAreaRequestResult) which contain an optional picking ticket and a boolean indicating whether the ticket is present or not. Applications should check the has_a_ticket field to know whether a result message is expected to be returned by the engine or not.
  • Camera
  • Multiview
    • All previous scene settings should be placed in the SceneViewSettings root with parameter SCENE_VIEW_0.
    • SceneViewSettings.viewport.viewport should be set to x_min = 0, x_max = 1, y_min = 0, y_max = 1.
    • SceneViewSettings.viewport.scissor should be set to x_min = 0, x_max = 1, y_min = 0, y_max = 1.
    • In the new SceneSettings root, the main view should be set to SCENE_VIEW_0 and the active views bitset to 1.
    • The scene_views field of SingleModelLayer should be set to bits = 1.
    • The scene_views field of ThreeDTilesLayer should be set to bits = 1.
    • The scene_views field of every VectorRepr entry of VectorTilesLayer should be set to bits = 1.
    • The scene_views field of ImageryRasterLayer should be set to bits = 1.
    • The group field of DtmRasterLayer has been removed.
  • Clipping
  • Vectors
  • Aesthetics
    • The sun_strength and ambient_strength fields of AmbientSettings should be set to 1.
    • The ambient_color field of AmbientSettings should be set to rgb = 0.42.
    • The sky_color field of AmbientSettings should be set to black.
    • The underground_color field of AmbientSettings should be set to black.
    • The compensate_raster_inclination and mix_raster_lods fields of SceneSettings can be set to true for smoother raster layers.
    • The max_screen_space_error field of SceneSettings can be set to a value that fits the balance between details and bandwith for the client. A value of 2 reproduces the previous behaviour.
  • The styling scripts should be updated to use the property names world_offset_{xyz} instead of offset_{xyz} for sprite, text, and model vector representations.

Version 0.9.3 - 2021-07-06

Changed

  • An attempt at loading b3dm tiles (from 3D Tiles) sent with the wrong MIME type is now made, based on the file extension.

Fixed

  • Fixed crash when loading glb files without a binary chunk.

Version 0.9.2 - 2021-05-03

Changed

  • Made the refinement process for 3D Tiles with “region” bounding volumes more precise.

Fixed

  • Fixed the latitude bounds of the orbit camera being offset by a few kilometers.
  • Fixed the orbit camera oscillating when correcting its position in very small bounds.
  • Fixed a 3D Tiles refinement error causing some tiles to be refined too early.
  • Fixed uniform buffer object binding issues.
  • Fixed a crash at startup on Linux.
  • Fixed the long startup delay while compiling shaders. Shaders will now be compiled when first used, which may result in a few small lag spikes when displaying a layer for the first time.

Version 0.9.1 - 2021-04-23

Added

  • Camera
    • The camera can now be controlled with touch gestures. Drag with a single finger to move, pinch two fingers to zoom in and out, rotate them to orientate the camera, and drag two fingers to change the its inclination.
    • Ctrl+left mouse button now rotates the view.
    • Limits can now be applied to the position of the camera for each type of manipulator. See the documentation for more details.
  • Vectors
    • Point vector data can now be rendered as flat discs with the flat overlay representation. Disc radii and colours can be configured per feature. Disc outlines are also available, with per-representation configuration for sizes and colours.
    • The screen offset of sprites and texts can now be set per feature, in the styling script.
    • A new property is available in styling scripts for sprites and texts: scale. It scales the representation after the size and screen offset have been applied.
    • A Z-index property has been added to sprite and text representation configurations. Representations with a greater value are drawn on top of those with a smaller value.

Changed

  • Camera
    • The fixed rotation manipulator has been renamed to fixed position.
    • The camera manipulator type is now changed by calling methods of the camera service instead of changing the scene model.
  • The screen offset of sprites and texts is now applied after the sprite or text has been resized.

Fixed

  • Updating a raster’s group now correctly removes the raster from its former group.
  • Fix crash when modifying rasters when near the antimeridian.
  • Fix flat overlays jittering when moving the camera while picking.

Upgrade notes

  • Vectors
    • Screen offset values for sprites and texts should be adjusted in order to take into account the fact that they are now applied after the sprite or text has been resized. This allows for a more intuitive composition of sprites and texts to represent a single feature. The scale property can be used to scale such a composition in a single operation.
    • Specify the drawing order of sprites and texts using the Z-index property to avoid incorrect renders.
  • Camera
    • Use the SetOrbit, SetFixedTarget, or SetFixedPosition methods of the camera service to both change the current manipulator type, and change the current viewpoint.
    • The Viewpoint structure has been replaced by AngularViewpoint.
    • The GetCameraViewpoint method has been replaced by GetCameraAngularViewpoint.
    • The MoveToPoseParams structure has been removed. Use one of the Set[Manipulator] methods that accept a pose in their view union.
    • The MoveToViewpointParams structure has been removed. Use one of the Set[Manipulator] methods that accept an angular viewpoint in their view union.
    • The MoveToBoundsParams structure has been removed. Use one of the Set[Manipulator] methods that accept bounds in their view union.
    • IMPORTANT: Application developers are encouraged to use positional viewpoints when the target is important, and poses when it’s not. Using an angular viewpoint is discouraged because it becomes imprecise as the distance increases.

Version 0.9.0 - 2021-03-31

Added

  • Flat overlay
    • The outline of polygons can now be drawn instead of filling them in.
    • The geometry can now be clipped to the extent of each tile to hide margin geometry.
    • Polylines and polygons outlines can now be dashed using the dash_period and dash_ratio properties. See the documentation for more details.
    • The round tips of polylines segments can now be disabled using the round_tips property. This is useful when using the dashed style.
    • The inside or outside of polylines can be hidden using the side property.
    • Flat overlays can be picked and selected.
  • Area picking
    • Added the ability to do picking in a rectangle.
    • This returns the list of features visible on screen inside this rectangle.
    • See the picking documentation for more details.
  • Vectors
    • The source layer can be specified when loading vector data from Mapbox Vector Tile files.
    • Impostors can now be used alongside 3D models for vector data. Impostors can be used to address performance issues when lots of 3D models need to be rendered. Impostors mimic 3D models when viewed from far away using a simple quad. The engine automatically switches between the two representations depending on the view distance to the tile.
  • Camera
    • The camera position and orientation can now be set with the CameraService.MoveCameraToPose method.
    • When moving the camera, a trajectory type can be passed in the animation options. The BALLISTIC trajectory type makes the camera go up in the sky in order to enhance the visual feedback of the movement.
    • New GetCameraPose method in CameraService, which returns the camera’s current position and orientation.
  • Viewshed
    • Added viewhsed feature.
    • It is an analysis tool that shows what is visible from a specific point of view.
    • Users can specify geographic position (latitude, longitude and altitude), orientation (bearing, tilt), perspective paramaters (vertical field of view, aspect ratio, near plane, far plane) and colors of what is being visible or hidden from the point of view.
  • A loading priority parameter has been added to layers, enabling a strict ordering of the requests when downloading some layer’s data if needed. See the documentation for details.
  • Added new API function is_working returning whether horizon core layers have finished their respective work.

Changed

  • The structures used for mouse hover information have been renamed, and some of them have had their fields changed.
  • The GetCamera method in CameraService has been renamed to GetCameraViewpoint.
  • Vertex attributes of Draco-compressed glTF models (including 3D Tiles) are now dequantised in the vertex shader. For typical models, it halves the memory consumption of vertex buffer objects.
  • The GetCameraPose method in CameraService was returning position with radians coordinates whereas documentation stated it was in degrees. It now returns position in degrees following the documentation.
  • Camera
    • The GetCamera method in CameraService has been renamed to GetCameraViewpoint.
    • The MoveCamera method in CameraService has been renamed to MoveCameraToViewpoint.
    • The GetCameraPose method in CameraService was returning position with radians coordinates whereas documentation stated it was in degrees. It now returns position in degrees following the documentation.

Fixed

  • TypeScript: HrzCoreBackend.init() now takes an IViewerOptions instead of a ViewerOptions for the viewer option object.

Upgrade notes

  • Picking, mouse hover info
    • The picked union in the MouseHoverInfoMessage has been replaced with a picked field of type TypedObjectReference.
    • A single model layer object reference is now of type LayerHandle instance of MouseHoverInfoSingleModel.
    • MouseHoverInfoVectorTiles has been renamed to VectorTilesObjectReference.
    • MouseHoverInfoThreeDTiles has been renamed to ThreeDTilesObjectReference.
  • Flat overlay representation
    • The dash_period field should be set to a positive non-zero value.
    • The dash_ratio field should be set to 1.
    • The round_tips field should be set to true.
    • The side field should be set to PolylineSide.SIDE_BOTH.
  • Camera
    • Previous calls to CameraService.GetCamera should be renamed to CameraService.GetCameraViewpoint.
    • Previous calls to CameraService.GetCameraPose should consider position coordinates to be in degrees instead of radians.
    • Previous calls to CameraService.MoveCamera should be renamed to CameraService.MoveCameraToViewpoint.
    • CameraMoveInfos has been renamed MoveToViewpointParams.
    • CameraMoveToBoundsInfos has been renamed MoveToBoundsParams.
    • Setting the field CameraAnimationOptions.trajectory_type to the value TrajectoryType.BALLISTIC when switching viewpoints enhances the visual feedback of the movement. (The default value, TrajectoryType.INTERPOLATED, corresponds to the previous behaviour.)

Version 0.8.3 - 2021-05-03

Changed

  • Made the refinement process for 3D Tiles with “region” bounding volumes more precise.

Fixed

  • Fixed a 3D Tiles refinement error causing some tiles to be refined too early.

Version 0.8.2 - 2021-03-26

Added

  • A status code is now returned from the initialisation function. It indicates success or failure, and can be used to inform the user of what went wrong in case of an error.

Changed

  • When the atmosphere is disabled, there is now a slight amount of ambient lighting so that shadows are not pitch black.

Fixed

  • Fixed the long startup delay while compiling shaders. Shaders will now be compiled when first used, which may result in a few small lag spikes when displaying a layer for the first time.

Upgrade notes

  • The returned status code on engine initialisation should be checked, and the client should not try to use an instance that failed to initialise. Additionally, an error message can be displayed when relevant.

Version 0.8.1 - 2021-03-04

Added

  • New GetCameraPose method in CameraService, which returns the camera’s current position and orientation.
  • Added support for specifying custom HTTP headers everywhere a URL or a URL pattern is provided.

Fixed

  • 3D Tiles: External tileset tiles were not loaded and displayed at the right times.
  • Wasm: Fixed not being able to create a new WebGL 2 context after a previous one was dropped.
  • Wasm: Fixed some resources not being freed after a Horizon instance was dropped.
  • Wasm: Fixed the WebGL context being lost when the canvas was hidden.
  • Fixed picking on negative DTM values.

Version 0.8.0 - 2021-02-09

Added

  • Flat overlay
    • Add the z-index property to set the rendering order of the layer. Features with a higher value are drawn on top of features with a lower value. For instance, features with the z-index value 1 are drawn over (and therefore can hide) features with the value 0.
  • 3D Tiles
    • 3D Tiles can now be stylised and filtered, using the same styling script that is used for vector tiles. Attribute values can either come from the 3D Tiles themselves, or from a vector data layer.
  • Single models
    • The color of single models can now be changed. This includes opacity.
  • Vectors
    • Add a resolution factor setting. The smaller the factor the later tiles will be refined when zooming in.
    • Add the ability to clamp using three methods: NO_CLAMPING, CENTROID or PER_VERTEX. They respectively: disable clamping, clamp points relative to the centroid clamp value, and clamp each point to the terrain independently.
    • Add the ability to enable/disable use of the Z component when clamping features.
    • Add min and max operators in styling scripts.
  • Selection
    • Individual objects in the scene can be selected using the selection API from the viewer service.
    • Selected objects will be highlighted.
    • The highlighting style can be changed using the highlight part of the scene settings.
  • Visibility
    • Add a visible property on all layers except VECTOR_DATA. Setting visible to false prevents downloading and displaying the layer data.
  • Added new Bing imagery types: ROAD_DARK, ROAD_GRAYSCALE, and ROAD_LIGHT. See the Bing Maps documentation for more details.
  • Added a utility function in CameraService to convert lat/lon coordinates to screen space position, in pixels.
  • Added startup arguments that dictate certain behaviors such as the log level, whether or not the developement UI is enabled, among other settings. See HrzProtocol.ViewerOptions in the documentation.
  • Added named viewpoints to the scene dump model.

Changed

  • Picking
    • Now always returns data on rasters. The position queried is vertical to the picking location, projected on the terrain.
  • Mouse hover info
    • “Continuous picking” has been renamed to “mouse hover info”.
    • Now returns what layer (and potentially feature) is hovered in addition to the position.
  • Cylinders can now be made transparent.
  • Reduced the number of vectors tiles loaded: tiles that are not visible, that are only visible for a short duration, or that are at lower level of details than what is necessary, are now less often requested.
  • Reduced the number of DTM tiles loaded for elevation queries: the level of detail of the DTM tiles the geometry is clamped on now depends on the resolution of the vector data.
  • Bing’s aerial and roadmap map now use the new “on-demand” endpoint.
  • Empty tiles from Bing imagery are now detected.
    • When the failure policy of a Bing provider is set to NO_FAILURES, the tiles that contain no data will not be displayed as empty anymore.
    • The failure is propagated to all rasters in the same group.
  • Reverted the raster tile download order to the one of version 0.6.0.
  • 3D Tiles are refined, and their downloads are prioritised, based on their position on screen.
  • Small region bounding volumes for 3D Tiles are approximated by oriented bounding boxes, increasing culling efficiency.

Fixed

  • Fixed transparent extruded vectors having incorrect rendering order.
  • Atmosphere optical depth was applied too much.
  • Fixed picking offset on single image rasters.
  • Fixed rasters not being clipped to their declared bounds.
  • Z-coordinates were not read from GeoJSON files.
  • Integer coordinate values were incorrectly read from GeoJSON files.
  • The is_working method erroneously returned true when root tiles of external 3D Tiles tilesets failed to decode properly.

Version 0.7.1 - 2020-12-11

Added

  • The MASK alpha mode of glTF materials is now supported, along with the alphaCutoff parameter.

Fixed

  • Required DTM tiles failed to be requested due to a faulty check when no bounds were explicitly set on web Mercator DTM layers.
  • glTF models with the BLEND alpha mode in their material definition (i.e. transparent models) were drawn opaque.
  • Querying elevations of an empty list of points lead to a crash.

Version 0.7.0 - 2020-11-30

Added

  • 3D Tiles
    • 3D Tiles can now be displayed, using a new layer type. Currently, only Batched 3D Model (b3dm) tiles are supported. No styling options are available.
  • Styling API
    • Add hexadecimal support for literals with the following form: 0xab57F.
    • Add special hexadecimal literals for colours: #rgb, #rgba, #rrggbb, #rrggbbaa. Alpha is assumed opaque when not set.
    • Add special colour functions: rgb(r, g, b), rgba(r, g, b, a). Components are in [0, 1]. Alpha is assumed opaque in rgb().
    • Add the ability to colourize features using a palette through the colorize() function. Palettes can be of numeric type just like for palettized rasters. In addition, palettes mapping a string value to a colour are also available. Palettes are declared in the scene model with a name then used in the script to identify the palette. See HrzProtocol.Palette and the “Styling API” section in the documentation for examples.
    • Add the ability to use arithmetic function in the set instruction: add, sub, mul, div, inv, abs, neg can be used respectively as: addition with constant, subtraction by constant, division by constant, inversion, absolute value, and negation. These functions can be composed to produce more complex expressions. Refer to the documentation for further details on how to use them.
  • Sun lighting and shadows
    • Local solar time and day of year can be set in SceneSettings.ambient.
    • Geometry lighting and shadows can be individually toggled with the enable_lighting and enable_shadows from SceneSettings.ambient.
  • Data formats
  • Picking
    • Add the ability to receive regular mouse position updates through the message queue. This avoids calling ViewerService.PickScreen() which is more expensive and should be used only to query picked layers and/or features. Continuous picking can be toggle on and off with ViewService.EnableMousePositionMessages()
  • New horizon-scene-dump TypeScript library for dumping and loading scenes. See the scene model documentation for more information.

Changed

  • Styling API
    • Colours are now stored in little-endian integers, i.e. the least significant byte represents red, the next one green, then blue, and the most significant byte represents alpha. Previously they were stored as big-endian integers. For example, full-opaque green, which was 16711935 (0x00ff00ff), is now 4278255360 (0xff00ff00).
  • Atmosphere rendering can be disabled with SceneSettings.ambient.enable_atmosphere.
  • Moved the terrain opacity setting into SceneSettings.terrain.terrain_opacity.
  • Picking
    • Picking now returns more information about the picked layers or feature.
    • Picking now traverses every raster layer at the picked location. For each layer, the picked location in the raster projection and the pixel position at the most detailed level are returned.
    • For vector layers, the picked feature ID is returned.
    • Additional information is also retrieved from cached data. They are: elevation for DTM rasters, scalar value for palettized rasters, feature attributes, etc. Any extra information retrieved this way can be inaccurate, incomplete or simply missing. Therefore, if no extra information is returned or if returned data isn’t sufficient, then it is up to the application to retrieve what it needs from the dataset using the pixel and projected positions.
    • Note: picking on flat overlay is not available in this version but is part of future developments.
  • Reduced the number of raster tiles downloaded.

Fixed

  • glTF models
    • Fixed some elements not being drawn at their correct position.
    • Fixed some elements being culled incorrectly.
    • Required glTF extensions are now checked before attempting to load a model.
    • Fixed instanced models with only 1 instance throwing WebGL validation errors with Angle.
  • Flat overlay:
    • Fixed incorrect blending causing bright artifacts around polylines.
    • Made the size of polylines more stable.
    • Fixed blurry features at high altitudes.
    • Fixed incorrect culling at high altitudes.
  • Extruded polygons now support any winding order.
  • Fixed a crash when changing a DTM raster provider.
  • Fixed elevation queries only working for global webmercator rasters.
  • Fixed incorrect alpha blending on the terrain.
  • Fixed performance issues with the native assets loader.

Version 0.6.0 - 2020-09-25

Added

  • Vector features
    • Add a new stem representation: a stem is a vertical line that can be used to connect to points vertically. For instance, it can connect an icon to its actual location on the ground. When used with other features than points the centroid is used for positioning.
    • New cylinder representation for polyline features.
      • Radius, color, and altitude offset can be configured per instance.
    • New flat overlay representation for polygon and polyline features.
      • Line size and color can be configured per instance.
    • New text representation: String properties, such as feature names, can be rendered as text in the scene.
      • Texts are positioned on the centroid of the feature, plus an offset (configured in the style).
      • Truetype fonts are used. One font is used per style.
      • Size and colours (text and outline) can be configured per instance.
      • Complex text layout is supported.
  • Sprites and texts can be sized either in metres or in pixels, with several new parameters allowing a finer control on the representation. It is possible to create complex representations by combining sprites and texts.
  • The terrain can now be set transparent.
  • Add atmospheric scattering rendering. For now no parameters are exposed to the API.
  • Data can now be loaded using HTTP compression (gzip) on the desktop. (It was already supported on browsers.)

Changed

  • The geometry of extruded vectors is now clamped to the ground per point.
  • Vector tiles URLs now make correct use of {-y} for TMS and {y} for XYZ.
  • Internals:
    • Assets loading has been reorganized. Layer types are now prioritized such that some will load faster than others, and the requests are round-robined such that a single data source can’t block the others. For instance DTM layers will load quicker than imagery layers, but imagery layers won’t wait for all DTM requests to be dispatched to start loading.
    • The loading of assets is no longer limited to 4 concurrents requests.
    • Picking is now fully asynchronous. This prevents Horizon from stalling when picking in a complex scene.

Fixed

  • Styling scripts:
    • Updating the styling script can make sprites disappear.
    • Forking after branches that discard features may crash the worker threads.
    • Forking inside a branch may crash the worker threads.
  • Nonsensical results could be returned when getting picking info through the API for invalid coordinates.
  • Vector data:
    • Selecting access by tile on a client source triggers an assertion.
  • Vector tiles at high altitude can be incorrectly culled.

Version 0.5.0 - 2020-07-15

Added

  • Vector features stylization and filtering
    • Vectors can now be stylized and filtered via styling scripts.
    • Vector tiles layers now must declare:
      • A list of representations. They are archetypes describing how to render features. Some properties of these representations can be set per instance, some cannot.
      • A list of attributes that can be queried in the styling script. It associates the ID of the attribute from the vector data layer with the name of the attribute in the styling script.
      • A styling script that assigns representation properties and emits representation instances with a complex control flow.
    • New “Extruded geometry” representation: extrudes a polygon along the vertical axis on the surface of the planet. The extrusion amount and the color can be set per instance. An altitude offset can also be applied, but not per instance. Polylines can also be displayed with the same representation, generating walls.
    • New “Sprite” representation: displays an image for every feature. When used with features other than points the centroid will be used for positionning. A color, scale and an offset can be set per instance. An altitude offset can also be applied, but not per instance. Only 256x256 images are supported for now.
    • New “3D model” representation: renders a full 3D model for every feature. When used with features other than points the centroid will be used for positionning. A color as well as a full transformation matrix can be set per instance. An altitude offset can also be applied, but not per instance. Only GLTF models are supported for now.
  • Camera
    • New mode where the camera looks at a fixed target.
    • New mode with a fixed camera and a movable target point.
    • Ctrl+R now reset north while keeping camera’s tilt.
    • Double-left/right click to zoom-in/out.
  • Added global scene settings via a new scene model root: HrzProtocol.SceneSettings.
    • The camera FOV can now be changed through the scene settings.
    • The camera mode can now be changed through the scene settings.
  • New colorized rasters using the PalettizedImageRasterProvider imagery raster provider.
    • Takes another raster provider and a palette as input.
      • The raster provider is another provider for ImageryRasterLayer (ex: TiledImageRasterProvider) alongside new R_F32_SILICIUM image format used for floating point data raster produced internally.
      • The palette is made of a list of double-color-value marks and a NaN color.
    • Outputs a RGBA raster after applying the palette given by user.
  • Support for tiled rasters where longtitude and latitude are directly mapped to the X and Y axes. (Also known as WGS84, geographic, or equirectangular projection.)
    • These tilesets can be generated by gdal2tiles, with the --profile=geodetic --tmscompatible parameters.
    • They can be loaded through a tilemapresource.xml file.
  • Support for tilemapresource.xml files with the raster profile.
    • Typically generated by gdal2tiles.
    • Note that gdal2tiles describes the spatial reference system in the WKT format. This is not supported. The SRS must be described in the PROJ.4 format.
  • level_zero_tile_count_{x,y} is now taken into account.
  • Projections can be declared in the API using SRIDs, such as EPSG:3857.
    • Full PROJ.4 strings can still be used.
  • Two new formats that reflect rasters content more clearly: SRGBA_8 used for imagery and SIGNED_FIXED_24_8 for elevation rasters produced internally.
  • New synchronous TypeScript interfaces HrzApi.SyncBackend and HrzApi.SyncApi have been added. The default backend, HrzCoreBackend implements SyncBackend.
  • New “Changelog” page in the documentation.

Changed

  • The planet is now fully visible at startup no matter the resolution.
  • The types of the layer root paths have been renamed, to be more natural sounding. All Layer*Paths have become *LayerPaths. (For example LayerImageryRasterPath is now ImageryRasterLayerPath.)
  • The tiling scheme API for raster layers has been streamlined. The three types are now GLOBAL, LOCAL, and UNTILED
    • GLOBAL is used when the tile bounds and names are irrespective of the bounds of the actual raster. This is used for example with XYZ (OpenStreetMap compatible) and TMS tilesets.
    • LOCAL is used when the tiles are created inside the bounds of the raster.
    • UNTILED is for displaying a single image.
  • Consider that the level 0 comprises only one tile, covering the whole planet, for rasters from tilemapresource.xml in the mercator profile. (Instead of four tiles.) This contradicts the specification, but is in accordance with common pratice.
  • The number of workers is set to the number of concurrent threads on the host CPU.
  • The TypeScript interfaces HrzApi.Backend and HrzApi.Api have been renamed HrzApi.AsyncBackend and HrzApi.AsyncApi, respectively.
  • Prevent loading images above 10,000×10,000 pixels on the browser, as it leads to unrecoverable out-of-memory errors.
  • Mapbox Vector Tiles can now have their feature IDs queried from attributes. See id_field_name in the vector data source.

Fixed

  • Fix picking not returning the correct position on vectors.
  • Fix some rasters not displayed correctly on very low zoom levels.
  • Raster tiles from tilemapresource.xml in the mercator profile were queried one level above the actual maximum level.
  • Fix the camera zooming too quickly when using the mouse wheel and the framerate is low.
  • Fix camera movement when very close to a surface.
  • Do not trigger double-click events when the mouse has moved between the two clicks on Linux.
  • Prevent some clicks from going through the debug GUI.
  • Correctly display non-textured faces of glTF models.

Version 0.4.0 - 2020-05-15

Added

  • Data source URL patterns now support alternate servers. The notation allows using a range of server names, and the selection is made at random for each request. This allows more concurrent requests in the browser.
  • Data source URL patterns now support flipped y with {-y}, and quadkeys with {quadkey}.

Changed

  • Replace OpenSceneGraph with custom code.
    • A modern and lightweight rendering API abstraction library has been created: Mycelium.
    • Future developments will be facilitated by the more flexible architecture of the rendering system.
    • The web version now works on Chrome.
  • Upgrade Empscripten from version 1.38.21 to version 1.39.12.
  • Add WASM optimisation step, using wasm-opt.
  • The above changes combined lead to a significant decrease in size for the WASM files:
    • hrz_core.wasm: From 7.3 MB to 1.3 MB
    • hrz_worker.wasm: From 1.6 MB to 0.75 MB

Removed

  • The “tiled web map type” enumeration (with XYZ, TMS, and QUADKEY options) has been removed from the API. The choice between these tiling schemes is now made inside the data source URL pattern. See the documentation for more details.

Fixed

  • Fix the viewport not resizing correctly in web mode.

Version 0.3.0 - 2020-04-10

Added

  • Camera API for positioning the camera in the scene or retrieving the current view point and visible extent. See CameraService.
  • Vector tiles layer.
    • Displays a tile pyramid of polygon features.
    • Polygons are extruded with an attribute and clamped on the terrain.
    • Both protobuf and GeoJSON formats are supported.
  • Picking API. See ViewerService.PickScreen.
  • Raster layers now take into account their minimum level of detail.
    • For instance Bing doesn’t have a level 0, so setting this property to 1 allows the system to use the data at level 1 to fill in the level 0.

Changed

  • Implemented a new and improved camera manipulator.

Fixed

  • Fix exceptions when loading some tilemapresource.xml files.
  • Fix properties being overridden when using tilemapresource.xml files.

Version 0.2.0 - 2020-03-02

Added

  • Support for HTTPS on desktop.
  • Bing Maps raster provider, see the BingProviderParams message.
  • The tiled raster provider can now use a tilemapresource.xml file. See the tilemap_resource_url field in the TiledImageRasterProviderParams message.
  • The documentation now includes illustrated examples.
  • The URL of .wasm files is now configurable from the TypeScript API.

Fixed

  • Fix artifacts during DTM composition.
  • Fix exceptions during reprojection of some rasters covering the entire planet.

Version 0.1.0 - 2020-01-27

Added

  • Use DTM rasters as terrain elevation.
  • Display imagery rasters on the terrain.
  • All rasters can be tiled or as single images.
  • Display glTF files as 3D models.
  • Support for Windows, Linux, and Web browsers.
  • API bindings for C++, C#, and TypeScript.