# Changelog

## tyler 0.4.1 (2026-04-30)

The main features of the new version:

- The dependency on geoflow is completely removed, and the glTF conversion was ported to Rust.
- Tyler can now read regular CityJSON files, CityJSONSeq files, and the legacy feature-files as input.
- Improved parallelism so Tyler scales better with the available CPU cores.
- Several existing bugs have been fixed in the glTF conversion and tileset generation, so implicit tilesets are fully functional.
- Performance improvements throughout the codebase, resulting in significant speedups.

### Added

- Native GLB generation in Rust through `cityjson-convert`, so Tyler no longer depends on an external `geoflow` installation for export.
- Optional intermediary tile materialization in CityJSONSeq format for debugging.
- First-class `cjindex` input support for `cityjsonseq`, `cityjson`, and `feature-files` datasets.
- `--include-parent-attributes` for 3DBAG/roofer-style parent-child datasets.
- `--smooth-normals` for smoother glTF output.
- A `just ci-check` recipe and the GitHub Actions workflow that runs it.
- ADRs and supporting documentation for the `cjindex` input model, CityJSONSeq exchange, and grid traversal changes.
- A repo-local profiling workflow driven by `just profile`, `scripts/profile-tyler.sh`, and Geodepot-backed profile-by-name resolution.
- Per-run profiling artifacts under `docs/performance/runs/`, including structured summaries for `perf stat` and Valgrind Massif.
- Retention of raw profiling artifacts and Tyler output under the gitignored `docs/performance/runs/raw/` tree for later analysis.
- Runner selection for profiling sessions so `perf` and Massif can be run independently or together, with failed runs preserved for later inspection.
- A focused CLI/debug regression test suite for intermediary tile preparation, debug data replay, grid export/load, tileset-only runs, and object-attribute mapping.
- A `just coverage` recipe backed by `cargo tarpaulin`, plus a recorded baseline under `docs/testing/coverage-baseline.md`.

### Changed

- Tyler now resolves every input through `cjindex`; the old `metadata.city.json` + `**/*.city.jsonl` parser is gone. Tyler now takes a single dataset root input instead of separate `--metadata` and
  `--features` arguments.
- Tile-model building now relies on `cityjson_lib::ops::merge` to reconcile mixed input transforms, so cjindex inputs with differing transforms no longer need local normalization.
- Large `cjindex` runs are handled in page-sized chunks with thread-local index reuse, which cuts repeated reads during extent and tile processing.
- Grid indexing for `cjindex` inputs now consumes decoded scan pages directly instead of paging references and issuing per-feature reads.
- Grid vertex counting now accumulates directly into per-cell counts, avoiding per-feature vertex-cell sorting except for thresholded large-feature parallelism.
- Tile conversion now uses thread-local `CityIndex` handles for cjindex reads and defers normal per-feature cleanup until after tile model merging.
- The CityJSON-to-GLB pre-write path now skips redundant cleanup and filtering work where the GLB output would not change, and records extra timing information around the remaining hot spots.
- Tyler no longer depends on an external `geoflow-bundle` installation for GLB export.
- For implicit 3D Tiles, tiling is now performed in geographic coordinates.
- 3D Tiles now use `region` bounding volumes instead of boxes.
- `--debug-dump-data` now dumps bincode snapshots and intermediary per-tile CityJSONFeature streams under `debug/`, and `RUST_LOG=debug` follows the same dump path while also enabling debug logging.
- `--debug-load-data` now continues to support partial replay from any available subset of dumped debug data, and `--debug-load-grid` now actively reloads exported `grid.tsv` and `features.tsv` data
  for quadtree recomputation.
- The CLI debug/export surface was consolidated: `--debug-tile-inputs` became `--debug-dump-data`, `--grid-export` became `--debug-dump-grid`, `--grid-export-features` became
  `--debug-dump-grid-features`, `--grid-file` became `--debug-load-grid`, `--3dtiles-tileset-only` became `--debug-3dtiles-tileset-only`, and `--geometric-error-factor` became
  `--3dtiles-geometric-error-factor` with the `-e` shorthand removed.
- `--object-attributes` now accepts comma-separated `name:type` mappings and still subsets and coerces CityObject attributes before GLB export.
- `--include-parent-attributes` now copies inherited parent attributes even when the parent object type itself is not selected.
- `--3dtiles-metadata-class` now defaults to `citymodel`.
- When no `--lod-*` override is supplied, Tyler now keeps the highest available LoD per CityObject by default.
- CityObject type and LoD filtering now run once through the shared `cjindex` filtering path before extent, grid, tile, and export decisions, so tile bounds and output content use the same retained
  geometry.
- README, Dockerfiles, Nix, and bundled resources were updated for the new pipeline.

### Fixed

- Missing explicit `--lod-*` selections now fail before tile export with diagnostics for available LoDs instead of producing empty tile models late in the pipeline.
- `--object-type Building` filtering now keeps descendant geometry such as `BuildingPart` objects when those children are part of the selected building hierarchy.

## tyler 0.3.14 (2025-10-22)

### Fixed

- Median calculation in compute_grid_statistics was incorrect. The case when 0-2 grid cells had vertices was not
  handled correctly.

## tyler 0.3.11 (2024-07-25)

### Fixed

