📄 Cargo.toml
[workspace]
resolver = "3"
members = [
    "rig",
    "capture",
    "replay",
    "splatgen",
    "render",
    "sink",
]

# The workspace root is the `kinect-view/` tree from PLAN.md. `rig` holds the
# shared types (poses, intrinsics, splat batches, frame sources) so the other
# crates never need to depend on each other's heavy dependencies.

[workspace.package]
version = "0.1.0"
edition = "2024"

[workspace.dependencies]
# Internal crates.
rig = { path = "rig" }
capture = { path = "capture" }
replay = { path = "replay" }
splatgen = { path = "splatgen" }
render = { path = "render" }
sink = { path = "sink" }

# Math. glam is pinned to match Brush's workspace: brush-render's public API
# speaks glam, and a different minor would compile a second copy of the
# crate and break type interop.
glam = { version = "0.30", features = ["serde"] }
bytemuck = "1.20"

# Capture.
kinect-one = { git = "https://github.com/Aytixel/kinect-one" }
nokhwa = "0.10"

# Rendering: Brush's renderer as a library (not published to crates.io; it
# lives under crates/brush-render in the Brush repo). The burn/burn-wgpu
# pins mirror Brush's own workspace deps exactly — same git source and
# revision (the one in Brush's committed Cargo.lock) — so cargo unifies
# them into a single burn crate. A different source or revision would
# compile a second burn and break type interop, exactly like glam.
# Pin the revision whenever these move: burn's `main` drifts ahead of
# Brush between releases (a fusion API change broke the build once
# already).
brush-render = { git = "https://github.com/ArthurBrussee/brush", rev = "1388f74c6fe0236f68ee4915564bf00e9d2e3747" }
# NOTE: burn is declared with `branch = "main"` — the same requirement as
# Brush's workspace — so cargo unifies it with Brush's burn into one
# crate. The *revision actually built* is then pinned through the
# committed Cargo.lock (see the lock-sync note in PLAN.md): burn's `main`
# regularly drifts ahead of Brush and breaks its build, so the lock pins
# the `branch = "main"` resolution to the revision Brush's own committed
# lockfile uses. Never run `cargo update -p burn ...` blindly.
burn = { git = "https://github.com/tracel-ai/burn", branch = "main", default-features = false, features = [
    "std",
    "wgpu",
    "autodiff",
] }
burn-wgpu = { git = "https://github.com/tracel-ai/burn", branch = "main", features = [
    "exclusive-memory-only",
] }

# UI / sinks.
eframe = "0.37"
egui = "0.37"
# Headless egui test harness (wgpu snapshots + interaction).
egui_kittest = { version = "0.37", features = ["wgpu"] }
pollster = "1"
# v4l2loopback output (Linux only). Fallback candidate if this proves
# awkward for output queues: edgefirst-v4l2.
v4l2r = "0.0.8"

# Serialization / data for replay datasets.
serde = { version = "1", features = ["derive"] }
image = "0.25"

# Errors / logging (Brush uses tracing + log).
anyhow = "1"
thiserror = "2"
tracing = "0.1"
tracing-subscriber = "0.3"
log = "0.4"
env_logger = "0.11"

# Async plumbing (kinect-one's API is tokio-based).
tokio = { version = "1", features = ["macros", "rt", "rt-multi-thread", "sync", "time"] }