Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,19 @@

All notable changes to this project are documented here.

The project has not tagged a release. The release sequence is in
[the roadmap](docs/roadmap/README.md); the task-level record is
Released versions are recorded in [the release records](docs/releases/README.md).
The release sequence is in [the roadmap](docs/roadmap/README.md); the task-level
record is
[implementation status](docs/roadmap/implementation-status.md).

## [Unreleased]

- No unreleased changes.

## [0.2.0] - 2026-09-05

### Added

- Connected the strict 1-based GeoTIFF `band` argument to metadata and mesh
authoring, with parser regression coverage for normalization and rejection.
- Read GDAL band metadata for descriptions, units, scale, and offset, and apply
Expand All @@ -19,6 +26,15 @@ The project has not tagged a release. The release sequence is in
`GTIF012` diagnostics before pixel buffers are allocated.
- Added an OpenUSD-backed 2x2 mesh authoring regression test and integrated it
into the `ost build` / `ost test` workflow.
- Added windowed GeoTIFF reads for strips and tiles through `ReadWindow`,
`ReadTile`, and `ReadScanlines`, including single-band selection and output
type conversion.
- Added Deflate, LZW, PackBits, horizontal differencing, and floating-point
predictor decoding, plus chunky and separate planar configurations.
- Added read planning, adjacent-range coalescing, I/O counters, amplification
reporting, memory budgets, cancellation, and overview selection.
- Added coverage for the supported integer and floating-point sample formats,
compressed paths, and mid-read cancellation.

## [0.1.0] - 2026-08-27

Expand Down
17 changes: 9 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ OpenUSD FileFormat Plugins and libraries for raster and grid geospatial data.
The project reads GeoTIFF first, through a windowed, transport-independent
reader, and authors the result into existing OpenUSD schemas. The initial
metadata-to-regular-grid mesh slice is connected for synthetic and small
inputs; the specialized libtiff backend handles compressed windows. A
production GDAL adapter is planned as the preferred backend for general raster
dataset access and later format expansion.
inputs; the specialized libtiff backend handles compressed windows, and the
reader reports planning and I/O statistics. A production GDAL adapter is
planned as the preferred backend for general raster dataset access and later
format expansion.

**What it does**

Expand Down Expand Up @@ -36,17 +37,17 @@ resolver transport or expose GDAL types to plugin and authoring layers.
## Status

Early. The repository structure, core libraries, GeoTIFF metadata reader,
pixel windows including the supported compressed paths, and the first
regular-grid mesh authoring slice are implemented and tested. Broader read
planning and the full mesh argument and conversion surface remain planned. No
release has been tagged.
pixel windows including the supported compressed paths, read planning, and the
first regular-grid mesh authoring slice are implemented and tested. The v0.2.0
release covers the windowed pixel-read slice. The full mesh argument and
conversion surface remain planned.

| Milestone | Scope | Status |
| --- | --- | --- |
| 0 | Repository skeleton, CMake, OpenStrata workspace, CI, docs | done |
| 1 | Raster core value model, with no OpenUSD | done |
| 2 | GeoTIFF metadata and a metadata-only FileFormat Plugin | in progress |
| 3 | Windowed pixel reading | in progress |
| 3 | Windowed pixel reading | done |
| 4 | `UsdGeomMesh` authoring | in progress |

The task-level record is
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.1.0
0.2.0
4 changes: 2 additions & 2 deletions docs/architecture/WORKSPACE.md
Original file line number Diff line number Diff line change
Expand Up @@ -284,8 +284,8 @@ composed separately; see [RESOLVER_SOURCE.md](RESOLVER_SOURCE.md).

| Milestone | Boundary | Status |
| --- | --- | --- |
| v0.1.0 | repository structure, raster core, GeoTIFF metadata, metadata-only FileFormat Plugin | planned |
| v0.2.0 | band reads, `RasterWindow`, strip and tile layouts, NoData | planned |
| v0.1.0 | repository structure, raster core, GeoTIFF metadata, metadata-only FileFormat Plugin | released |
| v0.2.0 | band reads, `RasterWindow`, strip and tile layouts, NoData | released |
| v0.3.0 | DEM to `UsdGeomMesh`, coordinate transform, local origin, format arguments | planned |
| v0.4.0 | bounded-memory tiling and payload-backed authoring | planned |
| v0.5.0 | production converter, manifests, generated cache | planned |
Expand Down
8 changes: 4 additions & 4 deletions docs/design/DESIGN_POLICY.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ path for long-running deterministic payload and cache generation.