- If there is only a single tile, the root contains the content and the tileset geometricError is
  0.00. ([#45](https://github.com/3DGI/tyler/issues/45))

## tyler 0.3.10 (2024-03-08)

### Changed

- Update geoflow-bundle docker image

### Added

- The `smooth-normals` and `simplification-max-error` options

## tyler 0.3.9 (2023-12-09)

### Fixed

- Parsing CityObjects without a `geometry` member
- Median vertex count from a single CityObject

## tyler 0.3.8 (2023-09-18)

### Changed

- Remove debug info from release build
- Geometric error above the leafs defaults to 12
- Update geoflow-bundle docker image

## tyler 0.3.7 (2023-08-21)

### Fixed

- Geometric error calculation for the parents of the deepest leaves, where the leaf has an edge length of the grid
  cellsize.
- Replace maxz in leaf content if minz is greater than maxz.
- Tile bounding volume when tile is empty.
- Fixed the hardcoded timeout.

### Added

- Set content bounding volume from tile bounding volume with the `--3dtiles-content-bv-from-tile` option. Required when
  the tile content is clipped to the tile's extent, for example for terrain.
- Write quadtree content bounding box to .tsv with `--grid-export`.
- Log all arguments in debug.
- Split an explicit tileset to external tilesets if the tree is deep.
- GitHub Action for publishing to DockerHub to `3dgi/tyler` ([#40](https://github.com/3DGI/tyler/pull/40))

### Changed

- Debug data, incl. `--grid-export`, is written to the `debug` directory within the `--output` directory.
- Remove logging from geof. Speeds up the conversion and fixes the extreme memory consumption when geof emits a large
  amount of messages.
- Use BufWriter for writing the input paths.
- Implement parallel computation for the extent, where the direct subdirectories of `--features` are visited in
  parallel (but their contents are processed sequentially).
- Floats in the 3D Tiles tileset.json are written with 2 decimals
- Implement parallel indexing of the features, where the direct subdirectories of `--features` are visited in parallel (
  but their contents are processed sequentially).
- The grid is centered at the computed extent, instead of matching their origin.
- Rename `tiles` directory to `t` to save space in the tileset.json
- The tile content bounding volume, `content.boundingVolume`, is not added to the tile content anymore. You need to
  enable this option if you want to include the content bounding volumes. Enable it with `--3dtiles-content-add-bv`.
- The grid's cell size is adjusted so that it is possible to construct a tightly fit square of 4^n cells. The final cell
  size will be larger than what is set with `--grid-cellsize`.

## tyler 0.3.6 (2023-07-17)

### Changed

- The `--grid-export` switch does not export the feature centroids anymore. Use the `--grid-export-features` if you want
  to export the feature centroids together with the grid cells.
- Write both pruned and unpruned tilesets. Unpruned tiles are only written in debug mode.
- Reduced the logging in debug mode.

### Fixed

- Invalid subtree for implicit tiling, in case of very large areas (eg. the Netherlands).

### Added

- Write the `world`, `quadtree` and `tiles_failed` instances to bincode when running in debug mode. The instances can be
  loaded for debugging with the `--debug-load-data`, in which case tyler will load the instance data instead of
  generating it.
- Describe how to generate debug data.

## tyler 0.3.5 (2023-06-28)

### Added

- Option to only generate and write the 3D Tiles tileset, without running the glTF export. Enable
  with `--3dtiles-tileset-only`.
- Timeout `--timeout` in seconds for the converter subprocesses. If speficied, tyler will kill the subprocess after the
  provided seconds, otherwise it will wait for the process to finish.

### Fixed

- geoflow version reporting

## tyler 0.3.4 (2023-06-22)

### Fixed

- geoflow-bundle version in the docker image

## tyler 0.3.3 (2023-06-19)

### Fixed

- Infinite loop in the glb conversion in geoflow-bundle, in a rare case during the mesh simplification.
- Infinite loop in case there is not a single CityJSONFeature file in the directory tree.

### Changed

- tyler and geoflow versions are reported as info

## tyler 0.3.2 (2023-05-05)

### Fixed

- *proj* related fixes for running Tyler under Windows

## tyler 0.3.1 (2023-04-06)

### Changed

- Add the *proj* crate as a submodule, because the proj-sys build script need to be changed so that proj-sys can be
  built with MYSYS2 on Windows (see https://github.com/georust/proj/pull/156).
- Warning instead of error when the gltf export in the subprocess fails (fixes #36).
- The geoflow flowchart directory can be set at runtime with the `TYLER_RESOURCES_DIR` environment variable. By default,
  the directory is set to the `CARGO_MANIFEST_DIR` at compile time.
- Features are assigned to tiles based on their bounding box, instead of only their vertices (fixes #28).
- Update the geoflow docker image.
- Improve documentation.

## tyler 0.3.0 (2023-03-17)

First public release of Tyler.
With this version Tyler can generate [3D Tiles v1.1](https://docs.ogc.org/cs/22-025r4/22-025r4.html)
from [CityJSONFeatures](https://www.cityjson.org/specs/1.1.3/#text-sequences-and-streaming-with-cityjsonfeature) that
are stored individually in files.

Details of the 3D Tiles output:

- The tileset content if binary glTF (.glb).
- The glTF assets contain feature metadata (per CityObject), using
  the [EXT_mesh_features](https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_mesh_features)
  and [EXT_structural_metadata](https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_structural_metadata)
  extensions.
- The features are colored to default values, and the colors can by set per CityObject type.
- The glTF files are compressed, using
  the [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_mesh_quantization)
  and [EXT_meshopt_compression](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/EXT_meshopt_compression)
  extensions.
- Implicit tiling is supported (optional).

The current version depends on the [geoflow-bundle](https://github.com/geoflow3d/geoflow-bundle) for converting
CityJSONFeatures to glTF.
Therefore, we strongly recommend to use the provided docker image for running Tyler.
