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_dtmfield toTerrainSettingsto 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
GetTerrainElevationmethod toViewerService. 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-corepackage. See Getting started for more information. - Added
uint64Equals()toHrzProtocolHelperfor comparing twouint64values. - Added AMD Radeon and Intel Arc GPUs to the platform detection and auto-graphics level logic.
- Added the
--versioncommand line switch to the native client and the testing kit viewer.
Changed
- Vector tiles
- Symbols are now culled when far off at the horizon to avoid cluttering.
- The flat overlay representation has been split into three distinct representations:
FlatOverlayPolygonVectorRepr,FlatOverlayPolylineVectorRepr, andFlatOverlayPointVectorRepr. - Polygon outlines are now represented by the
FlatOverlayPolylineVectorReprrepresentation. - In the flat polyline and cylinder representations, all dash parameters have been consolidated in the
Dashesmessage. - In the flat polygon representation, all polygon pattern parameters have been consolidated in the
PolygonPatternmessage.
- Protocol & API
- The following messages now use a
oneofinstead of atypeenum field paired with numbered optional fields:- Raster
NodataValue: thetypefield has been replaced by thevalue_typeoneof.RasterProvider: thetypefield has been replaced by theprovider_typeoneof.TilingSchemeParams: thetypefield has been replaced by thescheme_typeoneof. The deprecatedUNTILEDvalue is gone.
- Vector
VectorDataSource: theprovider_typefield is now aoneofof the same name.VectorRepr: thetypefield has been replaced by therepr_typeoneof.TransformSymbolComponent: thetypefield has been replaced by thecomponent_typeoneof.SymbolElement: thetypefield has been replaced by theelement_typeoneof.
- Layers
LayerVisibilityConstraint: thetypefield has been replaced by theconstraint_typeoneof.
- Color
Palette: thetypefield has been replaced by thepalette_typeoneof.
- Raster
- In
ShapeEditorMessage, theshapefield has been split intoshape_selectionandshape_geometry_updateto match their corresponding message types. - In
ShapeEditorMessage, themodeandcontrol_pointfields have been renamed tomode_switchandcontrol_point_selectionto 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 theboundsfields which is now a geographic volume. - In the C++ protocol,
stringandbytesfields are now represented asstd::string_viewinstead ofstd::string. - The values of
GraphicsLevelhave been renamed to be snake-uppercase. - Renamed the
R_F32_SILICIUMvariant ofImageFormattoSIRADEL_LEGACY_F32. - The protocol for palette definitions has been updated for better alignment with other tools and technologies, such as the Web platform.
ColorPointhas been renamedColorStopand the propertycolor_pointsofNumericPalettehas been renamedcolor_stops.
- The following messages now use a
- 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
CameraTranslatehave had their default factor doubled. - The property
experimental_adaptive_resolutionofTerrainSettingshas been removed. Adaptive resolution is now enabled by default. It can be disabled by setting the propertydisable_terrain_adaptive_resolutionofViewerOptionstotrue. - 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-ossscope. - The target JS version has been upgraded to ES2021.
Removed
- The
NodataValueType,RasterProviderType,TilingSchemeType,VectorDataProviderType,VectorReprType,TransformSymbolComponentType,SymbolElementType, andLayerVisibilityConstraintTypeenums have been removed. - The
InMemoryAttributeValuemessage has been removed and replaced withAttributeValue. - The
MessageTypeenum and thetypefield ofTypedMessagehave been removed. - The
ShapeEditorUpdateTypeenum and thetypefield ofShapeEditorMessagehave been removed.
Fixed
- Rasters
- The properties
has_min_levelandhas_max_levelofLocalTilingSchemeParamsare 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.
- The properties
- 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
b3dmandpntstiles of 3D Tiles tilesets not being displayed correctly when their batch length was misconfigured. - Improved compatibility with 3D Tiles tilesets whose
content-typeheaders and extensions are incorrect. - Fixed lighting on glTF models with negative scaling factors.
- Fixed
- 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
idattribute.
Upgrade notes
- Camera
- In
BoundsView, move themin_altitudeandmax_altitudefields to themin_heightandmax_heightfields of theboundsfield. - In
CameraTranslate, halve theangle_factor_xandangle_factor_yvalues to get the same movement as before.
- In
- Vector tiles
- Any instance of
FlatOverlayVectorReprmust be replaced by one or more of the new representations:FlatOverlayPolygonVectorRepr,FlatOverlayPolylineVectorRepr, andFlatOverlayPointVectorRepr.- The name of some fields have been shortened in the new representations as they did not need disambiguation anymore.
- Scenes that used a single
FlatOverlayVectorReprwith multiple geometry types (points, polylines, and polygons) must now use multiple representations, and theforkinstruction in styling scripts with the feature type special attribute to emit those representations. - All dashes parameters of
CylinderVectorReprmust be moved to the newdashesfield.- The
line_empty_colorfield has been renamed tosecondary_color. - The
dash_lengthanddash_length_unitfields have been renamed toprimary_segment_lengthandprimary_segment_length_unit, respectively.
- The
- All dashes parameters of
FlatOverlayVectorReprmust be moved to thedashesfield ofFlatOverlayPolylineVectorRepr.- The same renaming as above applies.
- All polygon pattern parameters of
FlatOverlayVectorReprmust be moved to thepatternfield ofFlatOverlayPolygonVectorRepr. - In order to maintain the appearance of flat overlay points, the representations (
FlatOverlayPointVectorRepr) must be updated as such:- The value of the former
outline_colorproperty must be set on the newoutline_color.default_value. - The value of the former
outline_widthproperty must be set on the newoutline_width.default_value. - The value of
radius_unitproperty must be copied tooutline_width_unit.
- The value of the former
- Any instance of
- Messages must now be dispatched on their payload discriminator field instead of a
typefield.- In TypeScript, use protobufjs’
payloaddiscriminator (e.g.msg.payload == "pick") instead ofmsg.type == MessageType.PICK_MESSAGE. - In C++, use
TypedMessage::payload_case()(e.g.TypedMessage::kViewerReady) instead of comparing againstMessageType. Same applies toShapeEditorMessage::payload_case(). - Many other messages have been converted to using
oneofs. See their documentation to learn the new discriminant and variant field names.
- In TypeScript, use protobufjs’
- 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_resolutionofViewerOptionsif you encounter issues with the terrain geometry, such as spurious spikes. - The values of
GraphicsLevelmust be changed to their snake-uppercase counterpart. - All instances of
R_F32_SILICIUMshould be renamed toSIRADEL_LEGACY_F32. - Rename every mention of
ColorPointtoColorStop, and every mention ofcolor_pointsofNumericPalettetocolor_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 twouint64values 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_widthtoExtrudedGeometryVectorReprwhich 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_colorofViewerOptions.
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_OKLABandLINEAR_RGBofColorInterpolationModehave been renamedOKLABandLINEAR_SRGBrespectively. (Bringing the names closer to their CSS equivalents.) - Value
SRGB_R_8ofImageFormathas been renamedR8.
- 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_MESSAGEis 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_OKLABandLINEAR_RGBofColorInterpolationModemust be replaced withOKLABandLINEAR_SRGBrespectively. - Uses of the value
SRGB_R_8ofImageFormatmust be replaced withR8.
- 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
divwith a blackbackground-colorto 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 therequire()syntax must be replaced withimportstatements.
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
UNKNOWNare 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.
- Rules for joining multiple data sources in a single vector data source have been clarified and combinations have been expanded:
- 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_colorofSkySettingshas been renamedstatic_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.
- The property
- Return message types for
SceneModelServicemethods have been changed.SceneModelGethas been replaced withBytesValue, andSceneModelArrayCountwithUInt32Value. - 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_colorofSkySettings. - Set colour transition distances and unit for the static sky on
SkySettings. Values of 15,000 forstatic_color_transition_start_distance, 60,000 forstatic_color_transition_end_distance, andSTATIC_SKY_COLOR_TRANSITION_UNIT_METERSforstatic_color_transition_distance_unitallow approximating the simulated sky.
- Set the static sky colour with the property
- If you use the
SceneModelServicedirectly 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 namedvalueinstead ofpayloadandcount.
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_overridefield 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
urlfield of those sources must be prefixed bypmtiles://.
- The
- Added support for WOFF and WOFF2 fonts.
- Added support for decoding images using the
image/x.rawMIME type. See the documentation for more details. - Added support for the BIL, BIP, and BSQ image formats through the
image/x.rawMIME type.
- Added support for PMTiles sources for vector & raster sources in Mapbox scenes.
- Added the
GetSceneViewScaleAndAltitudemethod toCameraServiceto 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_positionproperty toViewshedSettings, to draw viewshed wireframes from the viewpoint position, instead of the near plane. - Added support for the
IGNF:WGS84GSRID. - 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_linearWebGL extension. - The
R_F32andR_F32_SILICIUMimage formats are now usable as DTM rasters. - The
SIGNED_FIXED_24_8image format is now usable in the palettised raster provider. - The
NodataValuestructure now has atypeproperty of typeNodataValueType, as well as dedicated properties for values of each type.COLOR_NODATA,UINT_VALUE_NODATA,INT_VALUE_NODATA, andFLOAT_VALUE_NODATAallow matching a value in the source images, regardless of the actual encoding of the values in the images.NAN_NODATAallow matching all NaN values in formats that support them (R_F32andR_F32_SILICIUM).BIT_PATTERN_NODATAallows matching values according to their exact binary representation in the source images. The value given inbit_patternis 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
geometryfield is now a member of the relevant raster providers parameters (TiledRasterProviderParamsandUntiledRasterProviderParams) instead of being a member ofRasterParams. For all other providers the geometry parameters are determined from the source data and the values ofRasterGeometrywere already ignored. - The
tiling_schemefield has been removed fromRasterGeometryand added to the only provider that uses it:TiledRasterProviderParams. - The
sampling,blending, anddisplay_boundsfields ofRasterParamshave been moved toRaster. - The
RasterParamsstructure has been removed. - The nodata value is now specified in the
nodatafield of each raster provider parameter structure, instead of being part ofRasterSampling. The value is now inside aRasterNodatastructure, that allows explicitly enabling or disabling the nodata value. - All provider parameter fields (
*_provider) have been moved fromRasterandPalettizedRasterProviderParamsto a new structure namedRasterProvider. The new field is namedproviderin bothRasterandPalettizedRasterProviderParams. - The field
typeofRasterProviderallows explicitly setting the type of the provider. - The field
nodata_colorhas been added onPalettizedRasterProviderParams. It allows setting the colour for nodata values coming from the child provider, regardless of what the actual values are. - The field
nodatahas been added onPalettizedRasterProviderParams. 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 thenodata_handlingfield ofRasterSampling. - All raster providers have been renamed:
TiledImageRasterProviderParamstoTiledRasterProviderParams.SingleImageRasterProviderParamstoUntiledRasterProviderParams.PalettizedImageProviderParamstoPalettizedRasterProviderParams.BingProviderParamstoBingRasterProviderParams.ArcGisProviderParamstoArcGisRasterProviderParams.TmsProviderParamstoTmsRasterProviderParams.WmtsProviderParamstoWmtsRasterProviderParams.WmsProviderParamstoWmsRasterProviderParams.CesiumTerrainProviderParamstoCesiumTerrainRasterProviderParams.TileJsonProviderParamstoTileJsonRasterProviderParams.PmTilesProviderParamstoPmTilesRasterProviderParams.
- All values of
RasterProviderTypehave been renamed:SINGLE_IMAGE_PROVIDERtoUNTILED_RASTER_PROVIDER.TILED_IMAGE_PROVIDERtoTILED_RASTER_PROVIDER.PALETTIZED_IMAGE_PROVIDERtoPALETTIZED_RASTER_PROVIDER.ARCGIS_PROVIDERtoARCGIS_RASTER_PROVIDER.TMS_PROVIDERtoTMS_RASTER_PROVIDER.WMS_PROVIDERtoWMS_RASTER_PROVIDER.WMTS_PROVIDERtoWMTS_RASTER_PROVIDER.CESIUM_TERRAIN_PROVIDERtoCESIUM_TERRAIN_RASTER_PROVIDER.TILEJSON_PROVIDERtoTILEJSON_RASTER_PROVIDER.PMTILES_PROVIDERtoPMTILES_RASTER_PROVIDER.
- Some fields of
RasterProviderhave been renamed:tiled_imagetotiled.single_imagetountiled.palettized_imagetopalettized.
- The terrain’s staircase effect when the DTM is incompletely loaded is no longer present on devices that support the
- 3D models
- The
SIRADEL_data_textureglTF extension has been extended to detail how data bits from colour images are reinterpreted as scalar values. (WhatImageFormatis used for in raster layers.) Entries of thetexturesarray in glTF JSONs for data textures must now have aSIRADEL_data_textureextension object with a value for thedataInterpretationproperty. The only accepted value isrgba8BitsToFloat, which corresponds to theR_F32image format. - The
SIRADEL_data_textureglTF 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.
- The
- Picking
- The fields
imagery,dtm, andscalarofRasterPickResulthave been replaced withcolorandnumber. 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 theimage_formatfield.ImageryPickResult,DtmPickResult, andScalarPickResulthave been removed.
- The
typefield ofRasterPickResulthas been removed, as well as theRasterTypeenumeration. Instead colour and scalar imagery rasters can be distinguished with theimage_formatfield and the type of the result. Imagery rasters and DTM rasters can be distinguished with the contents of the value in thelayerfield ofPickLayerResult.
- The fields
- 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_textureglTF extension without specifying a value for thedataInterpretationproperty is deprecated. Encoding scalar values in glTF data textures in theR_F32_SILICIUMformat is deprecated.
- Using the
Removed
- The Horizon protocol descriptor (
hrz-protocol.pbf) is no longer published. Please use the.protofiles from the source tree at//hrz/protoinstead. - The monitoring protocol file (
hrz-monitoring-interface.proto) is no longer published. Please fetch it from the source tree at//hrz/monitoring/protoinstead.
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-Typefor 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_NODATAvalue, or use another mode and give the number value.SIGNED_FIXED_24_8rasters with a nodata value of-2147483648should be converted toINT_VALUE_NODATAand 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_handlingvalue ofRasterSamplingis desired, use thenodata_colorfield ofPalettizedImageRasterProviderParamsto choose how to palettise nodata values.
- 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
- 3D models
- Models conforming to the previous version of the
SIRADEL_data_textureglTF 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.
- Models conforming to the previous version of the
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_resolutionparameter toTerrainSettings. This parameter improves terrain rendering at high elevations. It is experimental and should not be used in production.
Removed
- Web: The
hrz_core.worker.jsfile 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_zparameter 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_requestextension, allowing 3D Tiles to be served with HTTP range requests.
- Added support for point cloud (
- Vector tiles
- Added support for PMTiles vector data sources.
- Added the
missing_tile_policyproperty toVectorTilesLayer. 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_anchorfield toVectorPickResult, 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_unitofFlatOverlayVectorRepr.
- The camera now remains above the terrain (taking DTM layers into account), unless configured otherwise. The property
min_height_above_terrainhas been added toCameraSettingsto 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_typeofAssetRequestResponse. - The
ViewerOptions’s propertyrun_actors_on_main_threadhas been added. Setting it totrueuses 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_typefield fromNumericPalette. It had no effect since attribute values had been made dynamically typed, in version 24.3.0. - Removed the
wmerc_coordsfield fromVectorPickResult. 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
i3dmtiles 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_tilewas not set.
- Platform-specific
- Made an attempt at fixing a
TextDecoderissue 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.
- Made an attempt at fixing a
- Fixed
HrzProtocolHelper.attributeAsAnyreturningnullfor all non-number values.
Upgrade notes
- To keep the previous behaviour of allowing the camera to go under the terrain, set
CameraSettings’smin_height_above_terrainto a large negative value, such as-6378137(the Earth’s radius). - Set the property
missing_tile_policyofVectorTilesLayertoUSE_EMPTY_TILEto 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
TextDecoderin 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
- Added support for PMTiles rasters.
- Added the ability to use a TileJson raster in the palettized provider.
- Vector data
- Added
AttributeTransforms to apply transformations to attributes upon reading them.- In
InMemoryAttributefor attributes originating from in-memory vector data layers. - In
ThreeDTileAttributefor attributes originating from 3D Tiles batch tables. - In
VectorAttributefor all other sources.
- In
- Attributes are now optional. Values that are missing are
null.
- Added
- Styling
- Added the
mapbox_typeoffunction to get the Mapbox-compatible type of a value. - Added the
is_nullfunction to check whether a value is null or not. - Added the
is_nanfunction to check if a value is null, NaN, or converts to NaN. - Added the
value_orfunction to conditionally select non-null values. - Added the
to_string,to_int,to_uint,to_number,to_boolean, andto_colorfunctions, that act likeAttributeTransform, but in styling scripts.
- Added the
- Heatmaps
- Added a new
accumulationparameter toHeatmapVectorReprto specify how the value of points are accumulated. - The previous mode is now
HEATMAP_ADDITIVE. - The new
HEATMAP_WEIGHTED_BLENDEDmode improves readability in areas with high point density, but is only usable on values between 0 and 1.
- Added a new
- Added two new camera notifications:
motion_startedandmotion_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, andnull(when no data is given). - Colors must be encoded as
0xaabbggrrin numbers, or as#rrggbbaaor HTML color names in strings with theTO_COLORAttributeTransform. - In the TypeScript API, utilities have been added to
HrzProtocolHelperto work with these attributes.
- Mapbox
- Using
hrz:attributesmetadata is no longer necessary in Mapbox scenes.
- Using
- 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
AttributeValueandInMemoryAttributeValue:int_valueis nowint64_value, but prefernumber_valueunless values outside of [-253 - 1, 253 - 1] are expected.uint_valueis nowuint64_value, but prefernumber_valueunless values greater or equal to 2^53 are expected.float_valueis nownumber_value.color_valueis nownumber_valuewith0xaabbggrr, orstring_valuewith theTO_COLORAttributeTransform.
- In
Version 24.2.2 - 2024-09-25
Fixed
- Fixed 3D models of
i3dmtiles sometimes using models from otheri3dmtiles. - 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_groundparameter toSingleModelLayerto automatically clamp single models to the ground using their anchor as reference.
- Added a
blur_sizeparameter 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
tilejsonversion field are now parsed on a best-effort basis.
Removed
- Styling scripts
- The
to_uintandto_intfunctions have been removed as they are no longer necessary. - The
xorlogical operator has been removed.
- The
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_sizeparameter to 1.2, and halve the disc radius.
Version 24.2.0 - 2024-07-15
Added
- Vector tiles
- The
static_tilesproperty has been added toVectorTilesLayer. Setting it totrueprevents the representations of a vector tile layer from being automatically updated on source data invalidations, but decreases the CPU and memory costs. UntiledVectorDataProviderParamsnow have thetoleranceparameter, to control how much geometries are simplified.- The
VectorGeometryTypeenumeration can now be used in style scripts. - The
clip_to_tileparameter has been added toModelVectorRepr. It allows discarding features that are in the margin of the tiles, to avoid duplicated model instances.
- The
- Styling
- Added
lerpandmix_colorsfunctions 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
TextAlignmentandVectorGeometryType.- A new operator has been introduced to access enumeration values:
enum().
- A new operator has been introduced to access enumeration values:
- Added the
round,floor, andceiloperators. - Added uniforms which are values that are constant for all features inside a tile.
- Added the
tile_zandtile_depthuniforms, for vector tiles and 3D tiles respectively, which give access to a tile’s depth inside styling scripts.
- Added
- Symbols
- Some properties of
TextSymbolElementhave been made stylable per-instance:outline_width,alignment, andline_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_unitproperty ofTextSymbolElement. - Added culling priorities.
- The new
culling_priorityproperty ofAnchorSymbolElementcan be used to control how features within representations of equal z-index cull each other. - The
z_indexproperty ofSymbolVectorReprcan 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.
- The new
- Some properties of
- Mapbox
- Polygon patterns (configured through the
fill-patternproperty) are now translated into flat overlay polygon patterns. - The properties
text-halo-width,text-justify, andtext-line-heightare now translated more faithfully when they use expressions. - The
round,floor, andceiloperators are now supported.
- Polygon patterns (configured through the
- Camera
- Added the ability to retrieve the view box & polygon for all views associated with a given a camera through the
GetCameraViewBoxandGetCameraViewPolygonmethods ofCameraService. - 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.
- Added the ability to retrieve the view box & polygon for all views associated with a given a camera through the
- 3D Tiles
- Added support for composite (
cmpt) tiles.
- Added support for composite (
- 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.
- Their color, density, proximity and falloff can be customized. Refer to the documentation for detailed explanations of each parameter of
- Added the
wrap_lightingparameter, 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.
- Added the option to render up to two layers of ambient fog in the scene.
Changed
- Camera
- The old
GetCameraViewBoxandGetCameraViewPolygonmethods ofCameraServicehave been renamed toGetSceneViewViewBoxandGetSceneViewViewPolygon. - Orbit camera bounds straddling the antimeridian are no longer considered as invalid and are not ignored.
- The old
- 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
scaleproperty ofModelVectorReprhas been changed to aVec3fProperty.
- 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,SunSettingsandAmbientLightingSettings.- See the documentation or the upgrade notes for more information.
- The
enable_atmospheretoggle has been replaced with three differentmodeparameters, which makes it possible to mix and match simulated or non-simulated behaviors for the sky, sun and ambient lighting. - The
sun_strengthandambient_strengthhave been replaced with two parameters:sun_ambient_balancecontrols the impact of sunlight in relation to the ambient light. The default is0.5and applies both of them equally. At0.0there is no sunlight, and at1.0there is no ambient light.lighting_strengthapplies a uniform scaling factor to both sources equally. The default is1.0.
- Reorganized
Removed
- Vector data
- The
guess_max_levelparameter ofUntiledVectorDataProviderParamshas been removed. Tiles are now always generated up to the level required to preserve all details. Themax_zoomparameter value is still used as an upper bound.
- The
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-widthproperty) have been adjusted to better match the intended appearance.
- Text outlines (defined with the
- Avoid downloading external glTF models from
i3dm3D 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_occlusionsflag 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
GetCameraViewBoxandGetCameraViewPolygonfromCameraServicemust be renamed toGetSceneViewViewBoxandGetSceneViewViewPolygonrespectively.
- Previous calls to
- 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(ofTextSymbolElement) must be set toOUTLINE_WIDTH_IN_EMand 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
VectorGeometryTypedirectly withenum("VectorGeometryType", "<type>").
- 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.
AmbientSettingssun_ambient_balanceandlighting_strengthshould be set according to the values of the now removedsun_strengthandambient_strengthparameters:- If
sun_strength == ambient_strength:sun_ambient_balanceshould be set to0.5.lighting_strengthshould be set to their value.
- If
sun_strength < ambient_strength:sun_ambient_balanceshould be set to0.5 * sun_strength / ambient_strength.lighting_strengthshould be set toambient_strength.
- If
sun_strength > ambient_strength:sun_ambient_balanceshould be set to1.0 - 0.5 * ambient_strength / sun_strength.lighting_strengthshould be set tosun_strength.
- If
- The
modeparameter of theSkySettings,SunSettingsandAmbientLightingSettingsmessages insideAmbientSettingsshould be set according the the value of the now removedenable_atmosphereparameter:- If it was
true, they should be set to respectivelySKY_SIMULATED,SUN_LIGHTING_SIMULATEDandAMBIENT_LIGHTING_SIMULATED. - If it was
false, they should be set to respectivelySKY_STATIC,SUN_LIGHTING_STATICandAMBIENT_LIGHTING_STATIC.
- If it was
SkySettings’sattenuationshould be set to the value of the now removedatmosphere_attenuation.SkySettings’sstatic_colorshould be set to the value of the now removedsky_color.SunSettings’sstatic_colorshould be set to pure white.AmbientLightingSettings’sstatic_colorshould be set to the value of the now removedambient_color.SunDirectionSettings’smodeshould be set toSUN_DIRECTION_RELATIVE_TO_DATE, andday_of_yearandlocal_solar_timeto the same value they had inAmbientSettings.
Integration notes
- Vector data
- Set the
static_tilesproperty ofVectorTilesLayertotruefor 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.
- Set the
ModelVectorRepr- The three components of the default value of the
scaleproperty ofModelVectorReprshould all be set to the previous default value. - Styling scripts that assign values to the
scaleproperty 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_tileparameter totrue, 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.)
- The three components of the default value of the
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
- Attributions
- Added custom attribution fields to data providers which normally have their attributions embedded in the data itself.
- This can be used to add attributions when they are not specified in the data, but known by the application.
- Those fields have been added to single models, 3D Tiles, TileJSON vectors, ArcGIS rasters, Cesium terrain tiles, TileJSON rasters, TMS rasters, and WMS rasters.
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
i3dmtiles. - 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.
- Added support for the Instanced 3D Model (
- 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_tileparameter toSymbolVectorRepr. It allows discarding features that are in the margin of the tiles, to avoid duplicated symbols.
- Mapbox
- Added support for translating
symbollayers. - 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_paramsandignore_terrain_paramsproperties toMapboxTranslationParams. which leave the current scene views’AmbientSettingsandTerrainSettingsunchanged.
- Added support for translating
- 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.
- Added support for boolean properties with
- Camera
- Added a
continuous_movement_interruptionfield toCameraMovementto 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
CameraNotificationmessage to the message queue that notifies when animations and continuous movements begin, end, or are interrupted.
- Added a
- Attributions
- Added a
ViewerServicemethodSetAttributionEnabledto 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.
- Added a
- 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_typeproperty ofEditableShapeGeometry. - 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_shadowsparameter ofLightingSettingshas been split intocast_shadowsandreceive_shadows, which respectively control objects casting shadows on other objects, and objects receiving shadows from other objects. - Changed the
display_childproperty ofOptionalSymbolElementto aBoolProperty. - 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_shadowsandreceive_shadowsfields ofLightingSettingsshould be set to the previous value ofenable_shadowsto reproduce the previous behaviour. - The
default_valueof thedisplay_childproperty ofOptionalSymbolElementis now a boolean instead of anint64. The boolean must be set tofalseif the previous value was0, ortrueotherwise.
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_tileparameter ofSymbolVectorReprtotrue, 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_workingindicator being stuck totruewhen 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_alignmentproperty ofAnchorSymbolElementbeing applied incorrectly when set through the styling script. - Fixed passing a null attribute value to Horizon using
ProvideVectorDatatriggering 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’smin_level,max_levelandbounds.- The provider’s
guess_max_levelsetting uses a level where all features look close enough to their most detailed version. The layer’smax_levelis used as an upper bound.
- The provider’s
- Added the
clip_to_tileoption toExtrudedGeometryVectorRepr. - 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
ANDrelationship 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_overlaysofThreeDTilesLayer. - Flat overlays can be disabled by setting the property
disable_flat_overlaysofViewerOptionstotrue. 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.
- Added the new
- Symbols
- Added screen-space symbols culling.
- Three new flags have been added to
AnchorSymbolElementto control this behaviour:can_overlap_other_symbols,hides_other_symbols, andis_optional.
- Three new flags have been added to
- Added a new
keep_uprightoption toAnchorSymbolElementto keep symbols readable when they would normally look flipped or upside down. - Added
position_offset_relative_scalingandelement_size_relative_scalingtoAnchorSymbolElement, which only applies if the size unit of the corresponding property is set toSYMBOL_SIZE_IN_PIXELS.SYMBOL_RELATIVE_SCALING_NONEgives all symbols on screen the exact pixel size specified in their configuration.SYMBOL_RELATIVE_SCALING_REF_DISTANCEscales the specified symbol size based on their distance relatively to thereference_distance,min_relative_sizeandmax_relative_size.SYMBOL_RELATIVE_SCALING_CAMERA_HEIGHTscales the specified symbol size based on the height of the camera,min_relative_sizeandmax_relative_size.
- Added an option to draw symbols over everything else in the scene.
- Added screen-space symbols culling.
- 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.
- Added the new
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_terrainofViewerOptionsno 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’sposition_offset_is_relativeandelement_size_is_relative. Seeposition_offset_relative_scalingandelement_size_relative_scalinginstead.
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_workingstatus 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_viewsfield ofVectorTilesLayershould be set to show all views to preserve the behaviour of previous versions. AnchorSymbolElement’sposition_offset_is_relativeandelement_size_is_relativebooleans have been replaced by theposition_offset_relative_scalingandelement_size_relative_scalingproperties.- To match the previous behavior, if the booleans were set to false,
SYMBOL_RELATIVE_SCALING_NONEshould be used for their equivalent : otherwise,SYMBOL_RELATIVE_SCALING_REF_DISTANCEshould be used instead. SYMBOL_RELATIVE_SCALING_CAMERA_HEIGHTcan be used to scale the symbol automatically based on the height of the camera, instead of having to manually set thereference_distance.- It is easier to set up, but gives less control over the final sizes than
SYMBOL_RELATIVE_SCALING_REF_DISTANCE.
- It is easier to set up, but gives less control over the final sizes than
- To match the previous behavior, if the booleans were set to false,
- 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_PROVIDERshould be preferred over aTILED_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
trueandfalse.
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
- 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
- The
ImageFitenum and its values has been renamed toBoxFitAxes. - The
fitparameter ofImageSymbolElementhas been renamed tofit_axes.
- The
- 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_workingflag is no longer set totruewhen 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 toBOX_FIT_AXES_. - The
fitparameter ofImageSymbolElementmust be renamed tofit_axes. - To reproduce the previous layouting behaviour, the
fit_modeparameters ofImageSymbolElementandDecoratedShapeSymbolElementshould be set toBOX_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
timeoutfield ofClientVectorDataProviderParams. The value0(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 to5to 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
scaleproperty of the text and sprite representations. - Added the ability to configure a default value for the
textproperty 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()andhsla()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, anddesaturate. - 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
VectorDataSourcecan now be used to request tile geometries from the client, and is no longer restricted to attribute values.- This is controlled by the
has_geometryfield ofVectorDataSource. - A
VectorDataRequestMessagemessage is sent through the message queue when a vector tile is required. They must be answered using theProvideVectorDatamethod ofClientDataService. - Tile geometries can be invalidated to be requested again with the
InvalidateVectorDatamethod. - Geometry cannot be requested if the
accessfield ofClientVectorDataProviderParamsis not set toACCESS_BY_TILE.
- This is controlled by the
- Client attribute values can now be requested by tile coordinates rather than feature IDs.
- This is controlled by the
accessfield ofClientVectorDataProviderParams, 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.
- This is controlled by the
- Client providers of
- 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_ratioparameter toViewerOptionsto override the detected value.
- Added the ability to interpolate the color of extruded vector geometry using the new styling properties
lower_color,upper_colorandroof_color(seeExtrudedGeometryVectorRepr). - 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
AssetRequestMessagewill be sent to the message queue, which the client should answer using theProvideAssetDatamethod ofClientDataService. - Additional request messages will be sent if other assets are required.
- An
- Added an
atmosphere_attenuationparameter toAmbientSettingsto 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
GizmoReferenceFrameof each component. - Added a new special attribute for retrieving the angle at the anchor of polylines. See
anchor_angle_attribute_nameinVectorTilesStyle. - 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_namefield ofVectorTilesStylehas been renamed toanchor_z_attribute_name. - The
CENTROIDvariant ofVectorClampModehas been renamed toANCHOR.
- 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
AttributeServicetoClientDataService. - Removed the
AddAttributeValuesandInvalidateAttributeValuesmethods ofAttributeService.ProvideVectorDataandInvalidateVectorDataofClientDataServicemust be used in their place.
- Vector data
FeatureAttributeValuehas been renamed toAttributeValue.FeatureIdAttributeValuehas been renamed toFeatureAttributeValue.- Its
attribute_idfield has been renamed toid.
- Its
- The
valuesfield ofFeatureIdhas been renamed toattributes.
- Changed styling script
rgb()andrgba()functions to behave like actual functions and not constant literals. They now accept expressions as parameters. - Changed the names of
SpriteRepr,ModelReprandStemReprtoSpriteVectorRepr,ModelVectorReprandStemVectorReprrespectively to be more consistent with the naming of the other representations. - Changed the names inside
VectorReprTypeenum 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_errorfield ofVectorTilesLayernow accepts floating point values instead of integers. - The
active_componentfield of a gizmo layer has been removed and is replaced by an array ofGizmoComponent. - The
reference_framefields 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
- Removed the
colorstyling property ofExtrudedGeometryVectorRepr.
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,ModelReprandStemReprmust be renamed toSpriteVectorRepr,ModelVectorReprandStemVectorReprrespectively.VectorReprTypeenum 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
scaleproperty of sprites and texts to 1.
ExtrudedGeometryVectorRepr- To match their previous appearance, set the property name of the
lower_color,upper_color, androof_colorstyling properties tocolor, and their default value to that of the oldcolorproperty. - 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.
- To match their previous appearance, set the property name of the
- Client-provided attribute values
ATTRIBUTE_REQUESTmessages have been removed,VECTOR_DATA_REQUEST_MESSAGEmessages 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
VectorDataSourceare requested per message instead.
- Messages do not request the values of a single attribute anymore. Values for all attributes defined in the corresponding
- Calls to the
AddAttributeValuesandInvalidateAttributeValuesmethods ofAttributeServicemust be replaced by calls toProvideVectorDataandInvalidateVectorDataofClientDataService.
- Vector data
- References to
FeatureAttributeValuemust be updated toAttributeValues. - References to
FeatureIdAttributeValuemust be updated toFeatureAttributeValue. References to itsattribute_idfield must be updated toid. - References to the
valuesfield ofFeatureIdmust be updated toattributes.
- References to
- Feature anchors
- In
VectorTilesStyle, thecentroid_z_attribute_namefield must be renamed toanchor_z_attribute_name. - The
CENTROIDvariant ofVectorClampModemust be renamed toANCHOR.
- In
- The value of
atmosphere_attenuationinAmbientSettingsshould be set to0to reproduce the previous atmosphere appearance. The default value is0.5which 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_componentfield needs to be replaced by the appropriate components in the new array. The following lists gives which components types are required in thecomponentsarray to copy the previous behaviour:GizmoComponent.NO_COMPONENTneeds the array to be empty.GizmoComponent.TRANSLATION_COMPONENTneeds components of typeGIZMO_ORIGIN,GIZMO_TRANSLATION_AXIS_X,GIZMO_TRANSLATION_AXIS_Y,GIZMO_TRANSLATION_AXIS_Z,GIZMO_TRANSLATION_PLANE_X,GIZMO_TRANSLATION_PLANE_Y,GIZMO_TRANSLATION_PLANE_ZandGIZMO_TRANSLATION_PLANE_CAMERA_PLANE.GizmoComponent.ROTATION_COMPONENTneeds components of typeGIZMO_ORIGIN,GIZMO_ROTATION_RING_X,GIZMO_ROTATION_RING_Y,GIZMO_ROTATION_RING_ZandGIZMO_ROTATION_RING_CAMERA_PLANE.
- A gizmo
reference_framefield 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
GetCameraViewPolygonandGetCameraViewBoxbeing 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.
- Fixed
- 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-elsechains. - 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_basisuglTF extension. They are usable with both single models and 3D Tiles. - The
KHR_materials_unlitglTF extension is now supported. - Added the
rotation_orderrepresentation property toModelRepr, which defines the order in which the three components of the rotation are applied to the models.
- Added support for compressed textures with the
- 3D Tiles
- The
3DTILES_content_gltf3D Tiles extension is now supported, which allows the use ofglTForGLBfiles to define the contents of tiles, without having to use ab3dmfile. - The
refinement_hysteresisproperty has been added to theThreeDTilesLayerstructure. It allows controlling how sensitive the tile refinement process is to small camera movements.
- The
- Heatmaps
- Added the new
HeatmapVectorReprrepresentation. It is used to display aggregations of points as a flat overlay on the planet. - Added the
heatmapsfield toVectorPickResults, which contains the picked value and ID of each heatmap representation of the vector tiles layer.
- Added the new
- 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_speedproperty andanimation_speedstyling property. - Added the ability to define the color of gaps between dashes with the new
default_empty_colorproperty andempty_colorstyling property. - Added gradient dashes which can be toggled with the new
dash_modeproperty. - 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
InMemoryVectorFeatureGeometryby specifying a series of sizes using thelinestring_sizesproperty. - 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.
- Added the ability to represent multi-polylines using
- Styling
- Added a new
alpha()built-in function in style scripts used for modifying the alpha channel of a given colour.
- Added a new
- Rasters
- TileJSON rasters can be loaded with the new TileJSON raster provider.
- Camera
- All camera movements now have inertia, given by the
inertiafields ofCameraSettings. - The
LatLonAltToPixelCoordsmethod now returns a newbelow_horizonfield to indicate that the position is in the camera frustum, but below the horizon.
- All camera movements now have inertia, given by the
- Graphics configuration
- Added the
GetConfigurationmethod toViewerService, which allows to query the engine for the graphics level that was deduced at initialization (if thegraphics_levelproperty ofViewerOptionswas set toGraphicsLevelAuto), memory restrictions, as well as the features that are enabled and various other graphics settings. - Added the
graphics_settings_overridesproperty toViewerOptions, which allows to replace the values of different graphics settings and features of Horizon (which are otherwise set by the engine according to the selectedgraphics_leveland 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_enabledgraphics setting is overriden tofalsewith thegraphics_settings_overridesproperty ofViewerOptions. - The CPU-based 3D renderer SwiftShader is now detected and low graphics settings are applied when it is used.
- Added the
force_flat_overlay_renderviewer option, which is used for development.
- Added the
- Added the desktop-exclusive
native_http_referrerviewer option, which sets the value given to theRefererheader of HTTP requests made by the native client. - Added the
SetUserInteractionsEnabledmethod toViewerService, 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_capturewas true in theViewerOptions. In that case, they cannot be enabled.
Changed
- Polylines
- Replaced the
default_dash_ratioproperty ofFlatOverlayVectorReprand its associated styling propertydash_ratiowith the newdefault_dash_lengthanddash_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_tipsis set to true.
- Replaced the
- Vector data
- Renamed
ring_sizestolinestring_sizesinInMemoryVectorFeatureGeometryandEditableShapeGeometry. - Changed the parsing of GeoJSON
MultiLineStringfeatures 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
VectorDataSourceAccessany more. - The completion status of vector data downloads is less often checked (i.e. not every frame), freeing some CPU time.
- Renamed
- Styling
- Style script functions now accept multiple variable arguments.
- Style script
emit_namedandemit_idinstructions are now grouped under a uniqueemitinstruction. Theemitinstruction 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
GetCameraAngularViewpointhas 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_KEYHrzProtocol.KeyActionare 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_interruptiblefield fromResetNorthParams. Those animations are now always interruptible. - Removed the
is_interruptibleandanimation_optionsfields fromCameraMovement. Movements (both instant and continuous) are now driven by the camera inertia and are always interruptible.
- Removed the
Fixed
- Rasters
- Cesium terrain layers determine their bounds with the contents of the
availableproperty from thelayer.jsonfile instead ofbounds, similarly to Cesium. - The Cesium terrain tile provider has been made more cache-friendly when multiple URL patterns are used.
- Cesium terrain layers determine their bounds with the contents of the
- 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 of0.3. - The
inertiafields ofCameraSettingsshould be set to a positive value. The default value given by Horizon is0.06. The lower this value is, the stiffer the camera feels.
- The 3D Tiles refinement hysteresis is now a property of the layer instead of being hardcoded. The default value is
- Vectors
- The new
rotation_orderrepresentation property ofModelReprshould be set toEULER_ZYXto match the behaviour of previous versions. - Dashed polylines, in order to keep the same appearance, should have their property
dash_modeinFlatOverlayVectorReprset toDASH_ENABLED_FILLED,dash_period_unitanddash_length_unitset toDASH_SIZE_IN_METERS, anddash_lengthset to the product of their previousdash_ratioby theirdash_period. - Convert all vector data layers to providers. In
VectorDataSource, the provider type is determined by the value of theprovider_typeproperty, and the configuration of the providers themselves takes place in their respective structure:TiledVectorDataProviderParams,InMemoryVectorDataProviderParams, andClientVectorDataProviderParams.
- The new
- Styling
emit_namedandemit_idin style scripts must be replaced by theemitinstruction.
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_overridesproperty ofViewerOptionshas been added to provide a more granular configuration of the engine when needed, thegraphics_levelshould 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_enabledtofalsein thegraphics_settings_overridesproperty ofViewerOptionsat initialisation time if the situation favours image quality and CPU usage instead of video memory usage.
- While the
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.baseURIis 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
ETagandLast-Modified. - The web version still uses the browser’s cache.
- The size of the cache can be configured using the
native_http_cache_sizefield ofViewerOptions. - The cache can be cleared using the
ClearHttpCachemethod ofViewerService.
- Added HTTP caching to the native version, which handles basic caching and validation with
- 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_compileon 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
ViewerOptionswith theshow_loading_screenparameter. - Added
MessageType.VIEWER_READY_MESSAGEmessage that lets the user know when the engine is ready to render scenes. - Added
MessageType.VIEWER_LOADING_PROGRESS_MESSAGEmessage that regularly informs the user on how far is the viewer from being ready. - Added an option in the
ViewerOptionsnamedforce_shader_compilationto force the compilation and link of all the shaders during startup. Refer to the documentation for more details.
- 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
- Memory management
- The
max_video_memory_sizeproperty has been added toViewerOptions. It allows limiting how much video memory can be allocated by the viewer.
- The
- 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.
- Added a new style script function
- Monitoring
- Added the new
MonitoringServiceto control the engine’s monitoring features and access the collected information. - Added a
namefield toLayerCreateInfo. 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
RenameLayerandGetLayermethods toLayerService. - The
force_renderoption ofViewerOptionscan now be enabled or disabled at runtime using the developer UI, under theMonitoringmenu.
- Added the new
- Added the
disable_terrainoption toViewerOptionswhich 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_uioption inViewerOptions. Not providing aKeyBindingfor theTOGGLE_DEV_UIKeyActionis enough to prevent its usage. - Removed the
monitoring_auto_connectandmonitoring_serveroptions fromViewerOptions. Their utility lives on with theSetMonitoringServerAddressandConnectToMonitoringServermethods ofMonitoringService.
Fixed
- Fixed
SetOrbitusing bounds not working when called just after initializing the engine. - Fixed
IsWorking()in theViewerServicealways returning true when theforce_renderoption was enabled in theViewerOptions. - 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_sizeofViewerOptionsis 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
KeyActionviewer 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_graphicsfield ofViewerOptionshas been replaced bygraphics_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, andworker_countofViewerOptionsare 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
ScheduleFrameCapturemethod ofViewerServiceand waiting for aframe_capturemessage 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
- Removed the
FrameAndCapturemethod ofViewerService.
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
FrameAndCapturemethod ofViewerServicemust be changed to calls toScheduleFrameCapture, followed by checking the message queue for aframe_capturemessage. Note that it is necessary to let the engine run normally to eventually receive a result. - The
low_graphicsfield ofViewerOptionshas been replaced bygraphics_level. Set this value toHighto matchlow_graphics = false. Set this value toLowto matchlow_graphics = true. UsingAutois recommended unless you want a specific features set.Mediumoffers 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
KeyActionMOD_KEYin theViewerOptions.
Integration notes
- If the web runtime files (
hrz_core.js,hrz_core.worker.js, andhrz_core.wasm) are not located in the same directory as the page’s HTML file, use theruntimeFilesBaseUrlparameter ofHrzCoreBackend.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 themax_wasm_memory_sizeproperty. - 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 theblob_memory_pool_sizeproperty. 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.
- The maximum amount of memory that a web instance is allowed to use can be configured in
- Styling scripts
- Added the
modoperator to compute integer or floating-point division remainder in value expressions.
- Added the
- 3D Tiles
- Attributes encoded using the
3DTILES_batch_table_hierarchyextension can now be decoded. - When using the
3DTILES_batch_table_hierarchyextension, the class name and class ID of each batch can be used as attributes by using the correspondingThreeDTileAttributeSourceinThreeDTileAttribute. - String attributes from batch tables can now be loaded.
- Attributes encoded using the
- 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
GizmoLayerfor 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
PickScreenmethod ofViewerService. - Added the
FetchRasterDatamethod toViewerServiceto 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.
- 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
- 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 thefeature_color_blend_modeproperty which controls the way feature colours are blended with the source texture. - Along with the blend mode, the new
feature_color_blend_strengthproperty 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_idsofVectorAttributetotrue. - 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.
- Feature IDs of vector tiles can be loaded as regular attribute values, by setting the
- 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, andhrz_core.wasm.
- Interactions
- The argument given to the
PickScreenmethod ofViewerServiceis now aPickRequestobject instead of aVec2ui. - Raster layers are now excluded from the picking process when their handles are not passed to the
PickScreenmethod. - The
positionandgeo_posfields ofPickResultsandMouseHoverInfoMessagecan now be undefined, meaning that the mouse was hovering nothing.
- The argument given to the
- 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_attributesinVectorDataLayer,is_feature_idinInMemoryAttributeandThreeDTileAttribute.) - 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
sourcefield, that takes aThreeDTileAttributeSourceenum value. It replaces thefrom_vector_data_layerfield ofThreeDTileAttribute. - The
SelectObjects,DeselectObjects, andDeselectAllObjectsmethods ofViewerServicehave been renamed to, respectively,SelectFeatures,DeselectFeatures, andDeselectAllFeatures. TheObjectReferencesmessage has been replaced withFeatureReferences.
- 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. (
- Gizmos
- The size of a gizmo can now be defined in meters or relative to the screen size using its new
size_unitproperty (SeeUiSizeUnit). - The lines and grids shown during a translation now keep their correct orientation when the translation happens at a high altitude.
- The size of a gizmo can now be defined in meters or relative to the screen size using its new
- 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_nameofVectorDataSourceandid_attribute_nameofThreeDTilesLayerhave been removed as now feature IDs are made from regular attribute values. - The field
has_feature_idsofVectorDataSourcehas 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
ResetNorthmethod ofCameraServicemoving away from the set target of a camera in fixed target mode. - Fixed coordinate parsing of Geobuf multilinestrings and multipolygons.
- Fixed the
IsWorkingmethod ofViewerServicereturningfalsewhen 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
- The
Wgs84Bounds,Wgs84VolumeBoundsandWgs84ViewPolygonmessages have been renamed toGeographicBounds,GeographicVolumeBoundsandGeographicViewPolygon.
- The
- 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_modefield set toBLEND_MULTIPLYandfeature_color_blend_strengthto1.0in order for the feature color to be applied in the same way.
- Single model layers and 3D Tiles layers’ material properties, as well as vector tiles layers’ sprite and 3D model representations should have their
- Interactions
- The
Vec2uithat was previously given to thePickScreenmethod ofViewerServicemust now be passed through thecoordsfield of aPickRequestobject. - 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_rastersfield ofPickRequest.
- The
- 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_nameofVectorDataSourceorid_attribute_nameofThreeDTilesLayer, 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, andDeselectAllObjectsmethods with their corresponding new versions:SelectFeatures,DeselectFeatures, andDeselectAllFeatures.
- Size units
- The
size_unitfield of the gizmo layers should be set toUI_SIZE_IN_PIXELSto keep their previous behaviour. - The references to the enum
PolylineSizeUnitmust use its new nameInWorldSizeUnit. Its valuesLINE_SIZE_IN_METERSandLINE_SIZE_IN_PIXELSmust be replaced withIN_WORLD_SIZE_IN_METERSandIN_WORLD_SIZE_IN_PIXELS. - The references to the enum
SizeUnitmust use its new nameSymbolicSizeUnit. Its valuesSIZE_IN_METERS,SIZE_IN_PIXELSandSIZE_RELATIVE_TO_IMAGEmust be replaced withSYMBOLIC_SIZE_IN_METERS,SYMBOLIC_SIZE_IN_PIXELS, andSYMBOLIC_SIZE_RELATIVE_TO_IMAGE.
- The
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 respectivelysame-originandrequire-corp. - All the files (web pages, Horizon files, scene data files) must be served with the HTTPS protocol.
- The
max_wasm_memory_sizesetting inViewerOptionscan 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 forblob_memory_pool_sizeand 600 MiB formax_wasm_memory_sizeshould be suitable for typical mobile devices. (Note that Safari allocates allmax_wasm_memory_sizeat 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 formax_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.
- Added support for multi-texturing on single models and 3D Tiles.
- Vectors
- Vector data can now be loaded from Geobuf files.
- GeoJSON files with
FeatureorGeometryroot objects are supported. - The
GeometryCollectionGeoJSON 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
TextVectorReprfor 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
VectorTilesSourceare only used ifoverride_boundsandoverride_levels, respectively, are set totrue. 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_nameand not the regular feature ID whenid_field_namehas 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.
- The bounds and zoom levels set on
- 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_workingstate getting stuck totruewhen 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_boundsandoverride_levelsproperties ofVectorTilesSourcetotrueif values that are more restrictive than what is set in the vector data layer are set toboundsandmin_level/max_level, respectively. - The
active_materialproperty ofSingleModelLayerandThreeDTilesLayermust now be set inmaterial_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_valuefield ofSingleModelPickingResultandThreeDTilesPickResult. - The width of flat overlay polylines can now be expressed in meters or pixel using the
line_width_unitfield ofFlatOverlayVectorRepr. - 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. SeeKeyActionfor the full list of key-bindable actions. - Added
ToggleDevUiandMoveDevUiToCursormethods toViewerServiceto open and move the development UI programmatically. - Added a
DeleteSelectedControlPointmethod toShapeEditorService. - Added a
ResetNorthmethod toCameraServiceto reorient the camera towards the north pole in accordance with the manipulator used.
- Key bindings for actions such as re-orienting the camera, toggling the development UI or deselecting all the features can now be specified in
- Rasters
- The image format can now be specified for ArcGIS raster layers that use the “export image” service.
- Added
jpgpngto 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
SceneDumpServicewith two methods (DumpSceneandLoadDump). 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.
- 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
- 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
Syncversions of the scene dump library functions no longer return aPromise.
- This library is now just a façade in front of the
- 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
releaseanddebugvariants of the C++ packages are now shipped in a single archive.
Removed
- Removed the
emitinstruction 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
supportedImageFormatTypesfield. - 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
emitinstruction can no longer be used. Useemit_idandemit_namedinstead.
Version 0.13.0 - 2022-03-31
Added
- 3D Tiles
- 3D Tiles layers now have the same multi-materials capabilities as single 3D models. Namely they now support the
KHR_materials_variantsandSIRADEL_templated_image_urlglTF extensions. - The
SIRADEL_data_textureextension was already supported, but the data texture palette is now configured via the materials.
- 3D Tiles layers now have the same multi-materials capabilities as single 3D models. Namely they now support the
- 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_PROVIDERraster 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
gridfield ofGizmoLayer. - Each representation now has a mandatory
idfield that must be unique to the layer. This ID is now used with theemit_idinstruction instead of the index of the representation. - The background color of the planet can now be changed using the
terrain_colorfield ofTerrainSettings, which is part ofSceneViewSettings.
Changed
- Rasters
- The property
layersIdsonArcGisRasterProviderParamshas been renamed tolayerIds. - 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.)
- The property
- Vectors
- The
nameof eachVectorRepris now optional but can still be used with theemitoremit_namedinstructions. - 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.
- The
- UI elements (clipping plane grids and gizmos) now use enhanced techniques to properly handle transparency. This mode is disabled when
low_graphicsmode is enabled. - The mouse pointer can now leave the canvas (or window) without interrupting ongoing drag operations.
Deprecated
- The
emitinstruction in styling scripts has been deprecated and should be replaced byemit_named. It will be removed in a later update.
Removed
- Removed the
prioritize_lossless_imagesparameter from the configuration of WMTS, WMS, and ArcGIS raster providers.
Fixed
- Rasters
- Fixed loading ArcGIS raster tiles when the
levelValueproperty 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.
- Fixed loading ArcGIS raster tiles when the
- 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_palettefield ofThreeDTilesLayerhas been removed. Its value must be specified in aMaterialin thematerialsfield. - The name of the material containing the palette must be set in the
active_materialfield for it to still be applied to the model.
- The
- Rasters
- Set the layer ID list on
ArcGisRasterProviderParamsstructures with thelayerIdsproperty instead oflayersIds. - If the
prioritize_lossless_imagesparameter 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 thesource_image_formatparameter.
- Set the layer ID list on
- The
idfield of eachVectorReprmust be filled with a unique ID per layer. - The
emitinstruction in styling scripts should be replaced byemit_named. When possible, it is even better to useemit_id. - The
terrain_colorfield ofTerrainSettingsin eachSceneViewSettingsshould be set tor = 0, g = 0, b = 1, a = 1to 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_idinstead ofemit(oremit_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.SendEventsmethod to send events (keyboard, mouse, touch, etc.) directly to the engine from the integrating application. - Added a new
disable_events_captureoption inViewerOptionsthat 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 theSendEventsmethod.
- Added a new
Changed
- C++ bindings
hrz_core::Backendandhrz_api::Apiare now both instantiated using their staticcreatemethod. 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:41001SRID is now accepted. It is an alias ofEPSG: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_modefield toPERCEPTUAL_OKLABto match the 0.12.0 behaviour. - All numeric palettes should set their
interpolation_modefield toSRGBto 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_variantsextension is now supported, allowing multiple materials to be defined by a glTF model. Thevariant_namefield of aMaterialcan reference such variants to switch between them at runtime. - The
SIRADEL_templated_image_urlextension 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 theurlsfield of aMaterial. - The
SIRADEL_data_textureextension is now supported, which allows glTF models to use textures containing scalar values than can be colorized using a palette defined in thedata_texture_palettefield of aMaterial.
- The
- Single model layers can now define and use multiple materials.
- 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
WmtsProviderParamsfor more information. - WMS layers can now be displayed. Server-side layer composition, style selection, custom background colour, and additional dimensions are supported. See
WmsRasterProviderParamsfor 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
ArcGisRasterProviderParamsfor more information. tilemapresource.xmlfiles 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.
- 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
- 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
ConfigureMouseHovermethod of theViewerService. Its update rate can be configured the same way. - The highlight colour can be configured using the
mouse_hover_highlight_colorfield of theHighlightSettingsfield 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.xmlfile as input) are now their ownRasterProviderType: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_typefield of theTiledImageRasterProviderParamsstructure has been removed, as now raster layers with aTILED_IMAGE_PROVIDERcan only use a tile URL pattern. - Imagery rasters are now visible in all scene views by default.
- Tile Map Service (TMS) raster layers (i.e. using a
- 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
- The
EnableMouseHoverInfoMessagesmethod of theViewerServicehas been renamed toConfigureMouseHoverand now usesMouseHoverConfigurationas parameter. - The rate of mouse hover info messages can now be configured with
MouseHoverConfiguration.
- The
- 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_PROVIDERwith aFROM_TILEMAP_RESOURCEsource_typemust now use aTMS_PROVIDER. - The
source_typefield of remainingTILED_IMAGE_PROVIDERraster layers should no longer be defined.
- Raster layers using a
- Mouse hover info
- Calls to the
EnableMouseHoverInfoMessagesmethod of theViewerServiceshould be replaced with calls toConfigureMouseHover. - Its former boolean parameter is now the
enable_infofield ofMouseHoverConfiguration. - The
info_rate_msfield should be set to 250 ms to match the previous behaviour.
- Calls to the
- Scene view settings
- Multiple fields of the
HighlightSettingshave been renamed:color,outline_alpha,outline_size, andocclusion_alphaare now prefixed withselection_. Their meaning remains unchanged.
- Multiple fields of the
- 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_periodanddash_ratioproperties in the styling script. - The altitude offset of extruded vectors can now be set per instance using the
altitude_offsetproperty in the styling script. - The type of a feature can be provided to the styling script as an attribute using the
feature_type_attribute_namefield ofVectorTilesStyle.
- For polylines in flat overlay, the period and ratio of the dashes can now be set per instance using the
- 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_lightingparameters 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_shadowsparameters 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
CameraServicefor 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_idinstruction 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,
emitcan now use a dynamic value expression for the name of the representation to emit. - Rasters
FailurePolicyhas been replaced byMissingTilePolicy, 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
- Camera
CameraSettingsmust now use aCameraIndexas path root to specify what camera model to access.- All camera transition messages (
FixedTargetCameraTransition,FixedPositionCameraTransition, andOrbitCameraTransition) now include acamera_indexfield that must be set to the appropriateCameraIndex. By default this should beCAMERA_0. - The
GetCameraPose,GetCameraAngularViewpoint, andGetCameraPositionalViewpointmethods ofCameraServicemust now use aCameraIndexReferenceas argument. By default this should beCAMERA_0.
- Multiview
SceneViewSettingsmust now include aCameraIndexin theircamerafield to specify which camera the view should use. By default this should beCAMERA_0.
- Vectors
- The
dash_periodfield ofFlatOverlayVectorReprshould be renamed todefault_dash_period. - The
dash_ratiofield ofFlatOverlayVectorReprshould be renamed todefault_dash_ratio. - The
altitude_offsetfield ofExtrudedGeometryVectorReprshould be renamed todefault_altitude_offset.
- The
- The
min_render_distancefield ofImpostorParamsshould be replaced by amax_screen_size_pixelsfield with an appropriate value. Sane values are usually around 100~150 pixels. See the documentation for more details. - The
enable_lightingandenable_shadowsfields ofSceneViewSettingsshould be moved inside the new field namedlighting. - The new
lightingfield ofSingleModelLayer,VectorTilesLayer,ThreeDTilesLayer,TerrainSettings,ExtrudedGeometryVectorRepr,CylinderVectorRepr, andModelReprshould be set to{ enable_lighting = true, enable_shadows = true }. - The
failure_policyfield ofRastershould be removed and replaced by themissing_tile_policyinside the corresponding raster provider of typeTiledImageRasterProviderParams,BingProviderParams, orSingleImageRasterProviderParams.- The
NO_FAILURESfailure policy corresponds to theUSE_LOWER_RESOLUTIONmissing tile policy. - The
FAILURES_ALLOWEDfailure policy corresponds to theUSE_EMPTY_TILEmissing tile policy.
- The
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 aSceneViewIndexas root parameter. - New
viewportfield 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
viewportfield of the viewport settings. - It is also possible to only display a fraction of this viewport using the
scissorfield 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.
- New scene model root:
- Clipping
- Added clipping plane layers.
- To use clipping plane layer, every layer eligible can modify their
clip_idproperty to match the clipping plane layer’sclip_idproperty.
- 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
AmbientSettingsto 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
SceneSettingsto control the appearance of raster layers.compensate_raster_inclinationandmix_raster_lodsmake raster LOD transitions less abrupt, by attenuating the effect of uneven terrain and interpolating between LODs.max_screen_space_errorcontrols how much rasters can be stretched before having to be refined when zooming-in.
- Added more settings to
- Sprites can now have their size relative to their image by using the
SizeUnitSIZE_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_namefield ofVectorTilesStyle.
Changed
- The properties
offset_{xyz}on sprite, text, and model vector representations have been renamed toworld_offset_{xyz}. - The
PickScreenandPickScreenAreamethods now return tickets optionally. For example when the request was outside of all viewports, no ticket is returned. - The
GetCameraViewBox,GetCameraViewPolygon, andLatLonAltToPixelCoordsmethods of theCameraServicenow take into account what scene view to use. - Camera settings (the
CameraSettingsstructure) now have their own scene model root instead of being embedded in the scene settings. - The previous scene settings have been moved to the
SceneViewSettingsscene model root. - The
SceneSettingsroot now contains the global configuration of the scene views. - Bounds in the
VectorDataLayer,VectorTilesSource, andBoundsVisibilityConstraintnow use theWgs84Boundsstructure. 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
b3dmtiles (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_workingstate 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
BALLISTICtrajectory. - 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
PickScreenandPickScreenAreanow return new structures (PickRequestResultandPickAreaRequestResult) which contain an optional picking ticket and a boolean indicating whether the ticket is present or not. Applications should check thehas_a_ticketfield to know whether a result message is expected to be returned by the engine or not.
- The
- Camera
- The
camera_settingsfield should be removed fromSceneSettingsand set into the newCameraSettingsscene model root. - The
GetCameraViewBoxandGetCameraViewPolygonmethods of theCameraServiceshould useSCENE_VIEW_0in theirSceneViewReferenceparameter. - The
LatLonAltToPixelCoordsmethod of theCameraServiceshould useSCENE_VIEW_0in itsGeographicPositionInSceneViewparameter. - Bounds in the
BoundsVisibilityConstraintstructure must be converted toWgs84Bounds.x_min,y_min,x_max, andy_maxrespectively becomewest,south,east, andnorth.
- The
- Multiview
- All previous scene settings should be placed in the
SceneViewSettingsroot with parameterSCENE_VIEW_0. SceneViewSettings.viewport.viewportshould be set tox_min = 0,x_max = 1,y_min = 0,y_max = 1.SceneViewSettings.viewport.scissorshould be set tox_min = 0,x_max = 1,y_min = 0,y_max = 1.- In the new
SceneSettingsroot, the main view should be set toSCENE_VIEW_0and the active views bitset to 1. - The
scene_viewsfield ofSingleModelLayershould be set tobits = 1. - The
scene_viewsfield ofThreeDTilesLayershould be set tobits = 1. - The
scene_viewsfield of everyVectorReprentry ofVectorTilesLayershould be set tobits = 1. - The
scene_viewsfield ofImageryRasterLayershould be set tobits = 1. - The
groupfield ofDtmRasterLayerhas been removed.
- All previous scene settings should be placed in the
- Clipping
- All new
clip_idproperties inVectorTilesLayer,ThreeDTilesLayer,SingleModelLayerandTerrainSettingsmust be set to -1.
- All new
- Vectors
- Bounds in the
VectorDataLayerandVectorTilesSourcestructures must be converted toWgs84Bounds. See the note aboutBoundsVisibilityConstraintabove.
- Bounds in the
- Aesthetics
- The
sun_strengthandambient_strengthfields ofAmbientSettingsshould be set to 1. - The
ambient_colorfield ofAmbientSettingsshould be set torgb = 0.42. - The
sky_colorfield ofAmbientSettingsshould be set to black. - The
underground_colorfield ofAmbientSettingsshould be set to black. - The
compensate_raster_inclinationandmix_raster_lodsfields ofSceneSettingscan be set totruefor smoother raster layers. - The
max_screen_space_errorfield ofSceneSettingscan be set to a value that fits the balance between details and bandwith for the client. A value of2reproduces the previous behaviour.
- The
- The styling scripts should be updated to use the property names
world_offset_{xyz}instead ofoffset_{xyz}for sprite, text, and model vector representations.
Version 0.9.3 - 2021-07-06
Changed
- An attempt at loading
b3dmtiles (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, orSetFixedPositionmethods of the camera service to both change the current manipulator type, and change the current viewpoint. - The
Viewpointstructure has been replaced byAngularViewpoint. - The
GetCameraViewpointmethod has been replaced byGetCameraAngularViewpoint. - The
MoveToPoseParamsstructure has been removed. Use one of theSet[Manipulator]methods that accept a pose in theirviewunion. - The
MoveToViewpointParamsstructure has been removed. Use one of theSet[Manipulator]methods that accept an angular viewpoint in theirviewunion. - The
MoveToBoundsParamsstructure has been removed. Use one of theSet[Manipulator]methods that accept bounds in theirviewunion. - 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.
- Use the
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_periodanddash_ratioproperties. See the documentation for more details. - The round tips of polylines segments can now be disabled using the
round_tipsproperty. This is useful when using the dashed style. - The inside or outside of polylines can be hidden using the
sideproperty. - 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.MoveCameraToPosemethod. - When moving the camera, a trajectory type can be passed in the animation options. The
BALLISTICtrajectory type makes the camera go up in the sky in order to enhance the visual feedback of the movement. - New
GetCameraPosemethod inCameraService, which returns the camera’s current position and orientation.
- The camera position and orientation can now be set with the
- 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_workingreturning 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
GetCameramethod inCameraServicehas been renamed toGetCameraViewpoint. - 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
GetCameraPosemethod inCameraServicewas returning position with radians coordinates whereas documentation stated it was in degrees. It now returns position in degrees following the documentation. - Camera
- The
GetCameramethod inCameraServicehas been renamed toGetCameraViewpoint. - The
MoveCameramethod inCameraServicehas been renamed toMoveCameraToViewpoint. - The
GetCameraPosemethod inCameraServicewas returning position with radians coordinates whereas documentation stated it was in degrees. It now returns position in degrees following the documentation.
- The
Fixed
- TypeScript:
HrzCoreBackend.init()now takes anIViewerOptionsinstead of aViewerOptionsfor the viewer option object.
Upgrade notes
- Picking, mouse hover info
- The
pickedunion in theMouseHoverInfoMessagehas been replaced with apickedfield of typeTypedObjectReference. - A single model layer object reference is now of type
LayerHandleinstance ofMouseHoverInfoSingleModel. MouseHoverInfoVectorTileshas been renamed toVectorTilesObjectReference.MouseHoverInfoThreeDTileshas been renamed toThreeDTilesObjectReference.
- The
- Flat overlay representation
- The
dash_periodfield should be set to a positive non-zero value. - The
dash_ratiofield should be set to1. - The
round_tipsfield should be set totrue. - The
sidefield should be set toPolylineSide.SIDE_BOTH.
- The
- Camera
- Previous calls to
CameraService.GetCamerashould be renamed toCameraService.GetCameraViewpoint. - Previous calls to
CameraService.GetCameraPoseshould consider position coordinates to be in degrees instead of radians. - Previous calls to
CameraService.MoveCamerashould be renamed toCameraService.MoveCameraToViewpoint. CameraMoveInfoshas been renamedMoveToViewpointParams.CameraMoveToBoundsInfoshas been renamedMoveToBoundsParams.- Setting the field
CameraAnimationOptions.trajectory_typeto the valueTrajectoryType.BALLISTICwhen switching viewpoints enhances the visual feedback of the movement. (The default value,TrajectoryType.INTERPOLATED, corresponds to the previous behaviour.)
- Previous calls to
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
GetCameraPosemethod inCameraService, 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
1are drawn over (and therefore can hide) features with the value0.
- 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
- 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,CENTROIDorPER_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
minandmaxoperators 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
highlightpart of the scene settings.
- Visibility
- Add a
visibleproperty on all layers exceptVECTOR_DATA. Settingvisibletofalseprevents downloading and displaying the layer data.
- Add a
- Added new Bing imagery types:
ROAD_DARK,ROAD_GRAYSCALE, andROAD_LIGHT. See the Bing Maps documentation for more details. - Added a utility function in
CameraServiceto 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.ViewerOptionsin 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.
- When the failure policy of a Bing provider is set to
- 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
regionbounding 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_workingmethod erroneously returnedtruewhen root tiles of external 3D Tiles tilesets failed to decode properly.
Version 0.7.1 - 2020-12-11
Added
- The
MASKalpha mode of glTF materials is now supported, along with thealphaCutoffparameter.
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
BLENDalpha 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.
- 3D Tiles can now be displayed, using a new layer type. Currently, only Batched 3D Model (
- 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 inrgb(). - 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. SeeHrzProtocol.Paletteand the “Styling API” section in the documentation for examples. - Add the ability to use arithmetic function in the
setinstruction:add,sub,mul,div,inv,abs,negcan 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.
- Add hexadecimal support for literals with the following form:
- 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_lightingandenable_shadowsfromSceneSettings.ambient.
- Local solar time and day of year can be set in
- Data formats
- Draco-compressed glTF models are supported.
- WebP images are supported.
- 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 withViewService.EnableMousePositionMessages()
- Add the ability to receive regular mouse position updates through the message queue. This avoids calling
- New
horizon-scene-dumpTypeScript 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 now4278255360(0xff00ff00).
- 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
- 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
PalettizedImageRasterProviderimagery raster provider.- Takes another raster provider and a palette as input.
- The raster provider is another provider for
ImageryRasterLayer(ex:TiledImageRasterProvider) alongside newR_F32_SILICIUMimage 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.
- The raster provider is another provider for
- Outputs a RGBA raster after applying the palette given by user.
- Takes another raster provider and a palette as input.
- 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 --tmscompatibleparameters. - They can be loaded through a
tilemapresource.xmlfile.
- These tilesets can be generated by gdal2tiles, with the
- Support for
tilemapresource.xmlfiles with therasterprofile.- 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_8used for imagery andSIGNED_FIXED_24_8for elevation rasters produced internally. - New synchronous TypeScript interfaces
HrzApi.SyncBackendandHrzApi.SyncApihave been added. The default backend,HrzCoreBackendimplementsSyncBackend. - 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 exampleLayerImageryRasterPathis nowImageryRasterLayerPath.) - The tiling scheme API for raster layers has been streamlined. The three types are now
GLOBAL,LOCAL, andUNTILEDGLOBALis 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.LOCALis used when the tiles are created inside the bounds of the raster.UNTILEDis for displaying a single image.
- Consider that the level 0 comprises only one tile, covering the whole planet, for rasters from
tilemapresource.xmlin themercatorprofile. (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.BackendandHrzApi.Apihave been renamedHrzApi.AsyncBackendandHrzApi.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_namein 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.xmlin themercatorprofile 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
ywith{-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 MBhrz_worker.wasm: From 1.6 MB to 0.75 MB
Removed
- The “tiled web map type” enumeration (with
XYZ,TMS, andQUADKEYoptions) 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.xmlfiles. - Fix properties being overridden when using
tilemapresource.xmlfiles.
Version 0.2.0 - 2020-03-02
Added
- Support for HTTPS on desktop.
- Bing Maps raster provider, see the
BingProviderParamsmessage. - The tiled raster provider can now use a
tilemapresource.xmlfile. See thetilemap_resource_urlfield in theTiledImageRasterProviderParamsmessage. - The documentation now includes illustrated examples.
- The URL of
.wasmfiles 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.