## 2. Current Assessment

Milestones 0 and 1 are complete. The GeoTIFF metadata, window-reading, and
initial regular-grid mesh slices are connected and tested; no release has been
tagged. The task-level record is
Milestones 0 through 3 are complete for the v0.2.0 scope. The GeoTIFF
metadata, window-reading, and initial regular-grid mesh slices are connected
and tested; v0.2.0 records the completed pixel-read release. The task-level record is
[implementation status](../roadmap/implementation-status.md).

The properties to establish and then preserve are:
Expand Down Expand Up @@ -191,7 +191,7 @@ Long conversions are not pushed into `SdfFileFormat::Read`. See
| Format | Status | Notes |
| --- | --- | --- |
| GeoTIFF (strip and tile, BigTIFF) | first target | metadata, then windows, then mesh |
| COG | planned as an optimization | overview discovery and tile-aware reads inside the GeoTIFF reader, not a separate parser |
| COG | planned as an optimization | tile-aware reads and remote performance inside the GeoTIFF reader, not a separate parser |
| PNG / JPEG + world file | candidate | no in-band georeferencing; requires explicit arguments |
| NetCDF / GRIB | candidate | multi-dimensional; needs a variable-selection contract first |
| Zarr | candidate | chunked object storage; depends on resolver maturity |
Expand Down
17 changes: 9 additions & 8 deletions docs/reference/CAPABILITY_MATRIX.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ What raster input is accepted, and what it becomes in USD.

The GeoTIFF metadata reader and the window reader are connected to the
`raster-geotiff` FileFormat plugin's library path. Deflate, LZW, and PackBits
decoding are available when the optional libtiff backend is enabled; uncompressed
floating-point predictor support is built into the reader, and read planning remains
later M3 work. Rows below distinguish the library
capability from the user-facing bundle.
decoding are available when the optional libtiff backend is enabled;
floating-point predictor support is built into the reader, and read planning,
range coalescing, counters, budgets, cancellation, and overview selection are
tested capabilities. Rows below distinguish the library capability from the
user-facing bundle.

Status vocabulary, from
[MODULE_README_CONTRACT.md](../contributing/MODULE_README_CONTRACT.md):
Expand Down Expand Up @@ -38,10 +39,10 @@ not planned explicitly out of scope
| Little-endian and big-endian headers | implemented | M2 | |
| Classic TIFF IFD traversal | implemented | M2 | |
| BigTIFF (64-bit offsets) | implemented | M2 | |
| Strip-organized data | implemented | M3 | Initial uncompressed reads whole rows |
| Tile-organized data | implemented | M3 | Initial uncompressed intersecting-tile reads |
| Strip-organized data | implemented | M3 | Reads whole intersecting rows and reports amplification |
| Tile-organized data | implemented | M3 | Reads only intersecting tiles when the source permits |
| Multiple IFDs / overviews | implemented | M9 | Discovered at M2, used at M9 |
| Planar configuration: chunky | implemented | M3 | Initial uncompressed path |
| Planar configuration: chunky | implemented | M3 | Window path |
| Planar configuration: separate | implemented | M3 | Single-band reads select one plane |
| Subfile / mask IFDs | not planned yet | | |

Expand Down Expand Up @@ -134,7 +135,7 @@ argument appears there only in the milestone that implements what it reaches.
| Source | Status | Milestone |
| --- | --- | --- |
| Local file | implemented | M2 |
| In-memory fixture | planned | M1 |
| In-memory fixture | implemented | M1 |
| Resolver-provided `ArAsset` | planned | M8 |
| HTTP implemented in this repository | not planned | Belongs to `usd-http-resolver` |

Expand Down
5 changes: 2 additions & 3 deletions docs/releases/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,15 @@ Released versions are recorded below. The remaining planned sequence follows.
| Version | Date | Record |
| --- | --- | --- |
| v0.1.0 | 2026-08-27 | [v0.1.0.md](v0.1.0.md) — GeoTIFF metadata FileFormat and packaged acceptance |
| v0.2.0 | 2026-09-05 | [v0.2.0.md](v0.2.0.md) — GeoTIFF windowed raster reads |

