Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
f498818
Remove the three workspace and migrate Seasonal Farm
charlieforward9 Oct 7, 2026
a5a7715
Document flat SplatLayer migration in native tree upgrade guide
charlieforward9 Oct 7, 2026
69b0bda
Record the complete TreeLayer, shared scene and Coit PR stack
charlieforward9 Oct 7, 2026
cb029ec
Record independent Coit and unified TreeLayer stack architecture
charlieforward9 Oct 7, 2026
9964c6e
Record final coverage, navigation and cold GPU regression gates
charlieforward9 Oct 7, 2026
97ceb11
Record final scene, inventory and example review regression gates
charlieforward9 Oct 8, 2026
dd81f7f
Record final appearance and world report regression gates
charlieforward9 Oct 8, 2026
e6bee79
Record final scene blending and forest validation boundaries
charlieforward9 Oct 8, 2026
2940f6a
Record bounded forest fixture geometry and overview coverage
charlieforward9 Oct 8, 2026
e46d892
Record the verified bounded forest software fixture
charlieforward9 Oct 8, 2026
779c8e2
Record fractional shadows and measurement lifecycle validation
charlieforward9 Oct 8, 2026
ecd1230
docs: record hidden tour and settled inventory regression gates
charlieforward9 Oct 8, 2026
8a8f2de
docs: record bounded shadow ordering and full forest season checks
charlieforward9 Oct 8, 2026
6e8cd80
docs: record settled source frames for forest controls
charlieforward9 Oct 8, 2026
1aacba2
docs: record all-species initialization and pixel verification lanes
charlieforward9 Oct 8, 2026
9a6e9d1
docs: record controlled frozen wind and timeline verification
charlieforward9 Oct 8, 2026
f71ba25
docs: record explicit software WebGL for ordinary CI
charlieforward9 Oct 8, 2026
26ad357
docs: state major-release gate for three removal
charlieforward9 Oct 11, 2026
c4d7f87
fix(website): redirect the removed three overview route
charlieforward9 Oct 11, 2026
07d5c85
docs: correct independent tree stack and migration boundaries
charlieforward9 Oct 12, 2026
8e71f65
Document the complete linear landing order
charlieforward9 Oct 12, 2026
ef880ac
test(farm): await GPU completion before device remount
charlieforward9 Oct 12, 2026
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
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@ An awesome list of community-driven modules, integrations, and tools built with
| **[arrow-layers](./modules/arrow-layers)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/arrow-layers.svg)](https://www.npmjs.com/package/@deck.gl-community/arrow-layers) | Apache Arrow visualization layers — render large columnar datasets directly on the GPU. |
| **[editable-layers](./modules/editable-layers)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/editable-layers.svg)](https://www.npmjs.com/package/@deck.gl-community/editable-layers) | Interactive drawing and editing layers for geospatial features. |
| **[geo-layers](./modules/geo-layers)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/geo-layers.svg)](https://www.npmjs.com/package/@deck.gl-community/geo-layers) | Suite of geospatial layers covering tile formats, terrain, and more. |
| **[layers](./modules/layers)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/layers.svg)](https://www.npmjs.com/package/@deck.gl-community/layers) | Additional community-contributed layers not yet in the official deck.gl release. |
| **[layers](./modules/layers)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/layers.svg)](https://www.npmjs.com/package/@deck.gl-community/layers) | Additional community-contributed layers, including the native procedural `TreeLayer`. |
| **[infovis-layers](./modules/infovis-layers)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/infovis-layers.svg)](https://www.npmjs.com/package/@deck.gl-community/infovis-layers) | Information visualization layers for non-geospatial, chart-style rendering. |
| **[graph-layers](./modules/graph-layers)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/graph-layers.svg)](https://www.npmjs.com/package/@deck.gl-community/graph-layers) | Graph and network visualization layers for deck.gl. |
| **[three](./modules/three)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/three.svg)](https://www.npmjs.com/package/@deck.gl-community/three) | Three.js-backed layers for deck.gl, including a fully parametric 3D `TreeLayer`. |
| **[widgets](./modules/widgets)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/widgets.svg)](https://www.npmjs.com/package/@deck.gl-community/widgets) | UI widgets (pan, zoom range, etc.) that integrate with deck.gl view state management. |
| **[react](./modules/react)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/react.svg)](https://www.npmjs.com/package/@deck.gl-community/react) | React components and hooks for building deck.gl applications. |
| **[react-fiber](./modules/react-fiber)** | [![npm](https://img.shields.io/npm/v/@deck.gl-community/react-fiber.svg)](https://www.npmjs.com/package/@deck.gl-community/react-fiber) | React Fiber renderer for composing deck.gl layers and views as React elements. |
Expand Down
15 changes: 10 additions & 5 deletions dev/splat-layer-spark-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ animation loop. Performance targets are measured separately for each backend.

## Implementation across the TreeLayer stack

The delivery order remains #807 → #794 → #806 → #808 → #809. The source contract in this
The delivery order is #807 (landed) → #794 → #806 → #808 → #809 → #814 → #815. The source contract in this
specification uses `data` for an asset or owner rows and `getSource` for per-owner asset resolution.
The current implementation revision establishes that contract for prepared assets. Streamed
RAD, SH, globally sorted presentation and paged residency remain upstream integration gates.
Expand All @@ -35,9 +35,11 @@ RAD, SH, globally sorted presentation and paged residency remain upstream integr
| [#808](https://github.com/visgl/deck.gl-community/pull/808) | Examples explain the new prepared API and quota behavior; historical films and timing fingerprints retain their original scope |
| [#809](https://github.com/visgl/deck.gl-community/pull/809) | Package and Seasonal Farm migration retain the same native TreeLayer; upgrade guidance covers the new flat asset inputs and compatibility rules |

The live PR heads checked for this revision are #807 `cae0ddd1`, #794 `92916af9`, #806 `4216f6e7`,
#808 `a3220808`, and #809 `825ed4ef`; `master` is `bc8e1139`. They are open PRs, not a merge-readiness
assertion. Implementation changes must be restacked into their owning PRs after verification.
#807 landed on master as `a46193f8`. The TreeLayer milestone ends at #809. The scene extension
#814 follows #809 to resolve overlapping integration files, and #815 follows #814. Coit has no
TreeLayer API prerequisite. See the
[stack record](./tree-splat-stack.md) for current landing and publication boundaries. The source
assessment below retains its historical fingerprints and does not establish current merge readiness.

### Prepared backend now implemented

Expand Down Expand Up @@ -76,7 +78,10 @@ not hard GPU memory or frame-time guarantees.
`getTransformMatrix` replaces orientation, scale and translation with a finite affine local
matrix, including covariance and conservative shear bounds. `splatStats` reports source/hierarchy
pairs, selected owners, submitted camera/shadow work, coarsest coverage and moving refinements.
Geographic inventory residency remains WorldTreeLayer's separate statistics lane.
Geographic inventory residency remains TreeLayer's separate `streamingStats` lane.
Use `data` for supplied rows or `getTileData` for a bounded inventory, with ordinary tree accessors
at the top level. WorldTreeLayer remains a deprecated compatibility wrapper around the internal
tile component. Coit depends on the shared SplatLayer runtime alone.

### Required scene backend work

Expand Down
68 changes: 68 additions & 0 deletions dev/tree-splat-stack.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# TreeLayer, Composite SplatLayer and Coit stack

Revised October 12, 2026. Arrows show landing order; dashed arrows cross repositories.
The remaining landing order is #794 → #806 → #808 → #809 → #814 → #815 after #807 landed.
Coit has no TreeLayer API prerequisite. The linear Git stack resolves shared documentation, exports,
website and CI changes before landing; the tree chain is complete at #809.

```mermaid
flowchart TD
L["luma.gl 9.4-release"] --> H["luma #3398 · borrowed host passes, affine pages and retained RAD refinement"]
M["deck.gl-community master"] --> P807["#807 · prepared Composite SplatLayer and shared budgets"]
P809 --> P814["#814 · shared static/RAD scenes, workers, residency and global ordering"]
H -. "compatible luma 9.4 prerequisite" .-> P814
P807 --> P794["#794 · native TreeLayer"]
P794 --> P806["#806 · unified TreeLayer inventory streaming"]
P806 --> P808["#808 · Tree Lab, Citrus, forest and world examples"]
P814 --> P815["#815 · independent Coit RAD example and website"]
P808 --> P809["#809 · Seasonal Farm migration and three workspace removal"]
click H "https://github.com/visgl/luma.gl/pull/3398"
click P807 "https://github.com/visgl/deck.gl-community/pull/807"
click P814 "https://github.com/visgl/deck.gl-community/pull/814"
click P794 "https://github.com/visgl/deck.gl-community/pull/794"
click P806 "https://github.com/visgl/deck.gl-community/pull/806"
click P808 "https://github.com/visgl/deck.gl-community/pull/808"
click P815 "https://github.com/visgl/deck.gl-community/pull/815"
click P809 "https://github.com/visgl/deck.gl-community/pull/809"
```

| PR | Base branch | Head branch |
| --- | --- | --- |
| [#807](https://github.com/visgl/deck.gl-community/pull/807), merged | `master` | `codex/tree-splat-canopy` |
| [#814](https://github.com/visgl/deck.gl-community/pull/814) | `codex/remove-three-module` | `codex/splat-scene-foundation` |
| [#794](https://github.com/visgl/deck.gl-community/pull/794) | `master` | `codex/native-tree-lab` |
| [#806](https://github.com/visgl/deck.gl-community/pull/806) | `codex/native-tree-lab` | `codex/tree-forest-performance` |
| [#808](https://github.com/visgl/deck.gl-community/pull/808) | `codex/tree-forest-performance` | `codex/citrus-tree-lab` |
| [#815](https://github.com/visgl/deck.gl-community/pull/815) | `codex/splat-scene-foundation` | `codex/coit-community` |
| [#809](https://github.com/visgl/deck.gl-community/pull/809) | `codex/citrus-tree-lab` | `codex/remove-three-module` |

## Implemented behavior and evidence

The prepared path on the TreeLayer branch accepts Gaussian assets and owner rows, uses weighted
optical blending, and retains wind, materials, refinement and shadows. TreeLayer supports supplied
rows or `getTileData` inventory streaming with the same top-level accessors. #809 migrates Seasonal
Farm and removes the deprecated `three` workspace; its publication is a major-version change.

The #814 scene extension adds URL/Blob/static/RAD sources, workers, shared residency and
sorted Cartesian domains above the completed tree chain. #815 adds Coit above #814. Those scene
features are not present at the #809 tree milestone. Historical Coit evidence refers to its real 50,937,127-row asset and must
not be read as hardware performance or settled full-detail proof.

## Verification and landing boundaries

#807 landed on master as `a46193f8`. Each remaining PR is reviewed and validated against its own
parent, with source changes kept in the owning PR. Root install/build, strict public consumers,
Node tests, relevant examples and GPU fixtures, and the website workspace build are required.
Current hosted checks and unresolved review threads must still be checked before landing. Land
parents first; after a squash merge, rebase and revalidate descendants against the new master head.

The scene branch carries a development-only Yarn backport of luma #3398. That upstream PR is
merged, but the current published `@luma.gl/splats` 9.4.2 does not replace this backport. Scene
package publication requires a compatible luma release, patch removal and packaged-consumer
verification. The tree branch has no scene-patch prerequisite. Removing the published three
package requires a major release after compatible native TreeLayer dependencies are available.

Software GPU tests establish rendering correctness within their fixtures. Historical films,
synthetic inventory metadata, and hardware performance remain separate evidence. Sorted
geospatial/globe rendering, hard GPU byte accounting, joint best-first selection across independent
RAD hierarchies and scalable WebGL2 ordering remain scene acceptance limits.
2 changes: 1 addition & 1 deletion docs/modules/layers/api-reference/tree-layer.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ For opaque WebGL shadows, supply a deck.gl `LightingEffect` with a `DirectionalL

Remove `detail` from TreeLayer props and `TreeDetail` from type imports. TreeLayer now composes full leaf Gaussian sources and continuous woody meshes, with automatic refinement for subpixel crowns and branches. Legacy demo `detail` query parameters are ignored.

The deprecated `@deck.gl-community/three` workspace temporarily re-exports the same native `TreeLayer` constructor. Update imports and dependencies to `@deck.gl-community/layers`, including `TreeLayerProps`, `TreeType`, `Season` and `CropConfig`. The production renderer has no Three.js dependency; the compatibility workspace will be removed with the examples migration.
The deprecated `@deck.gl-community/three` workspace is removed. Update imports and dependencies to `@deck.gl-community/layers`, including `TreeLayerProps`, `TreeType`, `Season` and `CropConfig`. Previously published package versions are unchanged. The production renderer has no Three.js dependency.

Gaussian crowns and connected winter silhouettes deliberately differ from the original geometry. `CropConfig.radius` now matches its documented radius: older geometry rendered half that radius. Halve an existing crop radius to retain its old apparent size. Inspect your explicit seasonal foliage overrides, canopy sublayer overrides and custom winter branches when migrating; the native crown sublayer IDs include foliage/winter and tier information. Legacy species overrides such as `canopy-cherry` remain supported and apply after native defaults. Exact grouped sublayer IDs take precedence over species aliases. Custom wood meshes reach both camera and shadow children without the native template morph; arbitrary custom geometry is kept conservatively visible. Overridden wood transform accessors and their triggers also determine culling bounds. Override accessors receive the source tree and its original accessor context; parameters and update triggers merge by key.

Expand Down
10 changes: 0 additions & 10 deletions docs/modules/three/README.md

This file was deleted.

3 changes: 0 additions & 3 deletions docs/modules/three/api-reference/tree-layer.md

This file was deleted.

8 changes: 0 additions & 8 deletions docs/modules/three/sidebar.json

This file was deleted.

27 changes: 26 additions & 1 deletion docs/upgrade-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ for input forms and rendering limits. On WebGPU, `View.clear` is rejected until

### `@deck.gl-community/layers`: native `TreeLayer`

- `TreeLayer` is now exported by `@deck.gl-community/layers`; the deprecated `three` workspace temporarily re-exports the same constructor. Update imports to the native package. Remove `detail` / `TreeDetail`; canopy overrides target `SplatLayer`, and wood overrides target connected meshes. Crop radii now match metres, so halve old values to retain their apparent size. See the [native migration notes](./modules/layers/api-reference/tree-layer.md#migration).
- `TreeLayer` is now exported by `@deck.gl-community/layers`; the deprecated `three` workspace has been removed. Update imports and dependencies to `@deck.gl-community/layers`. Remove `detail` / `TreeDetail`; canopy overrides target `SplatLayer`, and wood overrides target connected meshes. Crop radii now match metres, so halve old values to retain their apparent size. See the [native migration notes](./modules/layers/api-reference/tree-layer.md#migration).

`TreeLayer` also accepts an abortable `getTileData` geographic inventory. Supply either
row `data` or `getTileData`. For existing `WorldTreeLayer` callers, move `treeProps` to
Expand All @@ -37,6 +37,31 @@ use `windStrength` for both near and distant trees. The compatibility wrapper re
its earlier budget defaults; canonical TreeLayer uses 250,000/125,000 canopy/shadow
submissions in both modes. See the [streaming reference](./modules/layers/api-reference/world-tree-layer.md).

Removing the published `@deck.gl-community/three` package is a breaking change. Release this
removal in a major version, after the native `TreeLayer` and its SplatLayer dependencies are
available in compatible published packages. Do not publish the removal ahead of that stack.

### One TreeLayer API for rows and inventories

Use `TreeLayer` with either `data` rows or `getTileData` for geographic streaming. Move the old
`WorldTreeLayer.treeProps` accessors to the top level, rename the distant-group `getCanopyColor`
to `getDistantCanopyColor`, and use `windStrength` for near and distant trees. `streamingStats`
is available on TreeLayer. The deprecated WorldTreeLayer wrapper preserves old calls and defaults.
See the [streaming reference](./modules/layers/api-reference/world-tree-layer.md#compatibility).

### Prepared SplatLayer inputs

Existing `new SplatLayer({data: owners, source, hierarchy})` calls remain supported. New code uses
`data: source` for one prepared asset or `data: owners, getSource: source` for shared instances.
Move a supplied hierarchy into `{type: 'prepared-splats', source, hierarchy}` and pass that descriptor
through `getSource`. Do not supply both `source` and explicit `getSource`.

All supported forms on this branch use weighted optical blending. URL/Blob/RAD inputs, SH and
sorted scene presentation are added independently in #814. `getTransformMatrix` takes precedence
over orientation/scale/translation, and picking keeps original owner rows and indices.
Tree canopy quotas are allocated jointly by projected error; species no longer receive fixed
shares proportional to their row counts.

### `@deck.gl-community/editable-layers`

Edit modes now consistently accept `SimpleFeatureCollection`, which supports Point,
Expand Down
1 change: 0 additions & 1 deletion docs/webgpu.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ deck.gl-community is adding WebGPU support incrementally while continuing to sup
| `@deck.gl-community/basemap-layers` | `BasemapLayer` | ✅ | 🚧 | Support depends on the selected style's polygon, path, and label sublayers. |
| `@deck.gl-community/layers` | `SplatLayer` | ✅ | ✅ | Prepared anisotropic Gaussians with instanced deformation and owner picking; optical shadow integration remains WebGL-only. |
| `@deck.gl-community/layers` | `TreeLayer` | ✅ | ✅ | Connected wood and Gaussian foliage with GLSL/WGSL wind; deck.gl shadows remain WebGL-only. |
| `@deck.gl-community/three` | `TreeLayer` | ✅ | ✅ | Compatibility import for the canonical native TreeLayer. |
| `@deck.gl-community/leaflet` | Leaflet map overlay | ✅ | ❌ | A host-owned WebGL context cannot be switched to WebGPU. |
| `@deck.gl-community/bing-maps` | Bing Maps overlay | ✅ | ❌ | A host-owned WebGL context cannot be switched to WebGPU. |
| `@deck.gl-community/widgets` | `DeviceManagerController` and `DeviceTabsWidget` | ✅ | ✅ | Selects and attaches an independently managed real rendering device. |
Expand Down
3 changes: 2 additions & 1 deletion docs/whats-new.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ This page lists module additions and major changes in each release. For detailed

- Added reusable `SplatLayer` with direct prepared assets, constant/per-row `getSource`, heterogeneous instances, affine transforms, shared refinement budgets, optical transitions and WebGL2/WebGPU rendering. Camera and light-map culling include the filtered footprint, including reduced-resolution targets. Existing `source` callers remain compatible; streamed RAD and sorted scene rendering remain separate upstream work.

- `TreeLayer` moves to native vis.gl rendering with one `getTree` traits accessor, Gaussian foliage, connected wood, eight species, explicit crops and GPU wind. The old import temporarily re-exports the same constructor.
- `TreeLayer` moves to native vis.gl rendering with one `getTree` traits accessor, Gaussian foliage, connected wood, eight species, explicit crops and GPU wind. Import the canonical renderer from `@deck.gl-community/layers`.
- `TreeLayer` also accepts `getTileData` for bounded geographic streaming, continuous crown refinement and automatic frame budgets, using the same top-level tree accessors as supplied rows. `WorldTreeLayer` remains a deprecated compatibility wrapper.
- Added Tree Lab, Citrus Lab, forest and synthetic world examples with recorded comparison videos and benchmark evidence.
- Migrated Seasonal Farm to the native layers package and removed the deprecated `three` workspace.

- The playground adds a **Vega** tab with live JSON editing and shared declarative unit-layout and bar-chart examples.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ From the repository root:

```sh
yarn
yarn --cwd examples/three/seasonal-farm start
yarn --cwd examples/layers/seasonal-farm start
```

TreeLayer loads from source. The same demo runs standalone, on the website, and in the
Expand Down
Loading