| Version | Planned theme |
| --- | --- |
| v0.1.0 | GeoTIFF metadata contract: repository structure, raster core, GeoTIFF header and metadata, metadata-only FileFormat Plugin |
| v0.2.0 | GeoTIFF raster reads: band reading, `RasterWindow`, strips and tiles, NoData |
| v0.3.0 | DEM to `UsdGeomMesh`: height mesh, coordinate transform, local origin, format arguments |
| v0.4.0 | Bounded-memory tiling: tiled mesh authoring and payloads |
| v0.5.0 | Production converter: CLI, manifests, generated cache |
| v0.6.0 | Resolver-backed GeoTIFF: remote `ArAsset` reads and `usd-http-resolver` compatibility |
| v0.7.0 | COG-aware optimization: overview selection, remote tile selectivity, performance baseline |
| v0.7.0 | COG-aware optimization: tile-aware planning, remote selectivity, performance baseline |

Scope per release is in the [roadmap](../roadmap/README.md).

Expand Down
67 changes: 67 additions & 0 deletions docs/releases/v0.2.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# v0.2.0

Released 2026-09-05.

## Scope

This release completes the GeoTIFF pixel-reading slice. It adds bounded,
windowed reads over strip- and tile-organized sources while preserving the
transport-independent `RandomAccessSource` boundary.

## Supported behavior

- `ReadWindow`, `ReadTile`, and `ReadScanlines` for single-band reads.
- Classic TIFF and BigTIFF strip and tile layouts, including chunky and
separate planar configuration.
- Uncompressed, Deflate, LZW, and PackBits decoding, with horizontal
differencing and floating-point predictors where supported by the backend.
- Unsigned and signed 8-, 16-, and 32-bit integer samples, plus 32- and 64-bit
IEEE floating-point samples, with output type conversion.
- Band scale and offset application through the `double` conversion path.
- Read planning, adjacent-range coalescing, requested-versus-fetched byte
counters, I/O amplification reporting, memory budgets, cancellation, and
overview selection.

## Authored USD

The FileFormat plugin exposes metadata and the initial regular-grid mesh
representation, including fixed topology, Y-up coordinates, a quantized local
origin, extent, conversion metadata, and the interactive vertex ceiling. The
pixel reader is also available through the GeoTIFF library contracts used by
that plugin.

## File-format arguments

The strict 1-based `band` argument is connected to metadata and mesh authoring.
Pixel reads select one band per call. The broader dynamic argument and
conversion surface remains planned for the v0.3.0 work.

## Known limitations

- The plugin is still a preview path, not a production converter or tiled
payload generator.
- Resolver-backed remote reads, HTTP transport, reprojection, and vertical
datum transformation remain outside this repository.
- Strip-organized sources read complete intersecting rows, so narrow windows
can have high I/O amplification; the reader reports it.
- JPEG, ZSTD, sub-byte, and complex samples are not supported.
- Multi-band composites and image authoring remain planned.

## Build requirements

CY2026 / OpenUSD 26.08, Python 3.13 for plugin tests, CMake, Ninja, and a C++17
compiler matching the runtime ABI. Direct aggregate runtime composition requires
OpenStrata 0.22.8 or newer.

## Dependencies and licensing

Project code is Apache-2.0. OpenUSD is a runtime/build dependency. The
optional libtiff backend is used for compressed decoding and carries the
libtiff and zlib notices recorded in `THIRD_PARTY_NOTICES.md`.

## Verification

The core-only lane, fixture determinism, workspace CTest, GeoTIFF sample-format
and compression tests, read-planning and I/O-statistics tests, cancellation
coverage, overview-selection tests, FileFormat L0-L4, product verification,
and repeatable package inventory are the release gates.
8 changes: 4 additions & 4 deletions docs/roadmap/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ The rationale for the split between preview and production is
| `v0.4.0` | Bounded-memory tiling | Tiled mesh authoring and payloads |
| `v0.5.0` | Production converter | CLI, manifests, generated cache |
| `v0.6.0` | Resolver-backed GeoTIFF | Remote `ArAsset` reads, `usd-http-resolver` compatibility |
| `v0.7.0` | COG-aware optimization | Overview selection, remote tile selectivity, performance baseline |
| `v0.7.0` | COG-aware optimization | Tile-aware planning, remote selectivity, performance baseline |
| Later | Format expansion | Additional raster formats after infrastructure maturity |
| Later | `usd-geospatial-core` extraction | Only when the duplication with `usd-pointcloud-plugins` is real and stable |

Expand All @@ -107,13 +107,13 @@ GeoTIFF -> usdGeoTiff ---\
| 0 | Repository skeleton: CMake, OpenStrata workspace, CI, docs structure, module README contract | done | — |
| 1 | Raster core value model and memory fixtures, with no OpenUSD | done | `v0.1.0` |
| 2 | GeoTIFF metadata: header, IFD, dimensions, bands, sample type, CRS, geotransform, NoData | next | `v0.1.0` |
| 3 | Pixel reading: strips, tiles, selected band, `RasterWindow`, bounded-memory decode | planned | `v0.2.0` |
| 3 | Pixel reading: strips, tiles, selected band, `RasterWindow`, bounded-memory decode | done | `v0.2.0` |
| 4 | `UsdGeomMesh` authoring: initial regular mesh slice landed; height scale, NoData, local origin, CRS metadata | in progress | `v0.3.0` |
| 5 | Dynamic FileFormat arguments plus the initial `usdRasterGdal` production adapter and GeoTIFF backend equivalence | planned | `v0.3.0` |
| 6 | Raster tiling: spatial tiles, payload generation, bounded memory | planned | `v0.4.0` |
| 7 | Converter: independent mesh and heightmap modes, deterministic output, manifests, generated cache, resumable workflow | planned | `v0.5.0` |
| 8 | Resolver interoperability: `ArAsset` adapter, remote GeoTIFF, integration tests | planned | `v0.6.0` |
| 9 | COG optimization: overview discovery, tile-aware reads, remote selectivity metrics | planned | `v0.7.0` |
| 9 | COG optimization: tile-aware reads, remote selectivity metrics, performance baseline | planned | `v0.7.0` |

Detail per milestone is in
[phase-0-repository-skeleton.md](phase-0-repository-skeleton.md),
Expand All @@ -131,7 +131,7 @@ maps onto the milestones above.
| --- | --- | --- | --- |
| W1 | Repository structure, CI, documentation contracts | 0 | done |
| W2 | Format-independent raster value model and diagnostics | 1 | done |
| W3 | GeoTIFF container, georeferencing, and windowed decoding | 2, 3 | next |
| W3 | GeoTIFF container, georeferencing, and windowed decoding | 2, 3 | in progress |
| W4 | Coordinate contract, mesh authoring, and golden tests | 4 | planned |
| W5 | Argument normalization, layer identity, plugin adapter | 5 | planned |
| W6 | Spatial tiling, payloads, bounded memory | 6 | planned |
Expand Down
24 changes: 12 additions & 12 deletions docs/roadmap/implementation-status.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ The task-level record of what exists. The
[capability matrix](../reference/CAPABILITY_MATRIX.md) records source support;
this file records work.

**Current state: milestones 0 and 1 are complete, and the GeoTIFF metadata
vertical slice is connected.** The repository skeleton, the OpenUSD-free core
lane, the core libraries, the initial GeoTIFF window reader, the metadata
authoring library, and the first format-specific plugin are built and tested.
The optional libtiff backend now decodes Deflate, LZW, and PackBits windows
through the RandomAccessSource client-I/O boundary. Uncompressed floating-point
predictor windows are decoded in the reader, and read planning, memory budgets,
**Current state: milestones 0 through 3 are complete for the v0.2.0 scope.**
The repository skeleton, the OpenUSD-free core lane, the core libraries, the
GeoTIFF window reader, the metadata authoring library, and the first
format-specific plugin are built and tested. The optional libtiff backend now
decodes Deflate, LZW, and PackBits windows through the RandomAccessSource
client-I/O boundary. Floating-point predictors, read planning, memory budgets,
tile-boundary cancellation, and overview selection are covered by tests.
Converter sources are not implemented yet. The initial
GeoTIFF-to-regular-grid mesh slice is now connected and tested, including its
interactive vertex ceiling, and no release has been tagged.
Converter sources and the broader mesh/conversion surface are not implemented
yet. The initial GeoTIFF-to-regular-grid mesh slice is connected and tested,
including its interactive vertex ceiling. The v0.2.0 release covers the
completed pixel-read slice.

Status words, from
[MODULE_README_CONTRACT.md](../contributing/MODULE_README_CONTRACT.md):
Expand Down Expand Up @@ -112,11 +112,11 @@ Detail in [phase-1-raster-core.md](phase-1-raster-core.md).
| `third_party/libtiff` dependency target and optional system discovery | implemented |
| ADR: libgeotiff versus in-repository key decoding | open |

## Milestone 3 — pixel reading (in progress, `v0.2.0`)
## Milestone 3 — pixel reading (done, `v0.2.0`)

| Task | Status |
| --- | --- |
| Initial uncompressed UInt16 and Float32 strip/tile decoding | implemented |
| UInt16 and Float32 strip/tile decoding | implemented |
| Deflate through the optional libtiff backend | implemented |
| LZW, PackBits | implemented |
| Horizontal differencing predictor | implemented |
Expand Down
9 changes: 4 additions & 5 deletions docs/roadmap/tiling-and-lod.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,8 @@ implementation. See [ADR-0002](../adr/0002-resolver-owns-transport.md).
COG is not a new parser. It is a layout convention over GeoTIFF, so this
milestone is an optimization of the existing reader.

- Overview discovery from the multi-IFD structure, and selection of the
coarsest level that satisfies the requested sampling step.
- Harden the existing overview selection against remote sources and record
the selected level in remote performance reports.
- Tile-aware read planning that prefers native tile boundaries.
- Reporting which overview level served each request.
- Remote selectivity metrics: requested bytes, fetched bytes, request count,
Expand All @@ -155,9 +155,8 @@ milestone is an optimization of the existing reader.

### Exit criteria

- A preview of a large COG reads from an overview rather than decimating
full-resolution data, proven by the level recorded in metadata and by the
byte counters.
- A preview of a large COG uses the selected overview through the resolver
source, proven by the level recorded in metadata and by the byte counters.
- Bytes fetched for a preview drop by an order of magnitude against the
Milestone 8 baseline on the same source.
- A GeoTIFF without overviews still works, decimating full-resolution data with
Expand Down
2 changes: 1 addition & 1 deletion libs/usd-geo-core/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.23)

project(usdGeoCore
VERSION 0.1.0
VERSION 0.2.0
DESCRIPTION "Format-independent geospatial values and diagnostics"
LANGUAGES CXX)

Expand Down
2 changes: 1 addition & 1 deletion libs/usd-geo-core/openstrata.library.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
schema: openstrata.library/v1alpha1
library:
id: usdGeoCore
version: 0.1.0
version: 0.2.0
cmake:
package: usdGeoCore
target: usdgeo::core
2 changes: 1 addition & 1 deletion libs/usd-geotiff/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.23)

project(usdGeoTiff
VERSION 0.1.0
VERSION 0.2.0
DESCRIPTION "OpenUSD-free GeoTIFF metadata reader"
LANGUAGES CXX)

Expand Down
4 changes: 2 additions & 2 deletions libs/usd-geotiff/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ materials. Mesh authoring is a subsequent milestone.
## Status

The classic and BigTIFF metadata path is implemented and tested for the
synthetic fixtures. Initial uncompressed chunky and separate-planar strip and
tile windows are implemented for UInt16 and Float32, including sampled reads,
synthetic fixtures. Chunky and separate-planar strip and tile windows are
implemented for UInt16 and Float32, including sampled reads,
endian conversion, GDAL band descriptions, units, scale, and offset. Deflate
windows are implemented through the optional libtiff backend. LZW and PackBits
are also available through that backend. Horizontal differencing predictors
Expand Down
2 changes: 1 addition & 1 deletion libs/usd-geotiff/openstrata.library.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
schema: openstrata.library/v1alpha1
library:
id: usdGeoTiff
version: 0.1.0
version: 0.2.0
cmake:
package: usdGeoTiff
target: usdgeotiff::core
Loading
Loading