From 24e4e14b2653025168b88a9b051bb210c809c7ff Mon Sep 17 00:00:00 2001
From: Filip Jeretina <59307111+zrezke@users.noreply.github.com>
Date: Thu, 18 May 2023 20:18:01 +0200
Subject: [PATCH] Depthai Viewer v0.0.1 (WIP) (#5)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* v0.0.1 of DepthaiViewer, WIP (#1)
* node graph scaffolding and a bit of depthai integration
* remove import
* left, right + depth
* fix fps sliders for mono cams
* partial refactor, partially added support for device selection.
* pc support + currently selected device fixes
* reafactor subscriptions to api, doesn't work too well, trouble with syncing the ui with the backend
* Partially migrated to websockets for the api
* finish moving to websockets for the config api
* fix issues after merge, retry websocket connections
* fix ws thread not exiting
* sleep for 1 sec before trying to reconnect
* Ai support + imu support + rotate camera + bug fixes (#9)
* ai support + update pipeline on device select
* quick fix depth
* set subs when selecting device
* rename to Depthai Viewer, use changed() for config ui, disable ui when device not selected
* added age gender detection
* added mobilenet support
* pointcloud support
* Toggle subs from visible (#4)
* very bad implementation of toggling subscriptions based on space view visibility TODO: less cloning and stuff
* better implementation and actually seems to work
* fix windows not resizing properly when size gets smaller
* fix issues with 3d when resizing scene bbox, only force 2d to always have the size of self.scene_bbox
* Nuked Subscriptions struct, just use Vec, much nicer, much better aswell, also fixed subscriptions for channels that need some time to actually show up, it all feels a bit hacky tho
* Toggle subs from visible (#5)
* very bad implementation of toggling subscriptions based on space view visibility TODO: less cloning and stuff
* better implementation and actually seems to work
* fix windows not resizing properly when size gets smaller
* fix issues with 3d when resizing scene bbox, only force 2d to always have the size of self.scene_bbox
* Nuked Subscriptions struct, just use Vec, much nicer, much better aswell, also fixed subscriptions for channels that need some time to actually show up, it all feels a bit hacky tho
* fix incorrect despawn of entity paths
* remove todo comment
* Fix ws not sending messages, fix stutter every 2s (#6)
* very bad implementation of toggling subscriptions based on space view visibility TODO: less cloning and stuff
* better implementation and actually seems to work
* fix windows not resizing properly when size gets smaller
* fix issues with 3d when resizing scene bbox, only force 2d to always have the size of self.scene_bbox
* Nuked Subscriptions struct, just use Vec, much nicer, much better aswell, also fixed subscriptions for channels that need some time to actually show up, it all feels a bit hacky tho
* fix incorrect despawn of entity paths
* remove todo comment
* error handling
* fix websocket not sending pipeline, hotfix more or less might keep
* change back to unbounded
* Imu support (#8)
* add imu logging, exclude it from regular space views
* fix imu logging
* POC imu plotting
* Imu accelerometer and gyroscope plotting
* add orientation to imu log, make device id a String
* fix imu charts layout
* imu log add magnetometer
* fix right panel ui as much as it makes sense to fix rn
* sadly idk how to create Option::None in pyarrow for the magnetometer field
* imu logging fixed, magnetometer value is now None when not logged
* fix plot scrolling
* Merge upstream (#10)
* `arrow2_convert` primitive (de)serialization benchmarks (#1742)
* arrow2_convert primitive benchmarks
* addressing PR comments
* Fix logged obb being displayed with half of the requested size (#1749)
* benchmarks for common vector ops across `smallvec`/`tinyvec`/std (#1747)
* benchmarks for common vector ops
* handle N=1
* Tracked 3D cameras lead now to on-hover rays in other space views that show the same camera but don't track it. (#1751)
In the same way as a 2D scene causes a on-hover ray in all space views that contain the space camera at which the 2D view "sits".
* Improve dealing with raw buffers for texture read/write (#1744)
* Replace TextureRowDataInfo with the more versatile Texture2DBufferInfo
* comment & naming fixes
* `arrow2` erased refcounted clones benchmarks (#1745)
* arrow2 erased refcounted clone benchmarks
* lint
* addressing PR comments
* dude
* `arrow2` estimated_bytes_size benchmarks (#1743)
* arrow2 estimated_bytes_size benchmarks
* cleanup
* Fix crash when trying to do picking on depth clouds
* Readback depth from GPU picking (#1752)
* gpu picking in the viewer picks up depth now
* WebGL workarounds
* Add new ARKitScenes example (#1538)
Co-authored-by: Nikolaus West
Co-authored-by: Emil Ernerfeldt
* Fix log_obb usage (#1761)
* Make sure all log_obb uses uses half_size correctly
* Remove outdated link from README
* Fix docstring of save
* Force named arguments of log_scalar
* Add link to --memory-limit docs
* update ros example
* Python SDK: document that we also accept colors in 0-1 floats (#1740)
* Python SDK: document that we also accept colors in 0-1 floats
* Assume float colors to be in gamma-space, and document that
* Update arkitscenes example
* Fix bug
* typo
* py-format
* Collapse space-view by default if there is only one child (#1762)
* Always create the log_time timeline (#1763)
* Columnar timepoints in data tables and during transport (#1767)
* columnar timepoints
* self review
* Fix undo/redo selection shortcut/action changing selection history without changing selection (#1765)
* Fix undo/redo selection shortcut/action changing selection history without changing selection
Fixes #1172
* typo fix
* Don't initialize an SDK session if we are only going to be launching the app (#1768)
* Allow torch tensors for log_rigid3 (#1769)
* Option to show scene bounding box (#1770)
* Include depth clouds in bounding box calculation
* Don't wrap text when showing bbox in ui
* Handle projective transforms
* Nicer selection view: don't wrap second column too early
* Add checkbox to show the scene bounding box
* Fix a whole lot of crashes, all at once (#1780)
* Add typing_extensions to requirements-doc.txt (#1786)
* auto_color class-ids if they are present (#1783)
* auto_color class-ids if they are present
* Update log line in segmentation demo
* Avoid tuple structs
* Don't run 3rd party bench suites on CI (#1787)
* dont run 3rd party bench suites on CI
* typo
* and other annoyances
* Use copilot markers in PR template (#1784)
* Use copilot markers in PR template
* remove poem
Co-authored-by: Clement Rey
---------
Co-authored-by: Clement Rey
* re_format: barebone support for custom formatting (#1776)
* implement barebone support for custom formatting and apply to Tuid
* unwrap
* rather than []
* use re_tuid
* Always send recording_id as part of LogMsg (#1778)
* Always send recording_id as part of LogMsg
* Rename build_chunk_from_components -> build_data_table_from_components
* Don't make RecordingInfo optional
* Always default the recording id
* Log an error if we hit the initialization issue
* Refactor: Add new helper crate `re_log_encoding` (#1772)
* CI: Check `rerun` with --no-default features and/or with --features sdk
* Create a new helper crate re_transport containing stream_rrd_from_http
* Fix warnings
* Move file sink to re_transport
* wasm compilation fix
* Move LogMsg encoding/decoding into re_transport
* Fix typo
* Fix web build
* Fix tests
* Remove a lot of unused dependencies with `cargo machete`
* Build fix
* Clarify
* Rename the crate to re_log_encoding
* better docstring
Co-authored-by: Jeremy Leibs
* better readme
Co-authored-by: Jeremy Leibs
---------
Co-authored-by: Jeremy Leibs
* New example code for facebook research segment anything (#1788)
* New example code for facebook research segment anything
* Add segmentation workaround for users still on 0.4.0
* Images should use class-id as label
* Add an alternative tensor-based view
* Implement `re_tuid::Tuid::random()` on web (#1796)
* Implement `re_tuid::Tuid::random()` on web
* Fix bad error message
* ci: fix benchmarks (#1799)
* workflow: just run --all
* datastore: skip bucket permutations etc on CI
* i give up, just replace re_log_types by re_log_encoding
* Add `minimal_options` example (`RerunArgs`) (#1773)
* Allows connecting to remote server through rerun's RerunArgs.
Co-authored-by: Clement Rey
* Add `pacman` support to `setup_web.sh` (#1797)
Co-authored-by: Clement Rey
* fix ci (cargo-deny): cargo update -p crossbeam-channel (#1806)
* Compile with `panic = "abort"` (#1813)
* Compile with `panic = "abort"`
This PR sets `panic = "abort"` for both debug and release builds.
This cuts down the `rerun` binary size in release builds from
29.9 MB to 22.7 MB - a 25% reduction!
## Details
The default panic behavior in Rust is to unwind the stack.
This leads to a lot of extra code bloat, and some missed
opportunities for optimization.
The benefit is that one can let a thread die without crashing the whole
application, and one can use `std::panic::catch_unwind` as a kind of
try-catch block.
We don't make use of these features at all (at least not intentionally),
and so are paying a cost for something we don't need.
I would also argue that a panic SHOULD lead to a hard crash unless
you are building an Erlang-like robust actor system where you use
defensive programming to protect against programmer errors
(all panics are programmer errors - user errors should use `Result`).
* Quiet clippy
* Add `rerun --strict`: crash if any warning or error is logged (#1812)
* Add `rerun --strict`: crash if any warning or error is logged
Part of https://github.com/rerun-io/rerun/issues/1483
* Can't doc-test private functions
* Refactor: Remove `TensorTrait` (#1819)
* Refactor: Remove `TensorTrait`
We don't need it anymore
* End-to-end testing of python logging -> store ingestion (#1817)
* Sort the arguments to `rerun`
* Pass on `LogMsg::Goodbye` just like any other message
* Add `rerun --test-receive`
* `just py-build --quiet` is now possible
* Add scripts/run_python_e2e_test.py
* replace `cargo r -p rerun` with `python3 -m rerun`
* lint and explain choice of examples
* Add to CI
* check returncode
* Fix e2e test on CI: Don't try to re-build rerun-sdk (#1821)
* Use gpu picking for points, streamline/share picking code some more (#1814)
* use gpu picking for picking points
* gpu based picking no longer works like a fallback but integrates with other picking sources
* fix incorrect cursor rounding for picking
* refactor picking context to be a pub struct with exposed state
* unify ui picking method for 2d & 3d space views
* less indentation for picking method
* picking rect size is dynamically chosen
* fix accidental z scaling in projection correction for picking & make cropped_projection_from_projection easier to read
* CI: install pip requirements for Python e2e test
* Process 2d points always in batches (#1820)
* Fix CI syntax error
* New option to disable persistent storage (#1825)
* New option to disable persistent storage
* New API to reset_time (#1826)
* Datastore revamp 1: new indexing model & core datastructures (#1727)
* Datastore revamp 2: serialization & formatting (#1735)
* Datastore revamp 3: efficient incremental stats (#1739)
* Datastore revamp 4: sunset `MsgId` (#1785)
* Datastore revamp 5: (#1791)
* Datastore revamp 6: sunset `LogMsg` storage + save store to disk (#1795)
* Datastore revamp 7: garbage collection (#1801)
* Don't assert if inserting a rowid with a matching timepoint does not create a conflict (#1832)
* CI: Try installing the correct wheel on CI
* CI: try again with the CI
* re_query: up to date with latest data types and structures (#1828)
* No more raw arrays for primary components
* Don't need to carry around component names no more
* Cluster keys are now raw-array-less and _not_ optional anymore
* that is done indeed
* helpers
* datastore: incremental metadata registry stats (#1833)
* add profile scopes for stats
* implement incremental metadata registry stats
* lint
* future proofing comment
* RFC: datastore state of the union & end-to-end batching (#1610)
* add batching rfc
* Update design/batching.md
Co-authored-by: Emil Ernerfeldt
* Update design/batching.md
Co-authored-by: Emil Ernerfeldt
* Update design/batching.md
Co-authored-by: Emil Ernerfeldt
* Update design/batching.md
Co-authored-by: Emil Ernerfeldt
* qa component instances vs. instance keys
* no sticky
* qa are there any special components & non-integer instance keys
* give some clue about cell incompatibility
* temporary constructs
* zstd is already setup
* more planning
* date and links
---------
Co-authored-by: Emil Ernerfeldt
* Python CI: use bash as shell
* Fix too many points crash (#1822)
* Simplify point cloud builder and fix crash on too many points
Fixes #1779
* faster point cloud population by not chaining iterators with default values
* Use GPU picking for line(like) primitives, fix `interactive` flags (#1829)
* line strip builder no longer has user data, exposes picking id instead (not implemented yet)
* handle interactive object property when evaluating picking code
* take line strip builder directly when building up line draw data
* finish implementing picking for lines
* remove unused iter_strips_with_vertices
* Simplify picking handling now that there are a lot less types. Labels & textured rects are always picked now, fixes #1021
* CI: try to fix mac wheel build
* Reduce memory used by staging belts on Web (#1836)
In particular this prevents crashing with out of memory on a run-away belt memory usage caused by failure to unmap buffers. A bit concerningly, the fix uses our knowledge of how `wgpu::Device::poll` is broken in the current wgpu version.
I took the opportunity to sharpens the definition of `HardwareTier` a bit.
* CI: only test the x86_64 wheel on macos
* Always flush when we remove a sink (#1830)
Whenever we disconnect (or implicitly disconnect by swapping a sink) we should flush the pending messages. Additionally disconnect and flush calls both require releasing the GIL (for the same reason as shutdown previously).
* GPU colormapping, first step (#1835)
* Add TextureManager2D::get_or_create_with
* Small code cleanup
* Add code to upload a Tensor to a GPU texture
* Add helper method Tensor::image_height_width_depth
* Minor code cleanup (multiplicative_tint)
* Hook up color textures via the new path
* Refactor: introduce ColormappedTexture
* Start working on an uint sampler
* merge fix
* Dumb colormapping of depth textures!
* Use turbo for depth maps (and single-channel images :grimace:)
* Use grayscale for luminance
* ColorMap -> Colormap
* Apply annotation context colormaps
* Support sint textures too
* cleanup
* merge fix
* Fix RGB images
* More cleanup
* Better error-handlign and nicer error message
* Clean up the SAMPLE_TYPE with constants
* Nicer shader interface
* Better error handling
* Remove dead code
* Self-review cleanup
* Fix bug in shader when sampling sint textures
* Use textureSampleLevel
* Apply a gamma to the image (unused as of now)
* image_height_width_channels
* fix various review comments
* Optimize narrow_f64_to_f32s: avoid one allocation
* Test and handle all tensor dtypes as images (#1840)
* Support i64 and u64 tensors
* api_demo: log all image types
* Don't even print out the contents of a tensor
* Handle unfilterable float textures
* fix typo
* py-format
* Simplify is_float_filterable
* Add a helper function pad_and_narrow_and_cast
* Reuse existing image
* Exclude image_tensors demo from default api_demo
* Still run all api demos in e2e test
* pyformat
* Install the rerun-sdk in CI using --no-index and split out linux wheel build to run first. (#1838)
* Install the rerun-sdk by the expected version
* Fix comment
* typo
* Use --no-index when installing the rerun wheel
* Use the cargo_version, not the new_version
* Split dependency install into its own step
* Don't use force-reinstall
* Refactor setting of expected_version variable.
* Use bash when setting env
* Always run the linux job first and use its rrds for the other wheels
* GPU tensor colormapping (#1841)
* Refactor: introduce struct SliceSelection
* Refactor: use SliceSelection inside of ViewTensorState
* MVP of tensor colormapping on GPU
* Remove old ui code
* Support 64-bit tensors by narrowing to f32
* Allow more colormap options
* Clippy
* Report range errors instead of ignoring them
* Sort colormaps
* Shorten function name
* Create module gpu_bridge
* Move some code around
* Simnplify API
* Create ViewBuilder::new
* Fix missing colon in lint.py
* fix typos and formatting
* Disable texture filtering options for tensors for now
* Update docstrings
* Add profile scopes
* ViewBuilder cleanup
* Make ViewBuilder::setup non-Option
* Remove Result from thing that cannot fail
* Fix colormap numbering
* review cleanup
* pass in debug_name
* Unify the `range` function
* typo
* Show previews of colormaps when selecting them (#1846)
* Make infallible version of get_or_create_texture
* Show colormap previews in UI
* Spelling
* Implement billinear filtering of textures (#1850)
* Implement opt-in billinear filtering of textures
* bilinear
* MVP Support for inline-rendering of Rerun within jupyter notebooks (#1798) (#1834) (#1844)
* Introduce the ability to push an rrd binary via iframe.contentWindow.postMessage
* New API to output the current buffered messages as a cell in jupyter
* Example notebook with the cube demo
* Track that we need to send another recording msg after draining the backlog
* Dynamically resolve the app location based on git commit. Allow override to use self-hosted assets
* Add some crude timeout logic in case the iframe fails to load
* Don't persist app state in notebooks
* Introduce new MemoryRecording for use with Jupyter notebooks (#1834)
* Refactor the relationship between the assorted web / websocket servers (#1844)
* Rename RemoteViewerServer to WebViewerSink
* CLI arguments for specifying ports
* Proper typing for the ports
* Disable wheel tests for x86_64-apple-darwin (#1853)
* Fix typos in notebook readme (#1852)
* Fix the python build when running without web_viewer enabled (#1856)
* Error instead of expect inside msg_encode. (#1857)
* Restore: New API to reset_time (#1826) (#1854)
* Revert "Implement billinear filtering of textures (#1850)" (#1859)
This reverts commit d33dab6e7a33f82ab2513058d0f85744e3ce6ef4.
* Add Restart command and keyboard shortcut for moving time to start of timeline (#1802)
* Add Restart button to timeline UI. This sets the timeline back to zero.
* Adds Restart Command & Timeline Command
* Adds Ctrl-Shift-Space keyboard modifier
* Remove restart button from timeline UI.
* Use cmd(Key::LeftArrow) as key combo for restart timeline.
* Add TimeControl::restart to restart the current timeline.
* Use this from the kb_shortcut function
* fix some code nits
---------
Co-authored-by: Emil Ernerfeldt
* Fix shutdown race condition in `re_sdk_comms` client (#1861)
* Wait for encoder to shut down before shutting down the other threads
* Remove unused dependencies (#1863)
* Gpu picking for depth clouds (#1849)
* wip
* allow for hovering depth clouds via gpu picking
* Use `[x, y]: [u32; 2]` as argument
---------
Co-authored-by: Emil Ernerfeldt
* Remove manual depth projection from car and nyud examples (#1869)
* Remove manual depth projection from car and nyud examples
* revert change to cube.ipynb
* revert changes to cube.ipynb
* third times a charm for cube.ipynb
* Improve end-to-end testing slightly (#1862)
* CI: Run e2e tests with RUST_LOG=debug
* Move installing of pip packaged from CI to e2e script
* Re-enable bilinear interpolation again (#1860)
* Revert "Revert "Implement billinear filtering of textures (#1850)" (#1859)"
This reverts commit 625d2bdd241c09ff9d0ae394ba91565fa48455ec.
* Split rectangle.wgsl into fragme/vertex parts to work around naga bug
* Use GPU colormapping when showing images in the GUI (#1865)
* Cleanup: move Default close to the struct definition
* Simplify code: use if-let-else-return
* Simplify code: no need for Arc
* Add EntityDataUi so that the Tensor ui function knows entity path
* Better naming: selection -> item
* Simplify code: no optional tensor stats
* Less use of anyhow
* Use GPU colormapping when showing tensors in GUI
* Link to issue
* Optimize pad_to_four_elements for debug builds
* Refactor: simpler arguments to show_zoomed_image_region_area_outline
* Fix missing meter argument
* Refactor: break up long function
* Less use of Arc
* Pipe annotation context to the hover preview
* Simplify `AnnotationMap::find`
* Use new GPU colormapper for the hover-zoom-in tooltip
* Refactor
* Add helper function for turning a Tensor into an image::DynamicImage
* Fix warning on web builds
* Add helper function `Tensor::could_be_dynamic_image`
* Implement click-to-copy and click-to-save for tensors without egui
* Convert histogram to the new system
* Remove the TensorImageCache
* Fix TODO formatting
* bug fixes and cleanups
* Rename some stuff
* Build-fix
* Simplify some code
* Turn off benchmakrs comment on each PR (#1872)
* Refactor: remove `GpuTexture2DHandle::invalid` (#1866)
* Refactor TexturedRect
* Remove GpuTexture2DHandle::invalid
* `GpuTexture2DHandle` is always valid
* spacing
* Update enumflags2 to non-yanked version (#1874)
* Update enumflags2 to non-yanked version
```
❯ cargo update -p enumflags2
Updating crates.io index
Updating enumflags2 v0.7.5 -> v0.7.7
Updating enumflags2_derive v0.7.4 -> v0.7.7
Updating proc-macro2 v1.0.47 -> v1.0.56
Updating quote v1.0.21 -> v1.0.26
Adding syn v2.0.15
```
Unfortunately this adds the syn v2 dependency for some platforms
* Updating dependencies is a valid label
* cargo deny: check more platforms
* fix stuff broken from merging upstream
---------
Co-authored-by: Clement Rey
Co-authored-by: benjamin de charmoy
Co-authored-by: Andreas Reich
Co-authored-by: Emil Ernerfeldt
Co-authored-by: Pablo Vela
Co-authored-by: Nikolaus West
Co-authored-by: Jeremy Leibs
Co-authored-by: h3mosphere <129932586+h3mosphere@users.noreply.github.com>
Co-authored-by: Urho Laukkarinen
* expose depth config, get available sensor resolutions for the selected device
* move removing entities to a place where the removal will always be tried, not just when expanding space view header
* added depth alignment
* added stream enabled buttons
* Depth cloud textures are now cached frame-to-frame (#1913)
* Depth cloud textures are now cached frame-to-frame
Simplified logic a bit by enforcing F32 texture conversion (there was a u16 path for native only)
* doc fix
* naming consistency, format check, remove unnecessary scaling
* improve depth cloud texture check
* fixes after merging
* Smooth out scroll wheel input for camera zooming (#1920)
* Always spawn instead of fork in multiprocessing example (#1922)
* Add `--num-frames` arg to canny (webcam) example (#1923)
* fix formatting issues
* rerun format fix
* fix spelling
* lint check fixes
* mypy
* some more lint fixes
* some more fixes for python lint checks
* Collect extra egui features into the main Cargo.toml (#1926)
* just rs-run-all
* `just py-run-all-{native|web|rrd}` (#1927)
* make all python examples handle unknown arguments gracefully
* just py-run-all-{native|web|rrd}
* bump version
* comment out clang
* Join threads at end of multi-threading example (#1934)
* Add argument parsing to the rerun_demo (#1925)
* More robust wait for exit condition during .serve() (#1939)
* More robust wait for exit condition during .serve()
* lint
* Use zipfile python library instead of `unzip` command in arkitscene (#1936)
* Use zipfile python library instead of `unzip` command in arkitscene
Windows doesn't have unzip!
* Nit: import sort order
---------
Co-authored-by: Nikolaus West
* Fix annotation images sometimes drawn in the background. (#1933)
This caused fairly ugly rendering whenever that happened. Also cleaned up redundant image/textured_rect defintions in spatial scene buildup
* Fix backslashes in arkitscene rigid transformation path (#1938)
* Fix backslashes in arkitscene rigid transformation path
Should be fixed properly by https://github.com/rerun-io/rerun/issues/1937
* Use PosixPath instead of .replace("\\", "/")
---------
Co-authored-by: Nikolaus West
* Fix hover/select highlights when picking single points in a scene with multiple point clouds (#1942)
Batch vertex offset for single highlights wasn't correctly computed. Different parts of the code made different assumptions what offsets referred to
* Fix hovering depth clouds (#1943)
We didn't add to `scene.primitives.image`. Instead of adding to this list, it is instead now no longer needed for picking since we can very easily query for tensor again.
* change python workflow for testing purposes, remove windows and macos wheels
* add back one macos so the matrix is valid
* 2.5GB before GC kick in on web (#1944)
* change name to depthai-viewer
* change pip install/uninstalls from rerun-sdk to depthai-viewer
* change all occurances of rerun-sdk to depthai-viewer
* change windows runner to windows-latest for now when using my personal gh
* Release `0.5.0` (#1919)
* changelog
* 0.5.0-alpha.0
* more changelog
* re_format: fix implicit recursive feature flags
* publish_crates.sh: fix crate ordering
* Join threads at end of multi-threading example (#1934)
* Add argument parsing to the rerun_demo (#1925)
* More robust wait for exit condition during .serve() (#1939)
* More robust wait for exit condition during .serve()
* lint
* Use zipfile python library instead of `unzip` command in arkitscene (#1936)
* Use zipfile python library instead of `unzip` command in arkitscene
Windows doesn't have unzip!
* Nit: import sort order
---------
Co-authored-by: Nikolaus West
* Fix annotation images sometimes drawn in the background. (#1933)
This caused fairly ugly rendering whenever that happened. Also cleaned up redundant image/textured_rect defintions in spatial scene buildup
* Fix backslashes in arkitscene rigid transformation path (#1938)
* Fix backslashes in arkitscene rigid transformation path
Should be fixed properly by https://github.com/rerun-io/rerun/issues/1937
* Use PosixPath instead of .replace("\\", "/")
---------
Co-authored-by: Nikolaus West
* changelog
* Fix hover/select highlights when picking single points in a scene with multiple point clouds (#1942)
Batch vertex offset for single highlights wasn't correctly computed. Different parts of the code made different assumptions what offsets referred to
* changelog
* Fix hovering depth clouds (#1943)
We didn't add to `scene.primitives.image`. Instead of adding to this list, it is instead now no longer needed for picking since we can very easily query for tensor again.
* changelog
* 2.5GB before GC kick in on web (#1944)
* changelog
* 0.5.0
---------
Co-authored-by: Jeremy Leibs
Co-authored-by: Andreas Reich
Co-authored-by: Nikolaus West
* Fix imu plots scrolling past their container
* fix bottom/top panel sizing after showing the spinner on config setting
* Lint error names in `map_err` (#1948)
* Lint: Properly name errors in `map_err`
* Use correct names for errors
* fix config and stats tabs not being able to be viewed at the same time, renamed stats to IMU
* New dispatch-only workflow for running the lint-job (#1950)
* Fix secret in dispatch_lint.yml
* Only maintain a single manual-dispatch job for testing workflows
* apply button, have to make it look a bit nicer, but will do that when I fix scrolling in device configuration panel
* Bump hyper version due to RUSTSEC-2023-0034 (#1951)
* Add other build parameterizations to manual_dispatch.yml
* Use proper if gates on the manual_dispatch.yml jobs
* Add ability to save cache to manual_disaptch.yml
* Standard case of inputs
* Add manual step for packaging to 'manual_dispatch.yml'
* add back panels when the underlying subscription reappears
* Fix crash for missing class ids causing zero sized texture (#1947)
* Fix crash for missing class ids causing zero sized texture
Two things fixed actually:
* texture manager now checks for zero sized texture, this ripples out in a lot more error handling
* class id texture texture handles not having any classes gracefully
* Use Display for all errors
* typo
* Better naming of error
* Better docs and names
* Fix off-by-one error
* some use of `context`, change which error is implicitly converted on texture manager2d
---------
Co-authored-by: Emil Ernerfeldt
* fixes LR stream subscriptions (maybe breaks panels reappearing after sub is gone) (#15)
* make config ui scrollable, fix padding
* Move clippy_wasm/clippy.toml to under scripts (#1949)
* Move clippy_wasm/clippy.toml to under scripts
This is just to clean up the root a bit, and to move it closer
to where it is actually used.
* Fix comment typo
---------
Co-authored-by: Andreas Reich
* change crate version to 0.6.0-alpha.0 (#1952)
* New workflow_dispatch for building wheels for a PR
* initial light mode, luxonis depthai viewer
* Rename build_wheels_for_pr.yml -> manual_build_wheels_for_pr.yml
* Fix run-wasm crash on trying to wait for server (#1959)
This ruined my dev experience for re_renderer examples a bit. Not sure what made the previous hack stop working, might be a timing issue. It ended up crashing the `cargo_run_wasm` web server
* Update egui to latest and wgpu to 0.16 (#1958)
* update to wgpu 0.16 and egui using this version
* shader fixup for type aliases and rectangle shader
* shader signed/unsigned shenanigans
* more signed/unsigned issues
* fix texture component count
* fix picking layer depth readback crash on web
* patch wgpu
* better texture size estimate
* fix patches
* Handle leaking of prerelease into alpha version (#1953)
* Make device config panel remember it's height throughout loading
* hide time panel, make ai model dropdown wider
* Fix incorrect memory usage stats for destroyed on-creation-mapped buffers (#1963)
We actually don't have anywhere where we discard this kind of buffer yet, but if we would the stats would be wrong (noticed while doing quick & dirty experiments on the staging belt)
* New manual workflow for running benches
* Introduce new reusable workflow jobs and cleanup manual trigger (#1954)
There are 8 reusable workflow "components" that we can use to build different scenarios:
reusable_checks.yml - These are all the checks that run to ensure the code is formatted,
reusable_bench.yml - This job runs the benchmarks to check for performance regressions.
reusable_deploy_docs- This job deploys the python and rust documentation to https://ref.rerun.io
reusable_build_and_test_wheels.yml - This job builds the wheels, runs the
end-to-end test, and produces a sample RRD. The artifacts are accessible via GitHub artifacts, but not otherwise
uploaded anywhere.
reusable_upload_wheels.yml- This job uploads the wheels to google cloud
reusable_build_web.yml - This job builds the wasm artifacts for the web.
reusable_upload_web.yml - This job uploads the web assets to google cloud. By default this
only uploads to: app.rerun.io/commit//
reusable_pr_summary.yml - This job updates the PR summary with the results of the CI run.
Example summary can be found at:
https://storage.googleapis.com/rerun-builds/pull_request/1954/index.html
This also introduces a manual_dispatch.yml helper as a convenience for testing these workflows and their different parameterizations.
* New manual workflow for adhoc web builds
* Use new CI workflows for pull-request and merge to main (#1955)
on_pull_request.yml includes the following pieces:
- reusable_checks.yml -- Run all of the lints, code-formatting, tests, etc.
- reusable_build_and_test_wheels.yml -- Configured in a "minimal" mode with SDK includes end-to-end test and produces an rrd.
- reusable_build_web.yml -- Verifies we can build the wasm
- reusable_upload_web.yml -- Uploads the RRD and Wasm to app.rerun.io to confirm the demo works as well as support notebook testing.
- reusable_pr_summary.yml -- Create a manifest page with a link to the
on_push_main.yml includes the following pieces:
- reusable_checks.yml -- Run all of the lints, code-formatting, tests, etc.
- reusable_bench.yml -- Run the benchmarks
- reusable_build_and_test_wheels.yml -- Builds wheels for all platforms
- reusable_upload_wheel.yml -- Uploads the all the wheels to gcloud
- reusable_build_web.yml -- Builds the wasm bundle
- reusable_upload_web.yml -- Uploads the RRD and Wasm to app.rerun.io
- reusable_pip_index.yml -- Generates a pip index page which can be used to install packages with, e.g.
* Fix name of on_push_main.yml
* Fix usage of long commit in generate_prerelease_pip_index.py
* Try making pull-request workflows non-concurrent (#1970)
* Try making pull-request workflows non-concurrent
* Concurrency groups for push_main as well
* Each sub-workflow needs its own name or they fight
* Another attempt to make jobs non-concurrent on a per-PR basis (#1974)
* Another attempt to make jobs non-concurrent on a per-PR basis
* Move concurrency into the reusable job
* Jobs with duplicated instances still need separate concurrency keys based on platform
* Round to nearest color_index when doing color mapping (#1969)
* Full (experimental) WebGPU support (#1965)
* always build with unstable web sys apis
* Make shader Tint friendly
* expose webgl feature flag on re_renderer & re_viewer
* fix bug link on negative hexadecimal
* hardware tier is now created from wgpu adapter
* sort out build flags for webgpu & document building webviewer
* introduce shader text replacement workarounds to workaround current chrome issue
* latest egui master
* typo fix
* doc fixes, use if cfg! instead of attribute cfg
* move backend to rerun
* If there's a `{{ pr-build-summary }}` in the PR description, update it. (#1971)
* If there's a `{{ pr-build-summary }}` in the PR description, update it.
* Add comment to the PR template
* Add pull-requests permission to pr_summary job
* Run the cube notebook on PR (#1972)
* Run the cube notebook on PR
* Add notebooks to the build summary
* Use the new concurrency model
* reformat py files
* reformat
* fix pylint errors
* Add ability to manually run a web build to upload to an adhoc name (#1966)
* Add ability to manually run a web build to upload to an adhoc name
* Pass through ADHOC_NAME
* Add a concurrency criteria for the new adhoc job
* Make input description more explicit
* change entity paths
* merged wip albedo colormap into latest depth_cloud
* remove pointclouds generated in sdk
* fix compiler error, trying to compile frame.close for wasm
* Default to albedo texture for depth cloud, added support for mono albedo textures
* restart backend on failure, added oak_cam.device.close seems to really close the cam
* py lint fix
* don't run notebooks
* remove run-notebook dependency
---------
Co-authored-by: Clement Rey
Co-authored-by: benjamin de charmoy
Co-authored-by: Andreas Reich
Co-authored-by: Emil Ernerfeldt
Co-authored-by: Pablo Vela
Co-authored-by: Nikolaus West
Co-authored-by: Jeremy Leibs
Co-authored-by: h3mosphere <129932586+h3mosphere@users.noreply.github.com>
Co-authored-by: Urho Laukkarinen
Co-authored-by: Nikolaus West
* Fix rerun lints
* rename binary, always start with memory-limit, pin depthai dependencies, fix errors after changing dependency versions
* remove compiler warnings
* fix memory leak when app is in background
* Custom viewport UI (#4)
* custom blueprint panel, show logical space views for depthai-viewer users, added settings clog on top of space view tab to configure what is visible
* small fixes, clear entity_paths every time to avoid displaying an unavailable entity_path in space view options ui
* custom left panel to add or remove space view instances, created a new default viewport layout. Improved behaviour when a panel re appears after user selected to hide it, then if stream stops and starts again the panel will be spawned back in correctly.
* improve auto layout to not split when only 3D or 2D view is available
* MJPEG encode image frames if connected to a PoE device. Only add magnetometer to imu sensors list if the device has a BNO IMU. Lower the memory limit to 100MB
* Styling (#6)
* initial styling impl
* make buttons that should be small, small
* Runtime depth config and fix device selection ui
* comment
* Proper runtime depth config updates
* switch to Yolo v8
* add comma to label for non open zoo models
* split 2d + 3d cam view vertically instead of horizontally
* Tabify all panels (except for blueprint) (#7)
* initial styling impl
* make buttons that should be small, small
* Runtime depth config and fix device selection ui
* comment
* Proper runtime depth config updates
* switch to Yolo v8
* add comma to label for non open zoo models
* split 2d + 3d cam view vertically instead of horizontally
* Make the UI more configurable by converting the right panel into tabs. TODO: UX while laying out the panels. When a new space view appears only update the viewport layout, try to keep the user configured fixed function panels as they were. Just handle it in a way that is intuitive
* remove bottom panel, switch to RAW imu sensors
* XLink statistics initial implementation
* initial xlink throughput statistics impllementation, have to glow it up a bit and maybe clean up the code
* Xlink and rerun rename (#9)
* Rename rerun py library to depthai_viewer
* bug fixes and started working on a smart auto layout that operates on an existing tree, to preserve ui as much as possible, while also creating good layouts
* auto layout
* Fix maximize not working and add maximize for Stats tab
* delete profiling stuff that shouldn't have been commited
* mostly fix smart layout, TODO: detect when you can group mono and color 3d + 2d views into a 4 way split
* add docstring for update_tree
* WIP auto layout can_create_mono_quad checker, not at all finished yet
* pass lint checks and bugfixes
* forgot to sort imports
* Fix mypy lint (TODO: Proper typing, especially in the comms from back to store to ws) other types are pretty solid
* pylints and fix Queue typehinting
* fix doc build
* try to pass pylints with py.typed
* ignore misc mypy errors
* forgot to run black formatter
* switch back to old ci
---------
Co-authored-by: Clement Rey
Co-authored-by: benjamin de charmoy
Co-authored-by: Andreas Reich
Co-authored-by: Emil Ernerfeldt
Co-authored-by: Pablo Vela
Co-authored-by: Nikolaus West
Co-authored-by: Jeremy Leibs
Co-authored-by: h3mosphere <129932586+h3mosphere@users.noreply.github.com>
Co-authored-by: Urho Laukkarinen
Co-authored-by: Nikolaus West
---
.cargo/config.toml | 16 +
.github/pull_request_template.md | 9 +-
.github/workflows/labels.yml | 2 +-
.github/workflows/python.yml | 364 +----
.github/workflows/rust.yml | 193 +--
.github/workflows/toml.yml | 2 +-
.github/workflows/typos.yml | 17 -
.mypy.ini | 2 +-
.vscode/extensions.json | 17 +-
.vscode/settings.json | 153 +-
ARCHITECTURE.md | 4 +-
BUILD.md | 36 +-
CHANGELOG.md | 348 +----
Cargo.lock | 503 ++++---
Cargo.toml | 77 +-
README.md | 48 +-
RELEASES.md | 202 +--
api.py | 50 +
ci_docker/Dockerfile | 3 +-
clippy.toml | 4 +-
crates/re_analytics/src/cli.rs | 2 +-
crates/re_analytics/src/lib.rs | 2 +-
crates/re_build_info/src/crate_version.rs | 18 +-
crates/re_build_web_viewer/src/lib.rs | 9 +-
crates/re_build_web_viewer/src/main.rs | 7 +-
crates/re_data_store/src/entity_properties.rs | 31 +-
crates/re_format/Cargo.toml | 2 +-
crates/re_log_types/src/arrow_msg.rs | 6 +-
.../component_types/arrow_convert_shims.rs | 1 +
.../re_log_types/src/component_types/imu.rs | 25 +
.../re_log_types/src/component_types/mod.rs | 12 +-
.../src/component_types/node_graph.rs | 40 +
.../src/component_types/tensor.rs | 2 +-
.../src/component_types/xlink_stats.rs | 28 +
crates/re_log_types/src/lib.rs | 4 +-
crates/re_memory/src/memory_limit.rs | 11 +-
crates/re_renderer/Cargo.toml | 18 +-
crates/re_renderer/examples/2d.rs | 23 +-
crates/re_renderer/examples/depth_cloud.rs | 94 +-
crates/re_renderer/examples/framework.rs | 3 +-
crates/re_renderer/shader/colormap.wgsl | 10 +-
crates/re_renderer/shader/depth_cloud.wgsl | 33 +-
crates/re_renderer/shader/generic_skybox.wgsl | 2 +-
crates/re_renderer/shader/lines.wgsl | 17 +-
crates/re_renderer/shader/point_cloud.wgsl | 9 +-
crates/re_renderer/shader/rectangle_fs.wgsl | 10 +-
.../shader/screen_triangle_vertex.wgsl | 6 +-
crates/re_renderer/shader/types.wgsl | 26 +-
.../re_renderer/shader/utils/sphere_quad.wgsl | 4 +-
.../src/allocator/cpu_write_gpu_read_belt.rs | 11 +-
.../src/allocator/gpu_readback_belt.rs | 28 +-
crates/re_renderer/src/allocator/mod.rs | 3 +-
crates/re_renderer/src/colormap.rs | 6 +
crates/re_renderer/src/config.rs | 54 +-
crates/re_renderer/src/context.rs | 27 +-
crates/re_renderer/src/draw_phases/mod.rs | 3 +-
.../src/draw_phases/picking_layer.rs | 40 +-
.../re_renderer/src/draw_phases/screenshot.rs | 11 +-
crates/re_renderer/src/global_bindings.rs | 4 +-
crates/re_renderer/src/importer/gltf.rs | 12 +-
crates/re_renderer/src/lib.rs | 1 +
.../re_renderer/src/renderer/debug_overlay.rs | 27 +-
.../re_renderer/src/renderer/depth_cloud.rs | 294 ++--
crates/re_renderer/src/renderer/lines.rs | 9 +-
crates/re_renderer/src/renderer/mod.rs | 4 +-
.../re_renderer/src/renderer/point_cloud.rs | 4 +-
crates/re_renderer/src/renderer/rectangles.rs | 60 +-
.../re_renderer/src/resource_managers/mod.rs | 5 +-
.../src/resource_managers/texture_manager.rs | 117 +-
crates/re_renderer/src/texture_info.rs | 206 +++
crates/re_renderer/src/view_builder.rs | 25 +-
.../wgpu_resources/dynamic_resource_pool.rs | 13 +-
crates/re_renderer/src/wgpu_resources/mod.rs | 110 --
.../src/wgpu_resources/sampler_pool.rs | 7 +-
.../src/wgpu_resources/shader_module_pool.rs | 23 +-
.../src/wgpu_resources/texture_pool.rs | 19 +-
crates/re_ui/Cargo.toml | 7 +-
crates/re_ui/data/design_tokens.json | 1287 ++++++++++-------
crates/re_ui/data/icons/gear.png | Bin 0 -> 612 bytes
crates/re_ui/data/icons/rerun_menu.png | Bin 896 -> 11051 bytes
crates/re_ui/data/logo_dark_mode.png | Bin 12227 -> 4402 bytes
crates/re_ui/data/logo_light_mode.png | Bin 12287 -> 4402 bytes
crates/re_ui/src/command.rs | 4 +-
crates/re_ui/src/design_tokens.rs | 65 +-
crates/re_ui/src/icons.rs | 2 +
crates/re_ui/src/lib.rs | 97 ++
crates/re_ui/src/toggle_switch.rs | 64 +-
crates/re_viewer/Cargo.toml | 37 +-
crates/re_viewer/src/app.rs | 141 +-
crates/re_viewer/src/depthai/api.rs | 81 ++
crates/re_viewer/src/depthai/depthai.rs | 822 +++++++++++
crates/re_viewer/src/depthai/mod.rs | 3 +
crates/re_viewer/src/depthai/ws.rs | 247 ++++
crates/re_viewer/src/gpu_bridge/mod.rs | 23 +-
.../re_viewer/src/gpu_bridge/tensor_to_gpu.rs | 22 +-
crates/re_viewer/src/lib.rs | 29 +-
crates/re_viewer/src/misc/selection_state.rs | 6 +-
crates/re_viewer/src/misc/viewer_context.rs | 3 +
crates/re_viewer/src/native.rs | 38 +-
crates/re_viewer/src/ui/auto_layout.rs | 492 ++++++-
crates/re_viewer/src/ui/blueprint.rs | 11 +-
crates/re_viewer/src/ui/bottom_panel/mod.rs | 115 ++
crates/re_viewer/src/ui/data_blueprint.rs | 2 +-
crates/re_viewer/src/ui/data_ui/image.rs | 4 +-
.../re_viewer/src/ui/device_settings_panel.rs | 397 +++++
crates/re_viewer/src/ui/memory_panel.rs | 4 +-
crates/re_viewer/src/ui/mod.rs | 6 +-
.../re_viewer/src/ui/selection_history_ui.rs | 49 +-
crates/re_viewer/src/ui/selection_panel.rs | 273 ++--
crates/re_viewer/src/ui/space_view.rs | 68 +-
.../re_viewer/src/ui/space_view_heuristics.rs | 32 +-
crates/re_viewer/src/ui/stats_panel.rs | 335 +++++
.../src/ui/time_panel/data_density_graph.rs | 2 +-
crates/re_viewer/src/ui/time_panel/mod.rs | 2 +-
crates/re_viewer/src/ui/view_category.rs | 8 +-
.../re_viewer/src/ui/view_node_graph/mod.rs | 5 +
.../re_viewer/src/ui/view_node_graph/scene.rs | 34 +
crates/re_viewer/src/ui/view_node_graph/ui.rs | 91 ++
crates/re_viewer/src/ui/view_spatial/eye.rs | 84 +-
.../src/ui/view_spatial/scene/mod.rs | 18 +-
.../src/ui/view_spatial/scene/picking.rs | 28 +-
.../src/ui/view_spatial/scene/primitives.rs | 22 +-
.../view_spatial/scene/scene_part/images.rs | 209 ++-
.../src/ui/view_spatial/space_camera_3d.rs | 2 +-
crates/re_viewer/src/ui/view_spatial/ui.rs | 115 +-
crates/re_viewer/src/ui/view_spatial/ui_3d.rs | 38 +-
.../src/ui/view_spatial/ui_renderer_bridge.rs | 6 +-
.../src/ui/view_tensor/tensor_slice_to_gpu.rs | 12 +-
crates/re_viewer/src/ui/view_tensor/ui.rs | 5 +-
.../re_viewer/src/ui/view_time_series/ui.rs | 3 +-
crates/re_viewer/src/ui/viewport.rs | 641 ++++----
crates/re_viewer/src/viewer_analytics.rs | 4 +-
crates/re_viewer/src/web.rs | 5 +-
crates/re_web_viewer_server/build.rs | 20 +-
crates/re_web_viewer_server/src/lib.rs | 2 +-
crates/re_ws_comms/src/server.rs | 2 +-
crates/rerun/Cargo.toml | 7 +-
crates/rerun/README.md | 20 +-
crates/rerun/src/clap.rs | 2 +-
crates/rerun/src/crash_handler.rs | 2 +-
crates/rerun/src/lib.rs | 28 +-
crates/rerun/src/main.rs | 2 +-
crates/rerun/src/native_viewer.rs | 1 +
crates/rerun/src/run.rs | 24 +-
design/blueprint_store.md | 10 +-
examples/.gitignore | 1 +
examples/python/README.md | 12 +-
examples/python/api_demo/main.py | 171 +--
examples/python/api_demo/requirements.txt | 2 +-
.../python/arkitscenes/download_dataset.py | 6 +-
examples/python/arkitscenes/main.py | 45 +-
examples/python/arkitscenes/requirements.txt | 2 +-
examples/python/car/main.py | 25 +-
examples/python/car/requirements.txt | 2 +-
examples/python/clock/main.py | 33 +-
examples/python/clock/requirements.txt | 2 +-
examples/python/colmap/main.py | 29 +-
examples/python/colmap/requirements.txt | 2 +-
examples/python/deep_sdf/main.py | 61 +-
examples/python/deep_sdf/requirements.txt | 2 +-
examples/python/dicom/main.py | 13 +-
examples/python/dicom/requirements.txt | 2 +-
examples/python/dna/main.py | 25 +-
examples/python/dna/requirements.txt | 2 +-
examples/python/minimal/main.py | 14 +-
examples/python/minimal/requirements.txt | 2 +-
examples/python/mp_pose/main.py | 37 +-
examples/python/mp_pose/requirements.txt | 2 +-
examples/python/multiprocessing/main.py | 22 +-
.../python/multiprocessing/requirements.txt | 2 +-
examples/python/multithreading/main.py | 18 +-
.../python/multithreading/requirements.txt | 2 +-
examples/python/notebook/README.md | 2 +-
examples/python/notebook/cube.ipynb | 539 ++++---
examples/python/notebook/requirements.txt | 2 +-
examples/python/nyud/main.py | 23 +-
examples/python/nyud/requirements.txt | 2 +-
examples/python/objectron/main.py | 35 +-
examples/python/objectron/requirements.txt | 2 +-
examples/python/opencv_canny/main.py | 30 +-
examples/python/opencv_canny/requirements.txt | 2 +-
examples/python/plots/main.py | 29 +-
examples/python/plots/requirements.txt | 2 +-
examples/python/raw_mesh/main.py | 17 +-
examples/python/raw_mesh/requirements.txt | 2 +-
examples/python/ros/main.py | 34 +-
examples/python/ros/requirements.txt | 2 +-
examples/python/ros/rerun_urdf.py | 6 +-
examples/python/segment_anything/main.py | 27 +-
.../python/segment_anything/requirements.txt | 2 +-
.../stable_diffusion/huggingface_pipeline.py | 52 +-
examples/python/stable_diffusion/main.py | 11 +-
.../python/stable_diffusion/requirements.txt | 2 +-
examples/python/text_logging/main.py | 17 +-
examples/python/text_logging/requirements.txt | 2 +-
examples/python/tracking_hf_opencv/main.py | 42 +-
.../tracking_hf_opencv/requirements.txt | 2 +-
examples/rust/api_demo/Cargo.toml | 2 +-
examples/rust/api_demo/src/main.rs | 8 +-
examples/rust/dna/Cargo.toml | 2 +-
examples/rust/dna/src/main.rs | 6 +-
examples/rust/minimal/Cargo.toml | 2 +-
examples/rust/minimal/src/main.rs | 4 +-
examples/rust/minimal_options/Cargo.toml | 2 +-
examples/rust/minimal_options/src/main.rs | 10 +-
examples/rust/objectron/Cargo.toml | 2 +-
examples/rust/objectron/src/main.rs | 18 +-
examples/rust/raw_mesh/Cargo.toml | 2 +-
examples/rust/raw_mesh/src/main.rs | 16 +-
justfile | 36 +-
rerun_py/Cargo.toml | 14 +-
rerun_py/README.md | 53 +-
.../{rerun => depthai_viewer}/__init__.py | 4 +-
rerun_py/docs/gen_common_index.py | 28 +-
rerun_py/docs/gen_package_index.py | 2 +-
rerun_py/pyproject.toml | 24 +-
rerun_py/requirements-lint.txt | 1 +
.../{rerun => depthai_viewer}/__init__.py | 59 +-
.../{rerun => depthai_viewer}/__main__.py | 2 +-
.../depthai_viewer/_backend/.gitignore | 5 +
.../depthai_viewer/_backend/README.md | 31 +
.../_backend/__init__.py} | 0
.../_backend/classification_labels.py | 107 ++
.../depthai_viewer/_backend/config_api.py | 186 +++
.../depthai_viewer/_backend/depth.py | 71 +
.../_backend/device_configuration.py | 190 +++
.../rerun_sdk/depthai_viewer/_backend/main.py | 360 +++++
.../depthai_viewer/_backend/py.typed | 0
.../depthai_viewer/_backend/pyproject.toml | 12 +
.../depthai_viewer/_backend/sdk_callbacks.py | 163 +++
.../depthai_viewer/_backend/store.py | 53 +
.../depthai_viewer/_backend/topic.py | 24 +
.../color_conversion.py | 0
.../components/__init__.py | 4 +-
.../components/annotation.py | 2 +-
.../components/arrow.py | 4 +-
.../components/box.py | 2 +-
.../components/color.py | 4 +-
.../depthai_viewer/components/imu.py | 38 +
.../components/instance.py | 2 +-
.../components/label.py | 2 +-
.../components/linestrip.py | 2 +-
.../components/point.py | 2 +-
.../components/quaternion.py | 2 +-
.../components/radius.py | 2 +-
.../components/rect2d.py | 2 +-
.../components/scalar.py | 2 +-
.../components/tensor.py | 4 +-
.../components/text_entry.py | 2 +-
.../components/vec.py | 2 +-
.../depthai_viewer/components/xlink_stats.py | 27 +
.../{rerun => depthai_viewer}/log/__init__.py | 3 +-
.../log/annotation.py | 6 +-
.../{rerun => depthai_viewer}/log/arrow.py | 18 +-
.../log/bounding_box.py | 26 +-
.../{rerun => depthai_viewer}/log/camera.py | 4 +-
.../log/error_utils.py | 6 +-
.../log/extension_components.py | 12 +-
.../{rerun => depthai_viewer}/log/file.py | 4 +-
.../{rerun => depthai_viewer}/log/image.py | 8 +-
rerun_py/rerun_sdk/depthai_viewer/log/imu.py | 56 +
.../{rerun => depthai_viewer}/log/lines.py | 16 +-
.../log/log_decorator.py | 8 +-
.../{rerun => depthai_viewer}/log/mesh.py | 6 +-
.../depthai_viewer/log/pipeline_graph.py | 60 +
.../{rerun => depthai_viewer}/log/points.py | 22 +-
.../{rerun => depthai_viewer}/log/rects.py | 20 +-
.../{rerun => depthai_viewer}/log/scalar.py | 18 +-
.../{rerun => depthai_viewer}/log/tensor.py | 12 +-
.../{rerun => depthai_viewer}/log/text.py | 18 +-
.../log/text_internal.py | 10 +-
.../log/transform.py | 8 +-
.../depthai_viewer/log/xlink_stats.py | 22 +
rerun_py/rerun_sdk/depthai_viewer/py.typed | 0
.../{rerun => depthai_viewer}/recording.py | 4 +-
.../script_helpers.py | 32 +-
rerun_py/rerun_sdk/rerun_demo/__init__.py | 8 +-
rerun_py/rerun_sdk/rerun_demo/__main__.py | 42 +-
rerun_py/rerun_sdk/rerun_demo/data.py | 2 +-
rerun_py/src/arrow.rs | 4 +-
rerun_py/src/python_bridge.rs | 14 +-
rerun_py/src/python_session.rs | 22 +-
rerun_py/tests/unit/api_tests.py | 10 +-
rerun_py/tests/unit/test_color_conversion.py | 2 +-
run_wasm/Cargo.toml | 2 +-
run_wasm/src/main.rs | 19 +-
scripts/cargo_deny.sh | 19 +
scripts/clippy_wasm.sh | 4 +-
.../clippy_wasm}/clippy.toml | 0
scripts/generate_changelog.py | 4 +-
scripts/generate_pr_summary.py | 107 ++
scripts/generate_prerelease_pip_index.py | 71 +
scripts/lint.py | 8 +-
scripts/publish_crates.sh | 2 +-
scripts/run_python_e2e_test.py | 10 +-
scripts/templates/pip_index.html | 42 +
scripts/templates/pr_results_summary.html | 65 +
scripts/version_util.py | 34 +-
tests/rust/test_image_memory/Cargo.toml | 2 +-
tests/rust/test_image_memory/src/main.rs | 12 +-
web_viewer/manifest.json | 2 +-
301 files changed, 9525 insertions(+), 4255 deletions(-)
delete mode 100644 .github/workflows/typos.yml
create mode 100644 api.py
create mode 100644 crates/re_log_types/src/component_types/imu.rs
create mode 100644 crates/re_log_types/src/component_types/node_graph.rs
create mode 100644 crates/re_log_types/src/component_types/xlink_stats.rs
create mode 100644 crates/re_renderer/src/texture_info.rs
create mode 100644 crates/re_ui/data/icons/gear.png
create mode 100644 crates/re_viewer/src/depthai/api.rs
create mode 100644 crates/re_viewer/src/depthai/depthai.rs
create mode 100644 crates/re_viewer/src/depthai/mod.rs
create mode 100644 crates/re_viewer/src/depthai/ws.rs
create mode 100644 crates/re_viewer/src/ui/bottom_panel/mod.rs
create mode 100644 crates/re_viewer/src/ui/device_settings_panel.rs
create mode 100644 crates/re_viewer/src/ui/stats_panel.rs
create mode 100644 crates/re_viewer/src/ui/view_node_graph/mod.rs
create mode 100644 crates/re_viewer/src/ui/view_node_graph/scene.rs
create mode 100644 crates/re_viewer/src/ui/view_node_graph/ui.rs
create mode 100644 examples/.gitignore
rename rerun_py/{rerun => depthai_viewer}/__init__.py (89%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/__init__.py (88%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/__main__.py (74%)
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/.gitignore
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/README.md
rename rerun_py/rerun_sdk/{rerun/py.typed => depthai_viewer/_backend/__init__.py} (100%)
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/classification_labels.py
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/config_api.py
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/depth.py
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/device_configuration.py
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/main.py
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/py.typed
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/pyproject.toml
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/sdk_callbacks.py
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/store.py
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/_backend/topic.py
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/color_conversion.py (100%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/__init__.py (97%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/annotation.py (94%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/arrow.py (88%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/box.py (90%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/color.py (84%)
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/components/imu.py
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/instance.py (91%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/label.py (89%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/linestrip.py (96%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/point.py (95%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/quaternion.py (90%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/radius.py (89%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/rect2d.py (97%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/scalar.py (94%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/tensor.py (97%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/text_entry.py (92%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/components/vec.py (94%)
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/components/xlink_stats.py
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/__init__.py (98%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/annotation.py (97%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/arrow.py (83%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/bounding_box.py (81%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/camera.py (94%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/error_utils.py (87%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/extension_components.py (92%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/file.py (96%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/image.py (96%)
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/log/imu.py
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/lines.py (92%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/log_decorator.py (86%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/mesh.py (97%)
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/log/pipeline_graph.py
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/points.py (93%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/rects.py (91%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/scalar.py (90%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/tensor.py (91%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/text.py (87%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/text_internal.py (90%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/log/transform.py (96%)
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/log/xlink_stats.py
create mode 100644 rerun_py/rerun_sdk/depthai_viewer/py.typed
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/recording.py (97%)
rename rerun_py/rerun_sdk/{rerun => depthai_viewer}/script_helpers.py (78%)
create mode 100755 scripts/cargo_deny.sh
rename {clippy_wasm => scripts/clippy_wasm}/clippy.toml (100%)
create mode 100644 scripts/generate_pr_summary.py
create mode 100644 scripts/generate_prerelease_pip_index.py
create mode 100644 scripts/templates/pip_index.html
create mode 100644 scripts/templates/pr_results_summary.html
diff --git a/.cargo/config.toml b/.cargo/config.toml
index b44a938e2904..3bd9e9b437d3 100644
--- a/.cargo/config.toml
+++ b/.cargo/config.toml
@@ -7,3 +7,19 @@ run-wasm = "run --release --package run_wasm --"
# Some of our build.rs files only run if this is set,
# so that we don't run them on cargo publish or on users machines.
IS_IN_RERUN_WORKSPACE = "yes"
+
+
+# [target.x86_64-unknown-linux-gnu]
+# linker = "clang"
+# rustflags = [
+# "-C",
+# "link-arg=-fuse-ld=/usr/bin/mold",
+# "-C",
+# "split-debuginfo=unpacked",
+# ]
+# web_sys_unstable_apis is required to enable the web_sys clipboard API which egui_web uses,
+# https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html
+# as well as WebGPU apis.
+# https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html
+[target.wasm32-unknown-unknown]
+rustflags = ["--cfg=web_sys_unstable_apis"]
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 99f0096817a2..f2e91a7e8adf 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -13,5 +13,10 @@ To get an auto-generated PR description you can put "copilot:summary" or "copilo
### What
### Checklist
-* [ ] I have read and agree to [Contributor Guide](https://github.com/rerun-io/rerun/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/rerun-io/rerun/blob/main/CODE_OF_CONDUCT.md)
-* [ ] I've included a screenshot or gif (if applicable)
+
+- [ ] I have read and agree to [Contributor Guide](https://github.com/rerun-io/rerun/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/rerun-io/rerun/blob/main/CODE_OF_CONDUCT.md)
+- [ ] I've included a screenshot or gif (if applicable)
+
+
+
+PR Build Summary: {{ pr-build-summary }}
diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml
index aed2272b2b4b..979dccb13717 100644
--- a/.github/workflows/labels.yml
+++ b/.github/workflows/labels.yml
@@ -29,4 +29,4 @@ jobs:
with:
mode: minimum
count: 1
- labels: "📊 analytics, 🪳 bug, 🧑💻 dev experience, dependencies, 📖 documentation, 💬 discussion, examples, 📉 performance, 🐍 python API, ⛃ re_datastore, 📺 re_viewer, 🔺 re_renderer, 🚜 refactor, ⛴ release, 🦀 rust SDK, 🔨 testing, ui, 🕸️ web"
+ labels: "📊 analytics, 🪳 bug, 🧑💻 dev experience, 📖 documentation, examples, 📉 performance, 🐍 python API, ⛃ re_datastore, 📺 re_viewer, 🔺 re_renderer, ⛴ release, 🦀 rust SDK, 🔨 testing, ui, 🕸️ web"
diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index 491c5353550a..36cc25318920 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -8,19 +8,12 @@ on:
- "main"
tags:
- "v*.*.*" # on release tag
- workflow_dispatch:
- inputs:
- force_build_wheel:
- description: "Build python wheels"
- required: true
- default: false
- type: boolean
env:
PYTHON_VERSION: "3.8"
PRE_RELEASE_INSTRUCTIONS: |
## Installing the pre-release Python SDK
- 1. Download the correct `.whl`.
+ 1. Download the correct `.whl`. For Mac M1/M2, grab the "universal2" `.whl`
2. Run `pip install rerun_sdk<...>.whl` (replace `<...>` with the actual filename)
3. Test it: `rerun --version`
UBUNTU_REQUIRED_PKGS: libgtk-3-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev libfontconfig1-dev libatk-bridge2.0 libfreetype6-dev libglib2.0-dev
@@ -63,163 +56,11 @@ jobs:
just py-requirements
# ---------------------------------------------------------------------------
- # We need one wheel-build to be special so the other builds (namely mac arm) can use its rrd
- # This copy-paste is awful, but we'll refactor the build soon.
- wheels-linux:
- if: github.event_name == 'push' || github.event.inputs.force_build_wheel
- name: Build Python Wheels (Linux)
- runs-on: ubuntu-latest
- container:
- image: rerunio/ci_docker:0.6
- steps:
- - uses: actions/checkout@v3
-
- # These should already be in the docker container, but run for good measure. A no-op install
- # should be fast, and this way things don't break if we add new packages without rebuilding
- # docker
- - name: Cache APT Packages
- uses: awalsh128/cache-apt-pkgs-action@v1.2.2
- with:
- packages: ${{ env.UBUNTU_REQUIRED_PKGS }}
- version: 2.0 # Increment this to pull newer packages
- execute_install_scripts: true
-
- - name: Set up cargo cache
- uses: Swatinem/rust-cache@v2
- with:
- env-vars: CARGO CC CFLAGS CXX CMAKE RUST CACHE_KEY
- # Don't update the cache -- it will be updated by the lint job
- # TODO(jleibs): this job will likely run before rust.yml updates
- # the cache. Better cross-job sequencing would be nice here
- save-if: False
-
- # These should already be in the docker container, but run for good measure. A no-op install
- # should be fast, and this way things don't break if we add new packages without rebuilding
- # docker
- - run: pip install -r rerun_py/requirements-build.txt
-
- # ----------------------------------------------------------------------------------
-
- - name: Patch Cargo.toml for pre-release
- if: github.ref == 'refs/heads/main'
- # After patching the pre-release version, run cargo update.
- # This updates the cargo.lock file with the new version numbers and keeps the wheel build from failing
- run: |
- python3 scripts/version_util.py --patch_prerelease
- cargo update -w
-
- - name: Version check for tagged-release
- if: startsWith(github.ref, 'refs/tags/v')
- # This call to version_util.py will assert version from Cargo.toml matches git tagged version vX.Y.Z
- run: |
- python3 scripts/version_util.py --check_version
-
- - name: Store the expected version
- # Find the current cargo version and store it in the GITHUB_ENV var: `expected_version`
- shell: bash
- run: |
- echo "expected_version=$(python3 scripts/version_util.py --bare_cargo_version)" >> $GITHUB_ENV
-
- - name: Build Wheel
- uses: PyO3/maturin-action@v1
- with:
- maturin-version: "0.14.10"
- manylinux: manylinux_2_31
- container: off
- command: build
- args: |
- --manifest-path rerun_py/Cargo.toml
- --release
- --target x86_64-unknown-linux-gnu
- --no-default-features
- --features pypi
- --out pre-dist
-
- - name: Install wheel dependencies
- # First we install the dependencies manually so we can use `--no-index` when installing the wheel.
- # This needs to be a separate step for some reason or the following step fails
- # TODO(jleibs): pull these deps from pyproject.toml
- # TODO(jleibs): understand why deps can't be installed in the same step as the wheel
- shell: bash
- run: |
- pip install deprecated numpy>=1.23 pyarrow==10.0.1
-
- - name: Install built wheel
- # Now install the wheel using a specific version and --no-index to guarantee we get the version from
- # the pre-dist folder. Note we don't use --force-reinstall here because --no-index means it wouldn't
- # find the dependencies to reinstall them.
- shell: bash
- run: |
- pip uninstall rerun-sdk
- pip install rerun-sdk==${{ env.expected_version }} --no-index --find-links pre-dist
-
- - name: Verify built wheel version
- shell: bash
- run: |
- python3 -m rerun --version
- which rerun
- rerun --version
-
- - name: Run unit tests
- shell: bash
- run: cd rerun_py/tests && pytest
-
- - name: Run e2e test
- shell: bash
- run: RUST_LOG=debug scripts/run_python_e2e_test.py --no-build # rerun-sdk is already built and installed
-
- - name: Unpack the wheel
- shell: bash
- run: |
- mkdir unpack-dist
- wheel unpack pre-dist/*.whl --dest unpack-dist
-
- - name: Get the folder name
- shell: bash
- run: |
- echo "pkg_folder=$(ls unpack-dist)" >> $GITHUB_ENV
-
- - name: Cache RRD dataset
- id: dataset
- uses: actions/cache@v3
- with:
- path: examples/python/colmap/dataset/
- # TODO(jleibs): Derive this key from the invocation below
- key: colmap-dataset-colmap-fiat-v0
-
- - name: Generate Embedded RRD file
- shell: bash
- # If you change the line below you should almost definitely change the `key:` line above by giving it a new, unique name
- run: |
- mkdir rrd
- pip install -r examples/python/colmap/requirements.txt
- python3 examples/python/colmap/main.py --dataset colmap_fiat --resize 800x600 --save rrd/colmap_fiat.rrd
- cp rrd/colmap_fiat.rrd unpack-dist/${{ env.pkg_folder }}/rerun_sdk/rerun_demo/colmap_fiat.rrd
-
- - name: Repack the wheel
- shell: bash
- run: |
- mkdir dist
- wheel pack unpack-dist/${{ env.pkg_folder }} --dest dist/
-
- - name: Upload wheels
- uses: actions/upload-artifact@v3
- with:
- name: wheels
- path: dist
-
- # All platforms are currently creating the same rrd file, upload one of them
- - name: Save RRD artifact
- uses: actions/upload-artifact@v3
- with:
- name: rrd
- path: rrd
- # ---------------------------------------------------------------------------
matrix-setup:
# Building all the wheels is expensive, so we only run this job when we push (to main or release tags),
- # or if the job was manually triggered with `force_build_wheel` set to true.
- if: github.event_name == 'push' || github.event.inputs.force_build_wheel
+ # or if the PR has the 'build wheels' label for explicit testing of wheels.
+ if: github.event_name == 'push' || contains( github.event.pull_request.labels.*.name, '🛞 build wheels')
runs-on: ubuntu-latest
outputs:
@@ -234,33 +75,52 @@ jobs:
env:
JOB_CONTEXT: ${{ toJson(job) }}
run: echo "$JOB_CONTEXT"
+ # Sets TAGGED_OR_MAIN if this workflow is running on a tag or the main branch.
+ - name: Set TAGGED_OR_MAIN
+ if: startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main'
+ run: echo "TAGGED_OR_MAIN=1" >> $GITHUB_ENV
- id: set-matrix
shell: bash
- # TODO(jleibs): figure out why tests are failing to complete on `x86_64-apple-darwin`
- # See: https://github.com/rerun-io/rerun/pull/1853
run: |
matrix=()
- matrix+=('{"platform": "macos", "target": "x86_64-apple-darwin", "run_tests": false, "runs_on": "macos-latest" },')
- matrix+=('{"platform": "macos", "target": "aarch64-apple-darwin", "run_tests": false, "runs_on": "macos-latest" },') # NOTE: we can't run tests on arm since our macos runner is x86_64
- matrix+=('{"platform": "windows", "target": "x86_64-pc-windows-msvc", "run_tests": true, "runs_on": "windows-latest-8-cores"},')
+
+ if [[ $TAGGED_OR_MAIN ]]; then
+ # MacOS build is really slow (>30 mins); uses up a lot of CI minutes
+ matrix+=('{"platform": "macos", "runs_on": "macos-latest"},')
+ fi
+ matrix+=('{"platform": "windows", "runs_on": "windows-latest-8-cores"},')
+ matrix+=('{"platform": "linux", "runs_on": "ubuntu-latest-16-cores", container: {"image": "rerunio/ci_docker:0.5"}}')
echo "Matrix values: ${matrix[@]}"
echo "matrix={\"include\":[${matrix[@]}]}" >> $GITHUB_OUTPUT
wheels:
- name: Build Remaining Python Wheels
- needs: [lint, matrix-setup, wheels-linux]
+ name: Build Python Wheels
+ needs: [lint, matrix-setup]
strategy:
matrix: ${{fromJson(needs.matrix-setup.outputs.matrix)}}
runs-on: ${{ matrix.runs_on }}
+ container: ${{ matrix.container }}
+
steps:
- uses: actions/checkout@v3
+ # These should already be in the docker container, but run for good measure. A no-op install
+ # should be fast, and this way things don't break if we add new packages without rebuilding
+ # docker
+ - name: Cache APT Packages
+ if: matrix.platform == 'linux'
+ uses: awalsh128/cache-apt-pkgs-action@v1.2.2
+ with:
+ packages: ${{ env.UBUNTU_REQUIRED_PKGS }}
+ version: 2.0 # Increment this to pull newer packages
+ execute_install_scripts: true
+
- name: Set up cargo cache
uses: Swatinem/rust-cache@v2
with:
@@ -273,6 +133,7 @@ jobs:
# The pip-cache setup logic doesn't work in the ubuntu docker container
# That's probably fine since we bake these deps into the container already
- name: Setup python
+ if: matrix.platform != 'linux'
uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_VERSION }}
@@ -321,11 +182,11 @@ jobs:
- name: Patch Cargo.toml for pre-release
if: github.ref == 'refs/heads/main'
- # After patching the pre-release version, run cargo update.
+ # After patching the pre-release version, run cargo check.
# This updates the cargo.lock file with the new version numbers and keeps the wheel build from failing
run: |
python3 scripts/version_util.py --patch_prerelease
- cargo update -w
+ cargo check
- name: Version check for tagged-release
if: startsWith(github.ref, 'refs/tags/v')
@@ -333,12 +194,6 @@ jobs:
run: |
python3 scripts/version_util.py --check_version
- - name: Store the expected version
- # Find the current cargo version and store it in the GITHUB_ENV var: `expected_version`
- shell: bash
- run: |
- echo "expected_version=$(python3 scripts/version_util.py --bare_cargo_version)" >> $GITHUB_ENV
-
- name: Build Wheel
uses: PyO3/maturin-action@v1
with:
@@ -349,42 +204,18 @@ jobs:
args: |
--manifest-path rerun_py/Cargo.toml
--release
- --target ${{ matrix.target }}
--no-default-features
--features pypi
+ --universal2
--out pre-dist
- name: Install built wheel
- if: ${{ matrix.run_tests }}
- # First we install the dependencies manually so we can use `--no-index` when installing the wheel.
- # Then install the wheel using a specific version and --no-index to guarantee we get the version from
- # the pre-dist folder. Note we don't use --force-reinstall here because --no-index means it wouldn't
- # find the dependencies to reinstall them.
- # TODO(jleibs): pull these deps from pyproject.toml
- shell: bash
run: |
- pip uninstall rerun-sdk
- pip install deprecated numpy>=1.23 pyarrow==10.0.1
- pip install rerun-sdk==${{ env.expected_version }} --no-index --find-links pre-dist
+ pip install rerun-sdk --find-links pre-dist --force-reinstall
- - name: Verify built wheel version
- if: ${{ matrix.run_tests }}
- shell: bash
- run: |
- python3 -m rerun --version
- which rerun
- rerun --version
-
- - name: Run unit tests
- if: ${{ matrix.run_tests }}
- shell: bash
+ - name: Run tests
run: cd rerun_py/tests && pytest
- - name: Run e2e test
- if: ${{ matrix.run_tests }}
- shell: bash
- run: RUST_LOG=debug scripts/run_python_e2e_test.py --no-build # rerun-sdk is already built and installed
-
- name: Unpack the wheel
shell: bash
run: |
@@ -396,17 +227,21 @@ jobs:
run: |
echo "pkg_folder=$(ls unpack-dist)" >> $GITHUB_ENV
- - name: Download RRD
- uses: actions/download-artifact@v3
+ - name: Cache RRD dataset
+ id: dataset
+ uses: actions/cache@v3
with:
- name: rrd
- path: rrd
+ path: examples/python/colmap/dataset/
+ # TODO(jleibs): Derive this key from the invocation below
+ key: colmap-dataset-colmap-fiat-v0
- - name: Insert the rrd
+ - name: Generate Embedded RRD file
shell: bash
# If you change the line below you should almost definitely change the `key:` line above by giving it a new, unique name
run: |
- cp rrd/colmap_fiat.rrd unpack-dist/${{ env.pkg_folder }}/rerun_sdk/rerun_demo/colmap_fiat.rrd
+ pip install -r examples/python/colmap/requirements.txt
+ python3 examples/python/colmap/main.py --dataset colmap_fiat --resize 800x600 --save colmap.rrd
+ cp colmap.rrd unpack-dist/${{ env.pkg_folder }}/rerun_sdk/rerun_demo/colmap.rrd
- name: Repack the wheel
shell: bash
@@ -422,60 +257,6 @@ jobs:
# ---------------------------------------------------------------------------
- upload_rrd:
- name: Upload RRD to GCloud
- permissions:
- contents: "read"
- id-token: "write"
- needs: [wheels]
- runs-on: "ubuntu-latest"
- steps:
- - name: Download Artifact
- uses: actions/download-artifact@v3
- with:
- name: rrd
- path: rrd
-
- - id: "auth"
- uses: google-github-actions/auth@v1
- with:
- workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }}
- service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }}
-
- - name: Add SHORT_SHA env property with commit short sha
- run: echo "SHORT_SHA=`echo ${{github.sha}} | cut -c1-7`" >> $GITHUB_ENV
-
- - name: "Upload RRD (commit)"
- uses: google-github-actions/upload-cloud-storage@v1
- with:
- path: "rrd"
- destination: "rerun-example-rrd/commit/${{env.SHORT_SHA}}"
- parent: false
-
- - name: "Upload RRD (prerelease)"
- if: "!startsWith(github.ref , 'refs/tags/v')"
- uses: google-github-actions/upload-cloud-storage@v1
- with:
- path: "rrd"
- destination: "rerun-example-rrd/prerelease"
- parent: false
-
- - name: "Upload RRD (tagged)"
- if: startsWith(github.ref, 'refs/tags/v')
- uses: google-github-actions/upload-cloud-storage@v1
- with:
- path: "rrd"
- destination: "rerun-example-rrd/version/${{github.ref_name}}"
- parent: false
-
- - name: "Upload RRD (latest release)"
- if: github.ref == 'latest'
- uses: google-github-actions/upload-cloud-storage@v1
- with:
- path: "rrd"
- destination: "rerun-example-rrd/latest"
- parent: false
-
# See https://github.com/ncipollo/release-action
pre-release:
name: Pre Release
@@ -492,28 +273,34 @@ jobs:
# First delete the old prerelease. If we don't do this, we don't get things like
# proper source-archives and changelog info.
# https://github.com/dev-drprasad/delete-tag-and-release
- - uses: dev-drprasad/delete-tag-and-release@v0.2.1
+ - uses: dev-drprasad/delete-tag-and-release@v0.2.0
with:
tag_name: prerelease
delete_release: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # Re-tag the prerelease with the commit from this build
+ # https://github.com/richardsimko/update-tag
+ - name: Update prerelease tag
+ uses: richardsimko/update-tag@v1
+ with:
+ tag_name: prerelease
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
# Create the actual prerelease
- # https://github.com/ncipollo/release-action
+ # https://github.com/softprops/action-gh-release
- name: GitHub Release
- uses: ncipollo/release-action@v1.12.0
+ uses: softprops/action-gh-release@v0.1.15
with:
+ name: "Development Build"
body: ${{ env.PRE_RELEASE_INSTRUCTIONS }}
prerelease: true
- artifacts: dist/*
- name: "Development Build"
- tag: "prerelease"
+ tag_name: prerelease
+ files: dist/*
token: ${{ secrets.GITHUB_TOKEN }}
- generateReleaseNotes: true
- allowUpdates: true
- removeArtifacts: true
- replacesArtifacts: true
+ generate_release_notes: true
# ---------------------------------------------------------------------------
@@ -530,14 +317,13 @@ jobs:
name: wheels
path: dist
- # https://github.com/ncipollo/release-action
- name: GitHub Release
- uses: ncipollo/release-action@v1.12.0
+ uses: softprops/action-gh-release@v0.1.15
with:
- prerelease: true
- artifacts: dist/*
+ prerelease: false
+ files: dist/*
token: ${{ secrets.GITHUB_TOKEN }}
- generateReleaseNotes: true
+ generate_release_notes: true
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
@@ -602,28 +388,14 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- # Mike will incrementally update the existing gh-pages branch
- # We then check it out, and reset it to a new orphaned branch, which we force-push to origin
- # to make sure we don't accumulate unnecessary history in gh-pages branch
- name: Deploy via mike # https://github.com/jimporter/mike
if: startsWith(github.ref, 'refs/tags/v')
run: |
git fetch
- mike deploy -F rerun_py/mkdocs.yml --rebase -b gh-pages --prefix docs/python -u ${{github.ref_name}} latest
- git checkout gh-pages
- git checkout --orphan gh-pages-orphan
- git commit -m "Update docs for ${GITHUB_SHA}"
- git push origin gh-pages-orphan:gh-pages -f
-
- # Mike will incrementally update the existing gh-pages branch
- # We then check it out, and reset it to a new orphaned branch, which we force-push to origin
- # to make sure we don't accumulate unnecessary history in gh-pages branch
+ mike deploy -F rerun_py/mkdocs.yml -p --rebase -b gh-pages --prefix docs/python -u ${{github.ref_name}} latest
+
- name: Deploy tag via mike # https://github.com/jimporter/mike
if: github.ref == 'refs/heads/main'
run: |
git fetch
- mike deploy -F rerun_py/mkdocs.yml --rebase -b gh-pages --prefix docs/python HEAD
- git checkout gh-pages
- git checkout --orphan gh-pages-orphan
- git commit -m "Update docs for ${GITHUB_SHA}"
- git push origin gh-pages-orphan:gh-pages -f
+ mike deploy -F rerun_py/mkdocs.yml -p --rebase -b gh-pages --prefix docs/python HEAD
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index f48703b53395..22cc2658a4d0 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -5,18 +5,6 @@ on:
branches:
- "main"
pull_request:
- workflow_dispatch:
- inputs:
- force_update_web_build:
- description: "Upload web build to google cloud"
- required: true
- default: false
- type: boolean
- force_run_benchmarks:
- description: "Run the rust benchmarks"
- required: true
- default: false
- type: boolean
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }} # Cancel previous CI jobs on the same branch
@@ -26,10 +14,10 @@ env:
# web_sys_unstable_apis is required to enable the web_sys clipboard API which egui_web uses
# https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html
# https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html
- RUSTFLAGS: --cfg=web_sys_unstable_apis --deny warnings
+ RUSTFLAGS: --cfg=web_sys_unstable_apis -D warnings
# See https://github.com/ericseppanen/cargo-cranky/issues/8
- RUSTDOCFLAGS: --deny warnings --deny rustdoc::missing_crate_level_docs
+ RUSTDOCFLAGS: -D warnings -D rustdoc::missing_crate_level_docs
permissions:
# deployments permission to deploy GitHub pages website
@@ -38,16 +26,15 @@ permissions:
contents: write
jobs:
- # See the benchmarks at https://ref.rerun.io/dev/bench/
rs-benchmarks:
name: Rust Criterion benchmarks
- # Only run the rs-benchmarks job when a commit gets pushed to main or we manually specify it
- if: ${{ github.ref == 'refs/heads/main' || github.event.inputs.force_run_benchmarks }}
+ # Only save the rs-benchmarks job when a commit gets pushed to main
+ if: ${{ github.event_name == 'push' }}
runs-on: ubuntu-latest-16-cores
container:
- image: rerunio/ci_docker:0.6
+ image: rerunio/ci_docker:0.5
env:
RUSTFLAGS: ${{env.RUSTFLAGS}}
RUSTDOCFLAGS: ${{env.RUSTDOCFLAGS}}
@@ -71,13 +58,12 @@ jobs:
--all-features \
-p re_arrow_store \
-p re_data_store \
- -p re_log_encoding \
+ -p re_log_types \
-p re_query \
-p re_tuid \
-- --output-format=bencher | tee output.txt
- name: Store benchmark result
- # https://github.com/benchmark-action/github-action-benchmark
uses: benchmark-action/github-action-benchmark@v1
with:
name: Rust Benchmark
@@ -89,11 +75,10 @@ jobs:
comment-on-alert: true
alert-threshold: "150%"
fail-on-alert: true
- comment-always: false # Generates too much GitHub notification spam
+ comment-always: true
- # Save, results and push to GitHub only on main
- save-data-file: ${{ github.ref == 'refs/heads/main' }}
- auto-push: ${{ github.ref == 'refs/heads/main' }}
+ # Push and deploy GitHub pages branch automatically
+ auto-push: true
gh-pages-branch: gh-pages
benchmark-data-dir-path: dev/bench
max-items-in-chart: 30
@@ -104,7 +89,7 @@ jobs:
name: Rust lints (fmt, check, cranky, tests, doc)
runs-on: ubuntu-latest-16-cores
container:
- image: rerunio/ci_docker:0.6
+ image: rerunio/ci_docker:0.5
env:
RUSTFLAGS: ${{env.RUSTFLAGS}}
RUSTDOCFLAGS: ${{env.RUSTDOCFLAGS}}
@@ -137,22 +122,13 @@ jobs:
uses: actions-rs/cargo@v1
with:
command: cranky
- args: --all-targets --all-features -- --deny warnings
+ args: --all-targets --all-features -- -D warnings
- # --------------------------------------------------------------------------------
- # Check a few important permutations of the feature flags for our `rerun` library:
- - name: Check rerun with `--no-default-features``
+ - name: Check no default features
uses: actions-rs/cargo@v1
with:
- command: cranky
- args: --locked -p rerun --no-default-features
-
- - name: Check rerun with `--features sdk`
- uses: actions-rs/cargo@v1
- with:
- command: cranky
- args: --locked -p rerun --no-default-features --features sdk
- # --------------------------------------------------------------------------------
+ command: check
+ args: --locked --no-default-features --features __ci --lib
- name: Test doc-tests
uses: actions-rs/cargo@v1
@@ -210,7 +186,7 @@ jobs:
name: Check Rust web build (wasm32 + wasm-bindgen)
runs-on: ubuntu-latest-16-cores
container:
- image: rerunio/ci_docker:0.6
+ image: rerunio/ci_docker:0.5
env:
RUSTFLAGS: ${{env.RUSTFLAGS}}
RUSTDOCFLAGS: ${{env.RUSTDOCFLAGS}}
@@ -219,8 +195,8 @@ jobs:
- uses: actions-rs/toolchain@v1
with:
- profile: default
- toolchain: 1.67.1
+ profile: minimal
+ toolchain: 1.67.0
target: wasm32-unknown-unknown
override: true
@@ -231,138 +207,53 @@ jobs:
# See: https://github.com/rerun-io/rerun/pull/497
save-if: ${{ github.event_name == 'push'}}
- - name: clippy check re_viewer wasm32
- run: ./scripts/clippy_wasm.sh
-
- - name: Check re_renderer examples wasm32
+ - name: Check re_viewer wasm32
uses: actions-rs/cargo@v1
with:
command: check
- args: --locked --target wasm32-unknown-unknown --target-dir target_wasm -p re_renderer --examples
+ args: --locked --all-features --lib --target wasm32-unknown-unknown -p re_viewer
- - name: Build web-viewer (debug)
+ - name: Check re_renderer examples wasm32
uses: actions-rs/cargo@v1
with:
- command: run
- args: --locked -p re_build_web_viewer -- --debug
+ command: check
+ args: --locked --target wasm32-unknown-unknown -p re_renderer --examples
- # ---------------------------------------------------------------------------
+ - run: ./scripts/wasm_bindgen_check.sh --skip-setup
- rs-build-web-viewer:
- name: Upload web build to google cloud (wasm32 + wasm-bindgen)
- permissions:
- contents: "read"
- id-token: "write"
+ # ---------------------------------------------------------------------------
- if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') || github.event.inputs.force_update_web_build
+ rs-cargo-deny:
+ name: Check Rust dependencies (cargo-deny)
runs-on: ubuntu-latest-16-cores
container:
- image: rerunio/ci_docker:0.6
+ image: rerunio/ci_docker:0.5
env:
RUSTFLAGS: ${{env.RUSTFLAGS}}
RUSTDOCFLAGS: ${{env.RUSTDOCFLAGS}}
steps:
- uses: actions/checkout@v2
- - uses: actions-rs/toolchain@v1
- with:
- profile: minimal
- toolchain: 1.67.0
- target: wasm32-unknown-unknown
- override: true
-
- - name: Set up cargo cache
- uses: Swatinem/rust-cache@v2
- with:
- env-vars: CARGO CC CFLAGS CXX CMAKE RUST CACHE_KEY
- # See: https://github.com/rerun-io/rerun/pull/497
- save-if: ${{ github.event_name == 'push'}}
-
- - name: Patch Cargo.toml for pre-release
- if: "!startsWith(github.ref , 'refs/tags/v')"
- # After patching the pre-release version, run cargo update.
- # This updates the cargo.lock file with the new version numbers and keeps the wheel build from failing
- run: |
- python3 scripts/version_util.py --patch_prerelease
- cargo update -w
-
- - name: Build web-viewer (release)
+ - name: cargo deny aarch64-apple-darwin check
uses: actions-rs/cargo@v1
with:
- command: run
- args: --locked -p re_build_web_viewer -- --release
-
- # Upload the wasm, html etc to a Google cloud bucket:
- - id: "auth"
- uses: google-github-actions/auth@v1
- with:
- workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }}
- service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }}
-
- - name: Add SHORT_SHA env property with commit short sha
- run: echo "SHORT_SHA=`echo ${{github.sha}} | cut -c1-7`" >> $GITHUB_ENV
-
- - name: "Upload web-viewer (commit)"
- uses: google-github-actions/upload-cloud-storage@v1
- with:
- path: "web_viewer"
- destination: "rerun-web-viewer/commit/${{env.SHORT_SHA}}"
- parent: false
-
- - name: "Upload web-viewer (prerelease)"
- if: github.ref == 'refs/heads/main'
- uses: google-github-actions/upload-cloud-storage@v1
- with:
- path: "web_viewer"
- destination: "rerun-web-viewer/prerelease"
- parent: false
+ command: deny
+ args: --log-level=error --all-features --target aarch64-apple-darwin check
- - name: "Upload web-viewer (tagged)"
- if: startsWith(github.ref, 'refs/tags/v')
- uses: google-github-actions/upload-cloud-storage@v1
+ - name: cargo deny wasm32-unknown-unknown check
+ uses: actions-rs/cargo@v1
with:
- path: "web_viewer"
- destination: "rerun-web-viewer/version/${{github.ref_name}}"
- parent: false
+ command: deny
+ args: --log-level=error --all-features --target wasm32-unknown-unknown check
- - name: "Upload web-viewer (latest release)"
- if: github.ref == 'latest'
- uses: google-github-actions/upload-cloud-storage@v1
+ - name: cargo deny x86_64-pc-windows-msvc
+ uses: actions-rs/cargo@v1
with:
- path: "web_viewer"
- destination: "rerun-web-viewer/latest"
- parent: false
-
- # ---------------------------------------------------------------------------
-
- rs-cargo-deny:
- name: Check Rust dependencies (cargo-deny)
- runs-on: ubuntu-latest-16-cores
- container:
- image: rerunio/ci_docker:0.6
- env:
- RUSTFLAGS: ${{env.RUSTFLAGS}}
- RUSTDOCFLAGS: ${{env.RUSTDOCFLAGS}}
+ command: deny
+ args: --log-level=error --all-features --target x86_64-pc-windows-msvc check
- # TODO(emilk): remove this matrix when https://github.com/EmbarkStudios/cargo-deny/issues/324 is resolved
- strategy:
- fail-fast: false
- matrix:
- platform:
- - i686-pc-windows-gnu
- - i686-pc-windows-msvc
- - i686-unknown-linux-gnu
- - wasm32-unknown-unknown
- - x86_64-apple-darwin
- - x86_64-pc-windows-gnu
- - x86_64-pc-windows-msvc
- - x86_64-unknown-linux-gnu
- - x86_64-unknown-redox
-
- steps:
- - uses: actions/checkout@v3
- - uses: EmbarkStudios/cargo-deny-action@v1
+ - name: cargo deny x86_64-unknown-linux-musl check
+ uses: actions-rs/cargo@v1
with:
- command: check
- log-level: error
- arguments: --all-features --target ${{ matrix.platform }}
+ command: deny
+ args: --log-level=error --all-features --target x86_64-unknown-linux-musl check
diff --git a/.github/workflows/toml.yml b/.github/workflows/toml.yml
index f3a60ec74885..120735d1f729 100644
--- a/.github/workflows/toml.yml
+++ b/.github/workflows/toml.yml
@@ -20,7 +20,7 @@ jobs:
- uses: actions-rs/toolchain@v1
with:
profile: minimal
- toolchain: 1.67.1
+ toolchain: 1.67.0
override: true
- name: Set up cargo cache
diff --git a/.github/workflows/typos.yml b/.github/workflows/typos.yml
deleted file mode 100644
index c3bc84125f51..000000000000
--- a/.github/workflows/typos.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-# https://github.com/crate-ci/typos
-# Add exceptions to _typos.toml
-# install and run locally: cargo install typos-cli && typos
-
-name: Spell Check
-on: [pull_request]
-
-jobs:
- run:
- name: Spell Check
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions Repository
- uses: actions/checkout@v2
-
- - name: Check spelling of entire workspace
- uses: crate-ci/typos@master
diff --git a/.mypy.ini b/.mypy.ini
index 3975c2924ca1..e1c3f9421600 100644
--- a/.mypy.ini
+++ b/.mypy.ini
@@ -1,5 +1,5 @@
[mypy]
-files = rerun_py/rerun_sdk/rerun, rerun_py/tests, examples/python
+files = rerun_py/rerun_sdk/depthai_viewer, rerun_py/tests, examples/python
exclude = examples/python/objectron/proto|examples/python/ros
namespace_packages = True
show_error_codes = True
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index aae305c13ea6..32731cdfadeb 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -2,17 +2,18 @@
// See https://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
- "charliermarsh.ruff", // Ruff for linting
+ "charliermarsh.ruff",
+ "github.vscode-github-actions",
"ms-python.python",
- "ms-vsliveshare.vsliveshare", // Live Share
+ "ms-vsliveshare.vsliveshare",
"polymeilex.wgsl",
- "rust-lang.rust-analyzer", // Rust-analyzer
+ "rust-lang.rust-analyzer",
"serayuzgur.crates",
"streetsidesoftware.code-spell-checker",
- "tamasfe.even-better-toml", // TOML LSP
- "vadimcn.vscode-lldb", // CodeLLDB
- "wayou.vscode-todo-highlight", // TODO Highlight
- "webfreak.debug", // Native Debug
- "zxh404.vscode-proto3", // vscode-proto3
+ "tamasfe.even-better-toml",
+ "vadimcn.vscode-lldb",
+ "wayou.vscode-todo-highlight",
+ "webfreak.debug",
+ "zxh404.vscode-proto3",
]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index c52ea2c7178d..1722a88e03b3 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,82 +1,75 @@
{
- "editor.formatOnSave": true,
- "editor.semanticTokenColorCustomizations": {
- "rules": {
- "*.unsafe:rust": "#eb5046"
- }
- },
- "files.insertFinalNewline": true,
- "files.trimTrailingWhitespace": true,
- "files.exclude": {
- "env/**": true,
- "target/**": true,
- "target_ra/**": true,
- "target_wasm/**": true,
- },
- "files.autoGuessEncoding": true,
- "python.formatting.provider": "black",
- "python.formatting.blackArgs": [
- "--config",
- "rerun_py/pyproject.toml"
- ],
- "python.linting.mypyEnabled": true,
- "python.linting.enabled": true,
- "cSpell.words": [
- "andreas",
- "bbox",
- "bindgroup",
- "colormap",
- "emath",
- "framebuffer",
- "hoverable",
- "ilog",
- "jumpflooding",
- "Keypoint",
- "memoffset",
- "nyud",
- "objectron",
- "Readback",
- "readbacks",
- "Skybox",
- "smallvec",
- "swapchain",
- "texcoords",
- "Tonemapper",
- "tonemapping",
- "voronoi",
- "vram",
- "Wgsl"
- ],
- // don't share a cargo lock with rust-analyzer.
- // see https://github.com/rerun-io/rerun/pull/519 for rationale
- "rust-analyzer.checkOnSave.overrideCommand": [
- "cargo",
- "cranky",
- "--target-dir=target_ra",
- "--workspace",
- "--message-format=json",
- "--all-targets",
- "--all-features", // --all-features will set the `__ci` feature flag, which stops crates/re_web_viewer_server/build.rs from building the web viewer
- ],
- "rust-analyzer.cargo.buildScripts.overrideCommand": [
- "cargo",
- "check",
- "--quiet",
- "--target-dir=target_ra",
- "--workspace",
- "--message-format=json",
- "--all-targets",
- "--all-features", // --all-features will set the `__ci` feature flag, which stops crates/re_web_viewer_server/build.rs from building the web viewer
- ],
- // Our build scripts are generating code.
- // Having Rust Analyzer do this while doing other builds can lead to catastrophic failures.
- // INCLUDING attempts to publish a new release!
- "rust-analyzer.cargo.buildScripts.enable": false,
- "python.analysis.extraPaths": [
- "rerun_py/rerun_sdk"
- ],
- "ruff.args": [
- "--config",
- "rerun_py/pyproject.toml"
- ],
+ "editor.formatOnSave": true,
+ "editor.semanticTokenColorCustomizations": {
+ "rules": {
+ "*.unsafe:rust": "#eb5046"
+ }
+ },
+ "files.insertFinalNewline": true,
+ "files.trimTrailingWhitespace": true,
+ "files.exclude": {
+ "env/**": true,
+ "target/**": true,
+ "target_ra/**": true,
+ "target_wasm/**": true
+ },
+ "files.autoGuessEncoding": true,
+ "python.formatting.provider": "black",
+ "python.formatting.blackArgs": ["--config", "rerun_py/pyproject.toml"],
+ "python.linting.mypyEnabled": true,
+ "python.linting.enabled": true,
+ "cSpell.words": [
+ "andreas",
+ "bbox",
+ "bindgroup",
+ "colormap",
+ "emath",
+ "framebuffer",
+ "hoverable",
+ "ilog",
+ "jumpflooding",
+ "Keypoint",
+ "memoffset",
+ "nyud",
+ "objectron",
+ "Readback",
+ "readbacks",
+ "Skybox",
+ "smallvec",
+ "swapchain",
+ "texcoords",
+ "Tonemapper",
+ "tonemapping",
+ "unsmoothed",
+ "voronoi",
+ "vram",
+ "Wgsl"
+ ],
+ // don't share a cargo lock with rust-analyzer.
+ // see https://github.com/rerun-io/rerun/pull/519 for rationale
+ "rust-analyzer.checkOnSave.overrideCommand": [
+ "cargo",
+ "cranky",
+ "--target-dir=target_ra",
+ "--workspace",
+ "--message-format=json",
+ "--all-targets",
+ "--all-features" // --all-features will set the `__ci` feature flag, which stops crates/re_web_viewer_server/build.rs from building the web viewer
+ ],
+ "rust-analyzer.cargo.buildScripts.overrideCommand": [
+ "cargo",
+ "check",
+ "--quiet",
+ "--target-dir=target_ra",
+ "--workspace",
+ "--message-format=json",
+ "--all-targets",
+ "--all-features" // --all-features will set the `__ci` feature flag, which stops crates/re_web_viewer_server/build.rs from building the web viewer
+ ],
+ // Our build scripts are generating code.
+ // Having Rust Analyzer do this while doing other builds can lead to catastrophic failures.
+ // INCLUDING attempts to publish a new release!
+ "rust-analyzer.cargo.buildScripts.enable": false,
+ "python.analysis.extraPaths": ["rerun_py/rerun_sdk"],
+ "ruff.args": ["--config", "rerun_py/pyproject.toml"]
}
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index 31fb2a572c63..cd2e4c7115e3 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -22,10 +22,10 @@ The logging data can be written to disk as `.rrd` files, or transmitted over TCP
The Rerun Viewer is where log data is visualized. It is usually run as a native app, but can also be compiled to WebAssembly (Wasm) and run in a browser.
#### Native viewer
-The easiest way to launch the viewer is directly from the logging API with `rr.init("my_app", spawn=True)`. However, the standalone viewer can also be run from the command line, for example to view an `.rrd` file: `rerun mydata.rrd`.
+The easiest way to launch the viewer is directly from the logging API with `viewer.init("my_app", spawn=True)`. However, the standalone viewer can also be run from the command line, for example to view an `.rrd` file: `rerun mydata.rrd`.
#### Web viewer
-You can try running the viewer in a browser using `rr.serve()` in python, or using `rerun --web-viewer mydata.rrd`.
+You can try running the viewer in a browser using `viewer.serve()` in python, or using `rerun --web-viewer mydata.rrd`.
The web viewer consists of just a few small files - a thin `.html`, a `.wasm` blob, and an auto-generated `.js` bridge for the wasm. These files are served using the [`re_web_viewer_server`](https://github.com/rerun-io/rerun/tree/latest/crates/re_web_viewer_server) crate.
diff --git a/BUILD.md b/BUILD.md
index 011e4d29b023..433d64953270 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -1,22 +1,22 @@
# Building Rerun
-This is a guide to how to build Rerun.
+This is a guide to how to build Rerun.
## See also
-* [`rerun_py/README.md`](rerun_py/README.md) - build instructions for Python SDK
-* [`ARCHITECTURE.md`](ARCHITECTURE.md)
-* [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
-* [`CODE_STYLE.md`](CODE_STYLE.md)
-* [`CONTRIBUTING.md`](CONTRIBUTING.md)
-* [`RELEASES.md`](RELEASES.md)
+- [`rerun_py/README.md`](rerun_py/README.md) - build instructions for Python SDK
+- [`ARCHITECTURE.md`](ARCHITECTURE.md)
+- [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
+- [`CODE_STYLE.md`](CODE_STYLE.md)
+- [`CONTRIBUTING.md`](CONTRIBUTING.md)
+- [`RELEASES.md`](RELEASES.md)
## Getting started with the repository.
-* Install the Rust toolchain:
-* `git clone git@github.com:rerun-io/rerun.git && cd rerun`
-* Run `./scripts/setup_dev.sh`.
-* Make sure `cargo --version` prints `1.67.1` once you are done
+- Install the Rust toolchain:
+- `git clone git@github.com:rerun-io/rerun.git && cd rerun`
+- Run `./scripts/setup_dev.sh`.
+- Make sure `cargo --version` prints `1.67.1` once you are done
### Apple-silicon Macs
@@ -35,7 +35,8 @@ Python API docs can be found at and are built
Rust documentation is hosted on . You can build them locally with: `cargo doc --all-features --no-deps --open`
## Build and install the Rerun Python SDK
-Rerun is available as a package on PyPi and can be installed with `pip install rerun-sdk`
+
+Rerun is available as a package on PyPi and can be installed with `pip install depthai-viewer`
Additionally, prebuilt dev wheels from head of main are available at .
@@ -64,18 +65,19 @@ From here on out, we assume you have this virtualenv activated.
### Build and install
You need to setup your build environment once with
+
```sh
./scripts/setup.sh
```
Then install the Rerun SDK with:
+
```
pip install ./rerun_py
```
> Note: If you are unable to upgrade pip to version `>=21.3`, you need to pass `--use-feature=in-tree-build` to the `pip install` command.
-
## Improving compile times
As of today, we link everything statically in both debug and release builds, which makes custom linkers and split debuginfo the two most impactful tools we have at our disposal in order to improve compile times.
@@ -87,9 +89,11 @@ These tools can configured through your `Cargo` configuration, available at `$HO
On x64 macOS, use the [zld](https://github.com/michaeleisel/zld) linker and keep debuginfo in a single separate file.
Pre-requisites:
+
- Install [zld](https://github.com/michaeleisel/zld): `brew install michaeleisel/zld/zld`.
`config.toml` (x64):
+
```toml
[target.x86_64-apple-darwin]
rustflags = [
@@ -103,6 +107,7 @@ rustflags = [
On Apple-silicon Mac (M1, M2), the default settings are already pretty good. The default linker is just as good as `zld`. Do NOT set `split-debuginfo=packed`, as that will make linking a lot slower. You can set `split-debuginfo=unpacked` for a small improvement.
`config.toml` (M1, M2):
+
```toml
[target.aarch64-apple-darwin]
rustflags = [
@@ -116,9 +121,11 @@ rustflags = [
On Linux, use the [mold](https://github.com/rui314/mold) linker and keep DWARF debuginfo in separate files.
Pre-requisites:
+
- Install [mold](https://github.com/rui314/mold) through your package manager.
`config.toml`:
+
```toml
[target.x86_64-unknown-linux-gnu]
linker = "clang"
@@ -135,13 +142,16 @@ rustflags = [
On Windows, use LLVM's `lld` linker and keep debuginfo in a single separate file.
Pre-requisites:
+
- Install `lld`:
+
```
cargo install -f cargo-binutils
rustup component add llvm-tools-preview
```
`config.toml`:
+
```toml
[target.x86_64-pc-windows-msvc]
linker = "rust-lld.exe"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1a7093067a19..2a840fe9a9b9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,347 +1,5 @@
-# Rerun changelog
+# Depthai Viewer changelog
+## 0.0.1
-## [Unreleased](https://github.com/rerun-io/rerun/compare/latest...HEAD)
-…
-
-## [0.4.0](https://github.com/rerun-io/rerun/compare/v0.3.1...v0.4.0) - Outlines, web viewer and performance improvements
-
-https://user-images.githubusercontent.com/1220815/228241887-03b311e2-80e9-4541-9281-6d334a15ab04.mp4
-
-
-## Overview & Highlights
-* Add support for mesh vertex colors [#1671](https://github.com/rerun-io/rerun/pull/1671)
-* Lower memory use [#1535](https://github.com/rerun-io/rerun/pull/1535)
-* Improve garbage collection [#1560](https://github.com/rerun-io/rerun/pull/1560)
-* Improve the web viewer [#1596](https://github.com/rerun-io/rerun/pull/1596) [#1594](https://github.com/rerun-io/rerun/pull/1594) [#1682](https://github.com/rerun-io/rerun/pull/1682) [#1716](https://github.com/rerun-io/rerun/pull/1716) …
-* Nice outlines when hovering/selecting
-* Add an example of forever-streaming a web-camera image to Rerun [#1502](https://github.com/rerun-io/rerun/pull/1502)
-* Fix crash-on-save on some versions of Linux [#1402](https://github.com/rerun-io/rerun/pull/1402)
-* And a lot of other bug fixes
-* Many performance improvements
-
-We now host an experimental and unpolished web-viewer at for anyone to try out!
-
-### In Detail
-
-#### 🐍 Python SDK
-- Expose all Rerun enums and types to main module scope [#1598](https://github.com/rerun-io/rerun/pull/1598)
-- Make `log_point` more forgiving and update docstring [#1663](https://github.com/rerun-io/rerun/pull/1663)
-- Add support for mesh vertex colors [#1671](https://github.com/rerun-io/rerun/pull/1671)
-
-#### 🦀 Rust SDK
-- ⚠️ `Session::new` has been replaced with `SessionBuilder` [#1528](https://github.com/rerun-io/rerun/pull/1528)
-- ⚠️ `session.spawn(…)` -> `rerun::native_viewer::spawn(session, …)` [#1507](https://github.com/rerun-io/rerun/pull/1507)
-- ⚠️ `session.show()` -> `rerun::native_viewer::show(session)` [#1507](https://github.com/rerun-io/rerun/pull/1507)
-- ⚠️ `session.serve(…)` -> `rerun::serve_web_viewer(session, …);` [#1507](https://github.com/rerun-io/rerun/pull/1507)
-- ⚠️ `rerun::global_session` is now hidden behind the `global_session` feature flag [#1507](https://github.com/rerun-io/rerun/pull/1507)
-- Add support for mesh vertex colors [#1671](https://github.com/rerun-io/rerun/pull/1671)
-
-#### 🪳 Bug Fixes
-- datastore: disable compaction (fixes 2x memory issue) [#1535](https://github.com/rerun-io/rerun/pull/1535)
-- Fix garbage collection [#1560](https://github.com/rerun-io/rerun/pull/1560)
-- Avoid using undefined extern "C" on windows [#1577](https://github.com/rerun-io/rerun/pull/1577)
-- Fix crash on decoding old .rrd files [#1579](https://github.com/rerun-io/rerun/pull/1579)
-- datastore: stabilize dataframe sorts [#1549](https://github.com/rerun-io/rerun/pull/1549)
-- Stop using infinities in wgsl shaders [#1594](https://github.com/rerun-io/rerun/pull/1594)
-- Workaround for alpha to coverage state leaking on (Web)GL renderer [#1596](https://github.com/rerun-io/rerun/pull/1596)
-- Use a patched `wasm-bindgen-cli` with fix for 2GiB bug [#1605](https://github.com/rerun-io/rerun/pull/1605)
-- Misc: make example in `log_pinhole` runable [#1609](https://github.com/rerun-io/rerun/pull/1609) (thanks [@Sjouks](https://github.com/Sjouks)!)
-- Early-out on zero-sized space-views to prevent crashes [#1623](https://github.com/rerun-io/rerun/pull/1623)
-- Print our own callstack on panics [#1622](https://github.com/rerun-io/rerun/pull/1622)
-- Handle ctrl+c to gracefully shutdown the server(s) [#1613](https://github.com/rerun-io/rerun/pull/1613)
-- Fix crash on serve exit, second attempt [#1633](https://github.com/rerun-io/rerun/pull/1633)
-- Fix wrong remove-tooltip for entities and groups [#1637](https://github.com/rerun-io/rerun/pull/1637)
-- Fix requiring requiring focus for shutdown via ctrl+c when starting viewer from command line [#1646](https://github.com/rerun-io/rerun/pull/1646)
-- Fix eye spin after eye reset [#1652](https://github.com/rerun-io/rerun/pull/1652)
-- Fix crash on negative radii by instead warning [#1654](https://github.com/rerun-io/rerun/pull/1654)
-- Fix crash when trying to listen on a taken TCP port [#1650](https://github.com/rerun-io/rerun/pull/1650)
-- Don't show 2D labels in 3D space views. [#1641](https://github.com/rerun-io/rerun/pull/1641)
-- Fix Z fighting with improved depth offset math [#1661](https://github.com/rerun-io/rerun/pull/1661)
-- Whether a spatial view is 2d or 3d is now reevaluated over time unless picked explicitly [#1660](https://github.com/rerun-io/rerun/pull/1660)
-- Update wgpu to v0.15.3, fixing meshes on Windows Chrome [#1682](https://github.com/rerun-io/rerun/pull/1682)
-- Fix a bug in the image hover code, causing the wrong RGBA values to be printed [#1690](https://github.com/rerun-io/rerun/pull/1690)
-- Fix a bug that caused points to be render too large [#1690](https://github.com/rerun-io/rerun/pull/1690)
-- Fix web crash on missing uniform buffer padding [#1699](https://github.com/rerun-io/rerun/pull/1699)
-- Fix `memory_usage` example relying on implicit recursive features [#1709](https://github.com/rerun-io/rerun/pull/1709)
-- Track changed state in nav mode combo box [#1703](https://github.com/rerun-io/rerun/pull/1703)
-- Fix crash-on-save by switching file-picker dialog to `xdg-portal` [#1402](https://github.com/rerun-io/rerun/pull/1402)
-- Change roll-shortcut from ALT to SHIFT [#1715](https://github.com/rerun-io/rerun/pull/1715)
-- Fix CpuWriteGpuReadBelt producing unaligned gpu buffer offsets [#1716](https://github.com/rerun-io/rerun/pull/1716)
-- Fix arrows requiring a radius to be visible [#1720](https://github.com/rerun-io/rerun/pull/1720)
-
-#### 🚀 Performance Improvements
-- Add re_arrow_store profile scopes [#1546](https://github.com/rerun-io/rerun/pull/1546)
-- datastore: early exit missing components at table level [#1554](https://github.com/rerun-io/rerun/pull/1554)
-- datastore: track bucket count in store stats & mem panel [#1555](https://github.com/rerun-io/rerun/pull/1555)
-- LogDb: dont split on index bucket size [#1558](https://github.com/rerun-io/rerun/pull/1558)
-- Introduce a simpler cache dedicated to just decode JPEGs [#1550](https://github.com/rerun-io/rerun/pull/1550)
-- Implement outlines for points 2d/3d/depth & use them for select & hover in Viewer [#1568](https://github.com/rerun-io/rerun/pull/1568)
-- Simplify ImageCache [#1551](https://github.com/rerun-io/rerun/pull/1551)
-- New time panel density graph [#1557](https://github.com/rerun-io/rerun/pull/1557)
-- Refactor the Arrow Mesh3D type to use zero-copy Buffers [#1691](https://github.com/rerun-io/rerun/pull/1691)
-- Remove the redundant costly transform check during categorization [#1695](https://github.com/rerun-io/rerun/pull/1695)
-- batching 3: `DataRow` & `DataTable` + no bundles outside of transport [#1673](https://github.com/rerun-io/rerun/pull/1673)
-
-#### 🧑🏫 Examples
-- Very simple example streaming from an opencv camera [#1502](https://github.com/rerun-io/rerun/pull/1502)
-- Initial TurtleBot subscriber demo [#1523](https://github.com/rerun-io/rerun/pull/1523)
-
-#### 📚 Docs
-- Link to the Python SDK build instructions in `rerun_py/README.md` [#1565](https://github.com/rerun-io/rerun/pull/1565)
-
-#### 🖼 UI Improvements
-- Fix combining outline mask for selection & hover [#1552](https://github.com/rerun-io/rerun/pull/1552)
-- Implement outlines for rectangles & use them for select & hover of image primitives in Viewer [#1559](https://github.com/rerun-io/rerun/pull/1559)
-- Show log messages in egui toast notifications [#1603](https://github.com/rerun-io/rerun/pull/1603)
-- Adapt UI for smaller screens [#1608](https://github.com/rerun-io/rerun/pull/1608)
-- Nicer toast notifications [#1621](https://github.com/rerun-io/rerun/pull/1621)
-- Don't hover things in 2D/3D views if we are dragging something [#1643](https://github.com/rerun-io/rerun/pull/1643)
-- Allow rolling 3D camera with primary mouse button + alt modifier [#1659](https://github.com/rerun-io/rerun/pull/1659)
-- Name space views after the space and indicate duplicate names [#1653](https://github.com/rerun-io/rerun/pull/1653)
-- Add banner about mobile browsers being unsupported [#1674](https://github.com/rerun-io/rerun/pull/1674)
-- Improve ui for tensors and color map selection [#1683](https://github.com/rerun-io/rerun/pull/1683)
-- Only show the mobile OS warning banner on web [#1685](https://github.com/rerun-io/rerun/pull/1685)
-- Improve the depth backprojection feature [#1690](https://github.com/rerun-io/rerun/pull/1690)
-- Swap overlay order of selection & hover outlines [#1705](https://github.com/rerun-io/rerun/pull/1705)
-- Turn on depth cloud backprojection by default [#1710](https://github.com/rerun-io/rerun/pull/1710)
-- Add radius boost for depth clouds on outline [#1713](https://github.com/rerun-io/rerun/pull/1713)
-
-#### 🤷♂️ Other Viewer Improvements
-- Fix web feature name in error messages [#1521](https://github.com/rerun-io/rerun/pull/1521)
-- Use outlines for mesh selections instead of highlight colors [#1540](https://github.com/rerun-io/rerun/pull/1540)
-- Implement outlines for line renderer & use them for select & hover of "line-like" primitives in Viewer [#1553](https://github.com/rerun-io/rerun/pull/1553)
-- Load .rrd file over HTTP [#1600](https://github.com/rerun-io/rerun/pull/1600)
-- Revert "Handle ctrl+c to gracefully shutdown the server(s)" [#1632](https://github.com/rerun-io/rerun/pull/1632)
-- More eager GC, and remove `--fast-math` optimization for wasm [#1656](https://github.com/rerun-io/rerun/pull/1656)
-- Detect failure to install GUI log callback [#1655](https://github.com/rerun-io/rerun/pull/1655)
-- Warn when most of the RAM has been used up by Rerun [#1651](https://github.com/rerun-io/rerun/pull/1651)
-- Apply color maps to all types of depth tensors [#1686](https://github.com/rerun-io/rerun/pull/1686)
-- Size boosted outlines for points & lines, color & size tweaking [#1667](https://github.com/rerun-io/rerun/pull/1667)
-- Default point radius to 1.5 ui points [#1706](https://github.com/rerun-io/rerun/pull/1706)
-- When streaming an rrd from http: play it, don't follow it [#1707](https://github.com/rerun-io/rerun/pull/1707)
-
-#### 🕸️ Web
-- Use `log` as our log backend instead of `tracing` [#1590](https://github.com/rerun-io/rerun/pull/1590)
-- Turn on allocation tracker at run-time and for web [#1591](https://github.com/rerun-io/rerun/pull/1591)
-- Set correct MIME types in re_web_viewer_server [#1602](https://github.com/rerun-io/rerun/pull/1602)
-- Upload web viewer to a bucket [#1606](https://github.com/rerun-io/rerun/pull/1606)
-- Use hostname for default websocket address [#1664](https://github.com/rerun-io/rerun/pull/1664)
-- Upload the colmap rrd file to gcloud [#1666](https://github.com/rerun-io/rerun/pull/1666)
-- Show a warning by default on mobile browsers [#1670](https://github.com/rerun-io/rerun/pull/1670)
-- Add analytics to the hosted index.html [#1675](https://github.com/rerun-io/rerun/pull/1675)
-- Always upload latest prerelease to a dedicated prefix [#1676](https://github.com/rerun-io/rerun/pull/1676)
-- Allow url param override on app.rerun.io [#1678](https://github.com/rerun-io/rerun/pull/1678)
-- Show the git commit in the about section in pre-release builds [#1677](https://github.com/rerun-io/rerun/pull/1677)
-- Update the web icon [#1688](https://github.com/rerun-io/rerun/pull/1688)
-
-#### 🎨 Renderer Improvements
-- Outlines via masking & postprocessing in `re_renderer` [#1532](https://github.com/rerun-io/rerun/pull/1532)
-- Add missing profiling scopes in `re_renderer` [#1567](https://github.com/rerun-io/rerun/pull/1567)
-- Don't call `wgpu::Device::poll` on the web [#1626](https://github.com/rerun-io/rerun/pull/1626)
-- Merge final outline render into composite step in order to fix blending [#1629](https://github.com/rerun-io/rerun/pull/1629)
-- renderer: fix the groupby logic in mesh instancing [#1657](https://github.com/rerun-io/rerun/pull/1657)
-- Fix outlines being offset diagonally by about half a pixel [#1668](https://github.com/rerun-io/rerun/pull/1668)
-- Gpu readback belt for fast & easy data readback from gpu [#1687](https://github.com/rerun-io/rerun/pull/1687)
-- Make CpuWriteGpuReadBelt texture copies easier/less error prone [#1689](https://github.com/rerun-io/rerun/pull/1689)
-
-#### ✨ Other Enhancement
-- datastore: split out formatting & sanity checks in their own modules [#1625](https://github.com/rerun-io/rerun/pull/1625)
-- Add `rerun --save`: stream incoming log stream to an rrd file [#1662](https://github.com/rerun-io/rerun/pull/1662)
-- batching 1: introduce `DataCell` & retire `ComponentBundle` [#1634](https://github.com/rerun-io/rerun/pull/1634)
-- Data store batching 2: split out component traits [#1636](https://github.com/rerun-io/rerun/pull/1636)
-
-#### 📈 Analytics
-- Analytics: don't spam warning when there is an HTTP connection problem [#1564](https://github.com/rerun-io/rerun/pull/1564)
-- Analytics: Rename "location" to "file_line" in the "crash-panic" event [#1575](https://github.com/rerun-io/rerun/pull/1575)
-
-#### 🗣 Merged RFCs
-- RFC: component-datatype conversions [#1595](https://github.com/rerun-io/rerun/pull/1595)
-- RFC: pre-proposal for blueprint store [#1582](https://github.com/rerun-io/rerun/pull/1582)
-
-#### 🧑💻 Dev-experience
-- Update `rayon` [#1541](https://github.com/rerun-io/rerun/pull/1541)
-- Fix some `1.68` clippy lints [#1569](https://github.com/rerun-io/rerun/pull/1569)
-- Remove duplicated 'nix' crate [#1479](https://github.com/rerun-io/rerun/pull/1479)
-- Better MsgId format [#1566](https://github.com/rerun-io/rerun/pull/1566)
-- Lint vertical spacing in Rust code [#1572](https://github.com/rerun-io/rerun/pull/1572)
-- CI: Replace wasm_bindgen_check.sh with actually building the web-viewer [#1604](https://github.com/rerun-io/rerun/pull/1604)
-- Add --all-features to Rust Analyzer flags [#1624](https://github.com/rerun-io/rerun/pull/1624)
-- Run clippy for wasm, with own clippy.toml config file [#1628](https://github.com/rerun-io/rerun/pull/1628)
-- Update tokio v1.24.1 -> v1.26.0 [#1635](https://github.com/rerun-io/rerun/pull/1635)
-- Add a workflow input for running benchmarks manually [#1698](https://github.com/rerun-io/rerun/pull/1698)
-- Add missing } to fix rust workflow [#1700](https://github.com/rerun-io/rerun/pull/1700)
-- Fix `lint.py` [#1719](https://github.com/rerun-io/rerun/pull/1719)
-- Add a script that generates a changelog from recent PRs and their labels [#1718](https://github.com/rerun-io/rerun/pull/1718)
-
-#### 🤷♂️ Other
-- Clean up opencv_canny example slightly [b487e550dcb87225858dc6f76b791a25e938e75e](https://github.com/rerun-io/rerun/commit/b487e550dcb87225858dc6f76b791a25e938e75e)
-- Lint fixes [9901e7c6735356b1970ddabc926bc5378d82e057](https://github.com/rerun-io/rerun/commit/9901e7c6735356b1970ddabc926bc5378d82e057)
-
-
-## [0.3.1](https://github.com/rerun-io/rerun/compare/v0.3.0...v0.3.1) - Remove potentially sensitive analytics
-
-Remove potentially sensitive analytics, including path to rerun source code on panics, and rerun branch name when building from source [#1563](https://github.com/rerun-io/rerun/pull/1563)
-
-
-## [0.3.0](https://github.com/rerun-io/rerun/compare/v0.2.0...v0.3.0)
-### Overview & Highlights
-
-After a successful launch a couple of weeks ago, we're back with our second release!
-With a few exceptions this release focuses on internal refactors & improving our processes.
-However, we think you'll enjoy these goodies that made it in nonetheless!
-
-https://user-images.githubusercontent.com/2910679/222510504-23871b8c-0bef-49c2-bbd2-37baab4247e8.mp4
-
-
-You can now generate point clouds directly from depth textures and choose a wide variety of color maps.
-Check out this [video](https://user-images.githubusercontent.com/1220815/223365363-da13585f-3a91-4cb8-a6ef-8a6fadbeb4eb.webm) on how to use it.
-This is **a lot** faster and more convenient than doing so manually in your own code
-Some caveats: Picking is not yet working and visible history may behave differently (related to [#723](https://github.com/rerun-io/rerun/issues/723))
-
-Other highlights:
-
-* Viewer
- * Improved formatting of date-times in plots [#1356](https://github.com/rerun-io/rerun/pull/1356)
- * Labels for 3D objects have now a color can now be selected & hovered [#1438](https://github.com/rerun-io/rerun/pull/1438)
- * Scale factor is saved across sessions and more persistent between screens [#1448](https://github.com/rerun-io/rerun/pull/1448)
- * Showing tensors in the viewer is now faster
-* SDK
- * Python packages now work with Ubuntu-20.04 [#1334](https://github.com/rerun-io/rerun/pull/1334)
- * u8 segmentation stay u8 now (they converted to u16 before) [#1376](https://github.com/rerun-io/rerun/pull/1376)
- * 2D Line strips can now be logged directly [#1430](https://github.com/rerun-io/rerun/pull/1430)
- * Add a `strict` mode to the Python SDK where misuses of the API result in exceptions being raised.[#1477](https://github.com/rerun-io/rerun/pull/1477)
- * Fix disabling Python API through `init` not working [#1517](https://github.com/rerun-io/rerun/pull/1517)
-* General
- * We build now with fewer build dependencies (there is however [still more work to do!](https://github.com/rerun-io/rerun/issues/1316)).
- Notably, we previously used a version of the `time` crate which had a security issue (CVE-2020-26235), thanks @mpizenberg for helping out!
- * Print more information & troubleshooting info on crash
-
-Meanwhile, we did a bunch of improvements to our manual. If you had trouble running Rerun so far, check our updated [troubleshooting](https://www.rerun.io/docs/getting-started/troubleshooting) page (and as always, please [open an issue](https://github.com/rerun-io/rerun/issues/new/choose) if something doesn't work).
-
-⚠️ BREAKING: old `.rrd` files no longer load ⚠️
-
-### In Detail
-#### New Features
-* Generate point clouds directly from depth textures
- * re_renderer: implement depth cloud renderer [#1415](https://github.com/rerun-io/rerun/pull/1415)
- * Integrate depth clouds into Rerun [#1421](https://github.com/rerun-io/rerun/pull/1421)
- * CPU & GPU color maps [#1484](https://github.com/rerun-io/rerun/pull/1484)
- * Integrate GPU color maps into depth clouds [#1486](https://github.com/rerun-io/rerun/pull/1486)
-* Python SDK: Add strict mode [#1477](https://github.com/rerun-io/rerun/pull/1477)
-* OS independent Zoom factor & serialization thereof [#1448](https://github.com/rerun-io/rerun/pull/1448)
-* Labels for 3D objects have now a color can now be selected & hovered [#1438](https://github.com/rerun-io/rerun/pull/1438)
-* Add 2d support for linestrips [#1430](https://github.com/rerun-io/rerun/pull/1430)
-* Add signal handler on *nix with troubleshooting and stacktrace [#1340](https://github.com/rerun-io/rerun/pull/1340)
- * Point users to our troubleshooting page on panic [#1338](https://github.com/rerun-io/rerun/pull/1338)
-
-#### Performance
-* Speed up conversions for color arrays in Python [#1454](https://github.com/rerun-io/rerun/pull/1454)
-* Speed up fixed-sized array iteration [#1050](https://github.com/rerun-io/rerun/pull/1050)
-* Speed up tensor handling by padding data through more directly
- * Direct conversion to dynamic image from Tensors [#1455](https://github.com/rerun-io/rerun/pull/1455)
- * Convert view_tensor to use the new native Tensors [#1439](https://github.com/rerun-io/rerun/pull/1439)
-* Add option to show performance metrics in the UI in release builds too [#1444](https://github.com/rerun-io/rerun/pull/1444)
-* Faster stable diffusion sample [#1364](https://github.com/rerun-io/rerun/pull/1364)
-* SDK: stream to disk with `save` feature [#1405](https://github.com/rerun-io/rerun/pull/1405)
-* `re_renderer` has now a direct CPU->GPU copy mechanism
- * `CpuWriteGpuReadBelt` for fast frame by frame memory transfers [#1382](https://github.com/rerun-io/rerun/pull/1382)
- * Uniform buffer utility using `CpuWriteGpuReadBelt` [#1400](https://github.com/rerun-io/rerun/pull/1400)
- * Use `CpuWriteGpuReadBelt` for mesh data gpu upload [#1416](https://github.com/rerun-io/rerun/pull/1416)
-
-#### Small improvements & Bugfixes
-* UI
- * Add scroll-bars the "Add/Remove entities" window [#1445](https://github.com/rerun-io/rerun/pull/1445)
- * Unify the time formatting between the time panel and the plot [#1369](https://github.com/rerun-io/rerun/pull/1369)
- * Timeline
- * Fix precision issue when zooming in on the timeline [#1370](https://github.com/rerun-io/rerun/pull/1370)
- * Improve the gap-detector [#1363](https://github.com/rerun-io/rerun/pull/1363)
- * Better time axis on plot view [#1356](https://github.com/rerun-io/rerun/pull/1356)
- * Prevent wrap on 'Streams' text [#1308](https://github.com/rerun-io/rerun/pull/1308)
- * Update to eframe 0.21.3 with fix for web text input [#1311](https://github.com/rerun-io/rerun/pull/1311)
-* `re_renderer`
- * Fix crash due to always expecting Rgba8Unorm backbuffer on Web & Bgra8Unorm on native [#1413](https://github.com/rerun-io/rerun/pull/1413)
- * Allow controlling the graphics backend & power preference through standard wgpu env vars [#1332](https://github.com/rerun-io/rerun/pull/1332)
-* Heuristic for camera frustum length is now based on scene size [#1433](https://github.com/rerun-io/rerun/pull/1433)
-* Fix python type signature for tensor names [#1443](https://github.com/rerun-io/rerun/pull/1443)
-* Don't convert u8 segmentation images to u16 [#1376](https://github.com/rerun-io/rerun/pull/1376)
-* Docs (excluding the manual)
- * Improve the docs of `connect` and `serve` [#1450](https://github.com/rerun-io/rerun/pull/1450)
- * Update log_mesh and log_meshes docs. [#1286](https://github.com/rerun-io/rerun/pull/1286)
- * Add guidelines for adding dependencies in a PR [#1431](https://github.com/rerun-io/rerun/pull/1431)
- * Add a few more sections to `CODE_STYLE.md` [#1365](https://github.com/rerun-io/rerun/pull/1365)
- * Fixup for some doc links [#1314](https://github.com/rerun-io/rerun/pull/1314)
- * Document undocumented environment variables on help page. [#1335](https://github.com/rerun-io/rerun/pull/1335)
- * Link to SDK operating modes doc in both SDK [#1330](https://github.com/rerun-io/rerun/pull/1330)
-* More information in `--version` [#1388](https://github.com/rerun-io/rerun/pull/1388)
-* Remove already broken `show` method from Python SDK [#1429](https://github.com/rerun-io/rerun/pull/1429)
-* Analytics
- * Send analytics events with callstacks on panics and signals [#1409](https://github.com/rerun-io/rerun/pull/1409)
- * Put all analytics to one bucket [#1390](https://github.com/rerun-io/rerun/pull/1390)
- * add event for when we serve the web-viewer .wasm [#1379](https://github.com/rerun-io/rerun/pull/1379)
- * register SDK language and data source [#1371](https://github.com/rerun-io/rerun/pull/1371)
- * Refactor analytics [#1368](https://github.com/rerun-io/rerun/pull/1368)
-* Versioned log streams streams [#1420](https://github.com/rerun-io/rerun/pull/1420)
-* Fix path issues when running debug viewer within workspace [#1341](https://github.com/rerun-io/rerun/pull/1341)
-* Detailed errors for re_renderer `include_file!` [#1339](https://github.com/rerun-io/rerun/pull/1339)
-* Limit logging in web-viewer to `warn` in order to workaround a crash issue (and reduce log spam) [1514](https://github.com/rerun-io/rerun/pull/1514)
-* Fix disabling API through `init` not working [#1517](https://github.com/rerun-io/rerun/pull/1517)
-
-#### CI, Testing & Build improvements
-* Reduce build dependencies
- * Get rid of time 0.1.* dependency [#1408](https://github.com/rerun-io/rerun/pull/1408)
- * Remove unnecessary ordered-float [#1461](https://github.com/rerun-io/rerun/pull/1461)
- * Remove extraneous `image` features and dependencies [#1425](https://github.com/rerun-io/rerun/pull/1425)
- * Replace `reqwest` with `ureq` [#1407](https://github.com/rerun-io/rerun/pull/1407)
- * Remove derive_more dependency [#1406](https://github.com/rerun-io/rerun/pull/1406)
-* Use different artifact names for wasm/js in debug builds [#1428](https://github.com/rerun-io/rerun/pull/1428)
-* Separate mac wheels & trigger wheel build from ui [#1499](https://github.com/rerun-io/rerun/pull/1499)
-* Add spell checking to CI [#1492](https://github.com/rerun-io/rerun/pull/1492)
-* Repo size
- * Always create new orphaned branch for gh-pages [#1490](https://github.com/rerun-io/rerun/pull/1490)
- * GitHub Action to prevent large files [#1478](https://github.com/rerun-io/rerun/pull/1478)
-* Python
- * Remove the python job path filters [#1452](https://github.com/rerun-io/rerun/pull/1452)
- * Use ruff for our python lints [#1378](https://github.com/rerun-io/rerun/pull/1378)
- * Use python3 in the jobs that weren't tested in PR [#1348](https://github.com/rerun-io/rerun/pull/1348)
-* Testing
- * Add a test of memory use when logging a lot of big images [#1372](https://github.com/rerun-io/rerun/pull/1372)
-* Switch ci_docker to a container based on ubuntu 20.04 [#1334](https://github.com/rerun-io/rerun/pull/1334)
-* Release handling
- * Switch release action to ncipollo [#1489](https://github.com/rerun-io/rerun/pull/1489)
- * Fix our continuous pre-releases [#1458](https://github.com/rerun-io/rerun/pull/1458)
- * Delete the prerelease before creating the new one [#1485](https://github.com/rerun-io/rerun/pull/1485)
- * Set prerelease to true even for version-tagged CI job [#1504](https://github.com/rerun-io/rerun/pull/1504)
- * Let the release job take care of creating the tag [#1501](https://github.com/rerun-io/rerun/pull/1501)
- * Use `cargo update -w` instead of `cargo check` when prepping prerelease [#1500](https://github.com/rerun-io/rerun/pull/1500)
- * Use prerelease tag instead of latest and update pointer on prerelease [#1481](https://github.com/rerun-io/rerun/pull/1481)
- * Include date in pre-release version [#1472](https://github.com/rerun-io/rerun/pull/1472)
- * Switch pre-release action to ncipollo/release-action [#1466](https://github.com/rerun-io/rerun/pull/1466)
-* Disallow some methods and types via Clippy[#1411](https://github.com/rerun-io/rerun/pull/1411)
-
-#### Other non-user-facing refactors
-* Fix: don't create a dummy LogDb when opening the Rerun Menu [#1440](https://github.com/rerun-io/rerun/pull/1440)
-* `re_renderer`
- * `Draw Phases` in preparation of executing `Renderer` several times on different targets [#1419](https://github.com/rerun-io/rerun/pull/1419)
- * Fix mesh creation failing to copy index data. [#1473](https://github.com/rerun-io/rerun/pull/1473)
- * do not silently drop draw phases [#1471](https://github.com/rerun-io/rerun/pull/1471)
- * Simplify bind group allocation call by passing pool collection object. [#1459](https://github.com/rerun-io/rerun/pull/1459)
- * Interior mutable buffer/texture/bindgroup pools [#1374](https://github.com/rerun-io/rerun/pull/1374)
- * Rename all instances of `frame_maintenance` to `begin_frame` [#1360](https://github.com/rerun-io/rerun/pull/1360)
- * Texture & buffer call now wgpu's `destroy` on removal from pool [#1359](https://github.com/rerun-io/rerun/pull/1359)
- * Arrow buffers as (optional) first-class citizen [#1482](https://github.com/rerun-io/rerun/pull/1482)
- * Log static re_renderer resource generation [#1464](https://github.com/rerun-io/rerun/pull/1464)
-* Internal log_text_entry_internal to break circular deps [#1488](https://github.com/rerun-io/rerun/pull/1488)
-* Delete ClassicTensor and cleanup [#1456](https://github.com/rerun-io/rerun/pull/1456)
-* Fix re_renderer file watcher watching the same file several times [#1463](https://github.com/rerun-io/rerun/pull/1463)
-* Analytics
- * More ergonomic API [#1410](https://github.com/rerun-io/rerun/pull/1410)
- * Streamlining host vs. recorder python/rust versions [#1380](https://github.com/rerun-io/rerun/pull/1380)
- * Fix workspace detection [#1437](https://github.com/rerun-io/rerun/pull/1437)
-* Introduce `DeserializableComponent` trait and high-level `query_latest` [#1417](https://github.com/rerun-io/rerun/pull/1417)
-
-
-[Full Changelog](https://github.com/rerun-io/rerun/compare/v0.2.0...v0.3.0)
-
-## 0.2.0
-First public release!
+Beta release of the new Depthai Viewer.
diff --git a/Cargo.lock b/Cargo.lock
index 60f09380c940..681b3ab79782 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -20,9 +20,9 @@ checksum = "330223a1aecc308757b9926e9391c9b47f8ef2dbd8aea9df88312aea18c5e8d6"
[[package]]
name = "accesskit"
-version = "0.9.0"
+version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4803cf8c252f374ae6bfbb341e49e5a37f7601f2ce74a105927a663eba952c67"
+checksum = "704d532b1cd3d912bb37499c55a81ac748cc1afa737eedd100ba441acdd47d38"
dependencies = [
"enumn",
"serde",
@@ -84,7 +84,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4165a1aef703232031b40a6e8908c2f9e314d495f11aa7f98db75d39a497cc6a"
dependencies = [
"android-properties",
- "bitflags",
+ "bitflags 1.3.2",
"cc",
"jni-sys",
"libc",
@@ -124,16 +124,16 @@ checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6"
[[package]]
name = "api_demo"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"anyhow",
"clap 4.1.4",
+ "depthai-viewer",
"glam",
"itertools",
"ndarray",
"ndarray-rand",
"rand",
- "rerun",
]
[[package]]
@@ -298,6 +298,21 @@ dependencies = [
"slab",
]
+[[package]]
+name = "async-global-executor"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
+dependencies = [
+ "async-channel",
+ "async-executor",
+ "async-io",
+ "async-lock",
+ "blocking",
+ "futures-lite",
+ "once_cell",
+]
+
[[package]]
name = "async-io"
version = "1.13.0"
@@ -339,6 +354,32 @@ dependencies = [
"syn 1.0.103",
]
+[[package]]
+name = "async-std"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d"
+dependencies = [
+ "async-channel",
+ "async-global-executor",
+ "async-io",
+ "async-lock",
+ "crossbeam-utils",
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-lite",
+ "gloo-timers",
+ "kv-log-macro",
+ "log",
+ "memchr",
+ "once_cell",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+ "wasm-bindgen-futures",
+]
+
[[package]]
name = "async-stream"
version = "0.3.3"
@@ -377,6 +418,12 @@ dependencies = [
"syn 1.0.103",
]
+[[package]]
+name = "atomic-waker"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3"
+
[[package]]
name = "atomic_refcell"
version = "0.1.8"
@@ -467,6 +514,12 @@ version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+[[package]]
+name = "bitflags"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24a6904aef64d73cf10ab17ebace7befb918b82164785cb89907993be7f83813"
+
[[package]]
name = "block"
version = "0.1.6"
@@ -501,6 +554,21 @@ dependencies = [
"objc2-encode",
]
+[[package]]
+name = "blocking"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65"
+dependencies = [
+ "async-channel",
+ "async-lock",
+ "async-task",
+ "atomic-waker",
+ "fastrand",
+ "futures-lite",
+ "log",
+]
+
[[package]]
name = "bumpalo"
version = "3.11.1"
@@ -572,12 +640,13 @@ dependencies = [
[[package]]
name = "cargo-run-wasm"
-version = "0.2.0"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "611b811fad83eebfcdcf47ae1e425c82d1249608bc571d537448d706be08cf27"
+checksum = "cc1e37cf14ef470ed74ec2a8b95e51b8623bcf6f76d24f233ebaeb209f766230"
dependencies = [
"devserver_lib",
"pico-args",
+ "serde_json",
"wasm-bindgen-cli-support",
]
@@ -676,7 +745,7 @@ version = "3.2.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"clap_lex 0.2.4",
"indexmap",
"textwrap",
@@ -688,7 +757,7 @@ version = "4.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"clap_derive",
"clap_lex 0.3.0",
"is-terminal",
@@ -751,7 +820,7 @@ version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"block",
"cocoa-foundation",
"core-foundation",
@@ -767,7 +836,7 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"block",
"core-foundation",
"core-graphics-types",
@@ -907,7 +976,7 @@ version = "0.22.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"core-foundation",
"core-graphics-types",
"foreign-types",
@@ -920,7 +989,7 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"core-foundation",
"foreign-types",
"libc",
@@ -1053,7 +1122,7 @@ version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"crossterm_winapi",
"libc",
"mio",
@@ -1088,6 +1157,16 @@ dependencies = [
"typenum",
]
+[[package]]
+name = "ctor"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
+dependencies = [
+ "quote",
+ "syn 1.0.103",
+]
+
[[package]]
name = "ctrlc"
version = "3.2.2"
@@ -1098,12 +1177,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "cty"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
-
[[package]]
name = "cxx"
version = "1.0.82"
@@ -1151,10 +1224,9 @@ dependencies = [
[[package]]
name = "d3d12"
version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da"
+source = "git+https://github.com/gfx-rs/d3d12-rs?rev=b940b1d71#b940b1d71ab7083ae80eec697872672dc1f2bd32"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"libloading",
"winapi",
]
@@ -1193,6 +1265,38 @@ dependencies = [
"syn 1.0.103",
]
+[[package]]
+name = "depthai-viewer"
+version = "0.6.0-alpha.0"
+dependencies = [
+ "anyhow",
+ "backtrace",
+ "clap 4.1.4",
+ "ctrlc",
+ "document-features",
+ "itertools",
+ "libc",
+ "mimalloc",
+ "parking_lot 0.12.1",
+ "re_analytics",
+ "re_build_build_info",
+ "re_build_info",
+ "re_data_store",
+ "re_format",
+ "re_log",
+ "re_log_encoding",
+ "re_log_types",
+ "re_memory",
+ "re_sdk",
+ "re_sdk_comms",
+ "re_smart_channel",
+ "re_viewer",
+ "re_web_viewer_server",
+ "re_ws_comms",
+ "tokio",
+ "webbrowser",
+]
+
[[package]]
name = "derivative"
version = "2.2.0"
@@ -1278,11 +1382,11 @@ dependencies = [
[[package]]
name = "dna"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
+ "depthai-viewer",
"itertools",
"rand",
- "rerun",
]
[[package]]
@@ -1309,8 +1413,7 @@ checksum = "4f94fa09c2aeea5b8839e414b7b841bf429fd25b9c522116ac97ee87856d88b2"
[[package]]
name = "ecolor"
version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f99fe3cac305af9d6d92971af60d0f7ea4d783201ef1673571567b6699964d9"
+source = "git+https://github.com/emilk/egui?rev=f76eefb98d23cbf71989255aafe75a07d343f6ed#f76eefb98d23cbf71989255aafe75a07d343f6ed"
dependencies = [
"bytemuck",
"serde",
@@ -1319,16 +1422,19 @@ dependencies = [
[[package]]
name = "eframe"
version = "0.21.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3df3ce60931e5f2d83bab4484d1a283908534d5308cc6b0c5c22c59cd15ee7cc"
+source = "git+https://github.com/emilk/egui?rev=f76eefb98d23cbf71989255aafe75a07d343f6ed#f76eefb98d23cbf71989255aafe75a07d343f6ed"
dependencies = [
"bytemuck",
+ "cocoa",
"directories-next",
"egui",
"egui-wgpu",
"egui-winit",
"egui_glow",
+ "image",
"js-sys",
+ "log",
+ "objc",
"percent-encoding",
"pollster",
"puffin",
@@ -1336,39 +1442,38 @@ dependencies = [
"ron",
"serde",
"thiserror",
- "tracing",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"wgpu",
+ "winapi",
"winit",
]
[[package]]
name = "egui"
version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6412a21e0bde7c0918f7fb44bbbb86b5e1f88e63c026a4e747cc7af02f76dfbe"
+source = "git+https://github.com/emilk/egui?rev=f76eefb98d23cbf71989255aafe75a07d343f6ed#f76eefb98d23cbf71989255aafe75a07d343f6ed"
dependencies = [
"accesskit",
"ahash 0.8.2",
"epaint",
+ "log",
"nohash-hasher",
"ron",
"serde",
- "tracing",
]
[[package]]
name = "egui-wgpu"
version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1678d8f30181193e78c15dddae16e6027c6058fdda9631950ade511b8a4b26f5"
+source = "git+https://github.com/emilk/egui?rev=f76eefb98d23cbf71989255aafe75a07d343f6ed#f76eefb98d23cbf71989255aafe75a07d343f6ed"
dependencies = [
"bytemuck",
"epaint",
+ "log",
"puffin",
- "tracing",
+ "thiserror",
"type-map",
"wgpu",
"winit",
@@ -1377,17 +1482,16 @@ dependencies = [
[[package]]
name = "egui-winit"
version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab43597ba41f0ce39a364ad83185594578bfd8b3409b99dbcbb01df23afc3dbb"
+source = "git+https://github.com/emilk/egui?rev=f76eefb98d23cbf71989255aafe75a07d343f6ed#f76eefb98d23cbf71989255aafe75a07d343f6ed"
dependencies = [
- "android-activity",
"arboard",
"egui",
"instant",
+ "log",
"puffin",
+ "raw-window-handle",
"serde",
"smithay-clipboard",
- "tracing",
"webbrowser",
"winit",
]
@@ -1405,27 +1509,25 @@ dependencies = [
[[package]]
name = "egui_extras"
version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f051342e97dfa2445107cb7d2e720617f5c840199b5cb4fe0ffcf481fcf5cce"
+source = "git+https://github.com/emilk/egui?rev=f76eefb98d23cbf71989255aafe75a07d343f6ed#f76eefb98d23cbf71989255aafe75a07d343f6ed"
dependencies = [
"egui",
+ "log",
"serde",
- "tracing",
]
[[package]]
name = "egui_glow"
version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8257332fb168a965b3dca81d6a344e053153773c889cabdba0b3b76f1629ae81"
+source = "git+https://github.com/emilk/egui?rev=f76eefb98d23cbf71989255aafe75a07d343f6ed#f76eefb98d23cbf71989255aafe75a07d343f6ed"
dependencies = [
"bytemuck",
"egui",
"egui-winit",
"glow",
+ "log",
"memoffset 0.6.5",
"puffin",
- "tracing",
"wasm-bindgen",
"web-sys",
]
@@ -1452,8 +1554,7 @@ checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
[[package]]
name = "emath"
version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8ecd80612937e0267909d5351770fe150004e24dab93954f69ca62eecd3f77e"
+source = "git+https://github.com/emilk/egui?rev=f76eefb98d23cbf71989255aafe75a07d343f6ed#f76eefb98d23cbf71989255aafe75a07d343f6ed"
dependencies = [
"bytemuck",
"serde",
@@ -1534,8 +1635,7 @@ dependencies = [
[[package]]
name = "epaint"
version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12e78b5c58a1f7f621f9d546add2adce20636422c9b251e29f749e8a2f713c95"
+source = "git+https://github.com/emilk/egui?rev=f76eefb98d23cbf71989255aafe75a07d343f6ed#f76eefb98d23cbf71989255aafe75a07d343f6ed"
dependencies = [
"ab_glyph",
"ahash 0.8.2",
@@ -1543,6 +1643,7 @@ dependencies = [
"bytemuck",
"ecolor",
"emath",
+ "log",
"nohash-hasher",
"parking_lot 0.12.1",
"serde",
@@ -1834,15 +1935,6 @@ dependencies = [
"slab",
]
-[[package]]
-name = "fxhash"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
-dependencies = [
- "byteorder",
-]
-
[[package]]
name = "generic-array"
version = "0.14.6"
@@ -1899,11 +1991,23 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+[[package]]
+name = "gloo-timers"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "js-sys",
+ "wasm-bindgen",
+]
+
[[package]]
name = "glow"
-version = "0.12.0"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8edf6019dff2d92ad27c1e3ff82ad50a0aea5b01370353cc928bfdc33e95925c"
+checksum = "4e007a07a24de5ecae94160f141029e9a347282cfe25d1d58d85d845cf3130f1"
dependencies = [
"js-sys",
"slotmap",
@@ -1955,7 +2059,7 @@ version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"gpu-alloc-types",
]
@@ -1965,7 +2069,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
]
[[package]]
@@ -1987,7 +2091,7 @@ version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"gpu-descriptor-types",
"hashbrown 0.12.3",
]
@@ -1998,7 +2102,7 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
]
[[package]]
@@ -2064,11 +2168,11 @@ dependencies = [
[[package]]
name = "hassle-rs"
-version = "0.9.0"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90601c6189668c7345fc53842cb3f3a3d872203d523be1b3cb44a36a3e62fb85"
+checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"com-rs",
"libc",
"libloading",
@@ -2282,7 +2386,7 @@ version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"inotify-sys",
"libc",
]
@@ -2429,10 +2533,19 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"libc",
]
+[[package]]
+name = "kv-log-macro"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
+dependencies = [
+ "log",
+]
+
[[package]]
name = "lazy_static"
version = "1.4.0"
@@ -2591,6 +2704,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
+ "value-bag",
]
[[package]]
@@ -2689,7 +2803,7 @@ version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"block",
"core-graphics-types",
"foreign-types",
@@ -2708,9 +2822,9 @@ dependencies = [
[[package]]
name = "minimal"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
- "rerun",
+ "depthai-viewer",
]
[[package]]
@@ -2721,12 +2835,12 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "minimal_options"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"anyhow",
"clap 4.1.4",
+ "depthai-viewer",
"glam",
- "rerun",
]
[[package]]
@@ -2784,12 +2898,11 @@ dependencies = [
[[package]]
name = "naga"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5eafe22a23b797c9bc227c6c896419b26b5bb88fa903417a3adaed08778850d5"
+version = "0.12.0"
+source = "git+https://github.com/gfx-rs/naga?rev=b99d58ea435090e561377949f428bce2c18451bb#b99d58ea435090e561377949f428bce2c18451bb"
dependencies = [
"bit-set",
- "bitflags",
+ "bitflags 1.3.2",
"codespan-reporting",
"hexf-parse",
"indexmap",
@@ -2832,7 +2945,7 @@ version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"jni-sys",
"ndk-sys",
"num_enum",
@@ -2855,13 +2968,19 @@ dependencies = [
"jni-sys",
]
+[[package]]
+name = "never"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91"
+
[[package]]
name = "nix"
version = "0.23.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"cc",
"cfg-if",
"libc",
@@ -2874,7 +2993,7 @@ version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"cfg-if",
"libc",
"memoffset 0.6.5",
@@ -2902,7 +3021,7 @@ version = "5.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed2c66da08abae1c024c01d635253e402341b4060a12e99b31c7594063bf490a"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"crossbeam-channel",
"filetime",
"fsevent-sys",
@@ -3134,14 +3253,14 @@ dependencies = [
[[package]]
name = "objectron"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"anyhow",
"clap 4.1.4",
+ "depthai-viewer",
"glam",
"prost",
"prost-build",
- "rerun",
]
[[package]]
@@ -3354,7 +3473,7 @@ version = "0.17.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f0e7f4c94ec26ff209cee506314212639d6c91b80afb82984819fafce9df01c"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"crc32fast",
"flate2",
"miniz_oxide",
@@ -3381,7 +3500,7 @@ dependencies = [
"ahash 0.8.2",
"anyhow",
"arrow2",
- "bitflags",
+ "bitflags 1.3.2",
"chrono",
"comfy-table 6.1.4",
"hashbrown 0.13.1",
@@ -3621,6 +3740,31 @@ dependencies = [
"unindent",
]
+[[package]]
+name = "pyo3-asyncio"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3564762e37035cfc486228e10b0528460fa026d681b5763873c693aa0d5c260"
+dependencies = [
+ "futures",
+ "once_cell",
+ "pin-project-lite",
+ "pyo3",
+ "pyo3-asyncio-macros",
+ "tokio",
+]
+
+[[package]]
+name = "pyo3-asyncio-macros"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be72d4cd43a27530306bd0d20d3932182fbdd072c6b98d3638bc37efb9d559dd"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.103",
+]
+
[[package]]
name = "pyo3-build-config"
version = "0.18.0"
@@ -3721,23 +3865,20 @@ checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6"
[[package]]
name = "raw-window-handle"
-version = "0.5.0"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a"
-dependencies = [
- "cty",
-]
+checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
[[package]]
name = "raw_mesh"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"anyhow",
"bytes",
"clap 4.1.4",
+ "depthai-viewer",
"gltf",
"mimalloc",
- "rerun",
]
[[package]]
@@ -3770,7 +3911,7 @@ dependencies = [
[[package]]
name = "re_analytics"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"anyhow",
"crossbeam",
@@ -3791,7 +3932,7 @@ dependencies = [
[[package]]
name = "re_arrow_store"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"ahash 0.8.2",
"anyhow",
@@ -3818,7 +3959,7 @@ dependencies = [
[[package]]
name = "re_build_build_info"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"anyhow",
"time 0.3.20",
@@ -3826,18 +3967,18 @@ dependencies = [
[[package]]
name = "re_build_info"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
[[package]]
name = "re_build_web_viewer"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"cargo_metadata",
]
[[package]]
name = "re_data_store"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"ahash 0.8.2",
"criterion",
@@ -3860,14 +4001,14 @@ dependencies = [
[[package]]
name = "re_error"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"anyhow",
]
[[package]]
name = "re_format"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"arrow2",
"arrow2_convert",
@@ -3877,7 +4018,7 @@ dependencies = [
[[package]]
name = "re_int_histogram"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"criterion",
"insta",
@@ -3888,7 +4029,7 @@ dependencies = [
[[package]]
name = "re_log"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"env_logger",
"js-sys",
@@ -3901,7 +4042,7 @@ dependencies = [
[[package]]
name = "re_log_encoding"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"criterion",
"ehttp",
@@ -3926,7 +4067,7 @@ dependencies = [
[[package]]
name = "re_log_types"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"ahash 0.8.2",
"array-init",
@@ -3964,7 +4105,7 @@ dependencies = [
[[package]]
name = "re_memory"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"ahash 0.8.2",
"backtrace",
@@ -3984,7 +4125,7 @@ dependencies = [
[[package]]
name = "re_query"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"arrow2",
"criterion",
@@ -4002,13 +4143,13 @@ dependencies = [
[[package]]
name = "re_renderer"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"ahash 0.8.2",
"anyhow",
"arrow2",
"async-executor",
- "bitflags",
+ "bitflags 1.3.2",
"bytemuck",
"clean-path",
"console_error_panic_hook",
@@ -4026,6 +4167,7 @@ dependencies = [
"itertools",
"log",
"macaw",
+ "never",
"notify",
"ordered-float",
"parking_lot 0.12.1",
@@ -4048,14 +4190,13 @@ dependencies = [
"web-sys",
"wgpu",
"wgpu-core",
- "wgpu-hal",
"winit",
"zip",
]
[[package]]
name = "re_sdk"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"arrow2_convert",
"document-features",
@@ -4075,7 +4216,7 @@ dependencies = [
[[package]]
name = "re_sdk_comms"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"ahash 0.8.2",
"anyhow",
@@ -4091,7 +4232,7 @@ dependencies = [
[[package]]
name = "re_smart_channel"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"crossbeam",
"instant",
@@ -4099,7 +4240,7 @@ dependencies = [
[[package]]
name = "re_string_interner"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"ahash 0.8.2",
"nohash-hasher",
@@ -4110,7 +4251,7 @@ dependencies = [
[[package]]
name = "re_tensor_ops"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"ahash 0.8.2",
"ndarray",
@@ -4120,7 +4261,7 @@ dependencies = [
[[package]]
name = "re_tuid"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"arrow2",
"arrow2_convert",
@@ -4134,7 +4275,7 @@ dependencies = [
[[package]]
name = "re_ui"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"eframe",
"egui",
@@ -4152,20 +4293,23 @@ dependencies = [
[[package]]
name = "re_viewer"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"ahash 0.8.2",
"anyhow",
"arboard",
+ "async-std",
"bytemuck",
"cocoa",
"console_error_panic_hook",
+ "crossbeam-channel",
"eframe",
"egui",
"egui-wgpu",
"egui_dock",
"egui_extras",
"enumset",
+ "ewebsock",
"glam",
"half 2.2.1",
"image",
@@ -4179,6 +4323,8 @@ dependencies = [
"poll-promise",
"puffin",
"puffin_http",
+ "pyo3",
+ "pyo3-asyncio",
"re_analytics",
"re_arrow_store",
"re_build_build_info",
@@ -4198,10 +4344,15 @@ dependencies = [
"re_ws_comms",
"rfd",
"serde",
+ "serde_json",
"slotmap",
"smallvec",
+ "strum 0.24.1",
+ "strum_macros 0.24.3",
"thiserror",
"time 0.3.20",
+ "tokio",
+ "url",
"uuid",
"vec1",
"wasm-bindgen-futures",
@@ -4212,7 +4363,7 @@ dependencies = [
[[package]]
name = "re_web_viewer_server"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"cargo_metadata",
"ctrlc",
@@ -4229,7 +4380,7 @@ dependencies = [
[[package]]
name = "re_ws_comms"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"anyhow",
"bincode",
@@ -4253,7 +4404,7 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
]
[[package]]
@@ -4262,7 +4413,7 @@ version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb02a9aee8e8c7ad8d86890f1e16b49e0bbbffc9961ff3788c31d57c98bcbf03"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
]
[[package]]
@@ -4295,47 +4446,16 @@ checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
[[package]]
name = "renderdoc-sys"
-version = "0.7.1"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157"
-
-[[package]]
-name = "rerun"
-version = "0.4.0"
-dependencies = [
- "anyhow",
- "backtrace",
- "clap 4.1.4",
- "ctrlc",
- "document-features",
- "itertools",
- "libc",
- "mimalloc",
- "parking_lot 0.12.1",
- "re_analytics",
- "re_build_build_info",
- "re_build_info",
- "re_data_store",
- "re_format",
- "re_log",
- "re_log_encoding",
- "re_log_types",
- "re_memory",
- "re_sdk",
- "re_sdk_comms",
- "re_smart_channel",
- "re_viewer",
- "re_web_viewer_server",
- "re_ws_comms",
- "tokio",
- "webbrowser",
-]
+checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b"
[[package]]
name = "rerun_py"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"arrow2",
+ "depthai-viewer",
"document-features",
"glam",
"image",
@@ -4356,7 +4476,6 @@ dependencies = [
"re_memory",
"re_web_viewer_server",
"re_ws_comms",
- "rerun",
"thiserror",
"tokio",
"uuid",
@@ -4431,13 +4550,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff"
dependencies = [
"base64 0.13.1",
- "bitflags",
+ "bitflags 1.3.2",
"serde",
]
[[package]]
name = "run_wasm"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
"cargo-run-wasm",
"pico-args",
@@ -4471,7 +4590,7 @@ version = "0.36.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"errno 0.2.8",
"io-lifetimes",
"libc",
@@ -4485,7 +4604,7 @@ version = "0.37.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"errno 0.3.0",
"io-lifetimes",
"libc",
@@ -4777,7 +4896,7 @@ version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"calloop",
"dlib",
"lazy_static",
@@ -4822,7 +4941,7 @@ version = "0.2.0+1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"num-traits",
]
@@ -4991,11 +5110,11 @@ dependencies = [
[[package]]
name = "test_image_memory"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
dependencies = [
+ "depthai-viewer",
"mimalloc",
"re_format",
- "rerun",
]
[[package]]
@@ -5443,6 +5562,16 @@ dependencies = [
"wasm-bindgen",
]
+[[package]]
+name = "value-bag"
+version = "1.0.0-alpha.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55"
+dependencies = [
+ "ctor",
+ "version_check",
+]
+
[[package]]
name = "vec1"
version = "1.10.1"
@@ -5712,7 +5841,7 @@ version = "0.29.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"downcast-rs",
"libc",
"nix 0.24.2",
@@ -5751,7 +5880,7 @@ version = "0.29.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"wayland-client",
"wayland-commons",
"wayland-scanner",
@@ -5842,9 +5971,8 @@ dependencies = [
[[package]]
name = "wgpu"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d745a1b6d91d85c33defbb29f0eee0450e1d2614d987e14bf6baf26009d132d7"
+version = "0.16.0"
+source = "git+https://github.com/rerun-io/wgpu?rev=de497aeda152a3515bac5eb4bf1b17f1757b9dac#de497aeda152a3515bac5eb4bf1b17f1757b9dac"
dependencies = [
"arrayvec",
"cfg-if",
@@ -5866,20 +5994,19 @@ dependencies = [
[[package]]
name = "wgpu-core"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7131408d940e335792645a98f03639573b0480e9e2e7cddbbab74f7c6d9f3fff"
+version = "0.16.0"
+source = "git+https://github.com/rerun-io/wgpu?rev=de497aeda152a3515bac5eb4bf1b17f1757b9dac#de497aeda152a3515bac5eb4bf1b17f1757b9dac"
dependencies = [
"arrayvec",
"bit-vec",
- "bitflags",
+ "bitflags 2.2.1",
"codespan-reporting",
- "fxhash",
"log",
"naga",
"parking_lot 0.12.1",
"profiling",
"raw-window-handle",
+ "rustc-hash",
"smallvec",
"thiserror",
"web-sys",
@@ -5889,20 +6016,18 @@ dependencies = [
[[package]]
name = "wgpu-hal"
-version = "0.15.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdcf61a283adc744bb5453dd88ea91f3f86d5ca6b027661c6c73c7734ae0288b"
+version = "0.16.0"
+source = "git+https://github.com/rerun-io/wgpu?rev=de497aeda152a3515bac5eb4bf1b17f1757b9dac#de497aeda152a3515bac5eb4bf1b17f1757b9dac"
dependencies = [
"android_system_properties",
"arrayvec",
"ash",
"bit-set",
- "bitflags",
+ "bitflags 2.2.1",
"block",
"core-graphics-types",
"d3d12",
"foreign-types",
- "fxhash",
"glow",
"gpu-alloc",
"gpu-allocator",
@@ -5921,6 +6046,7 @@ dependencies = [
"range-alloc",
"raw-window-handle",
"renderdoc-sys",
+ "rustc-hash",
"smallvec",
"thiserror",
"wasm-bindgen",
@@ -5931,11 +6057,10 @@ dependencies = [
[[package]]
name = "wgpu-types"
-version = "0.15.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32444e121b0bd00cb02c0de32fde457a9491bd44e03e7a5db6df9b1da2f6f110"
+version = "0.16.0"
+source = "git+https://github.com/rerun-io/wgpu?rev=de497aeda152a3515bac5eb4bf1b17f1757b9dac#de497aeda152a3515bac5eb4bf1b17f1757b9dac"
dependencies = [
- "bitflags",
+ "bitflags 2.2.1",
"js-sys",
"web-sys",
]
@@ -5953,9 +6078,9 @@ dependencies = [
[[package]]
name = "widestring"
-version = "0.5.1"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983"
+checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8"
[[package]]
name = "winapi"
@@ -6094,7 +6219,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c4755d4ba0e3d30fc7beef2095e246b1e6a6fad0717608bcb87a2df4b003bcf"
dependencies = [
"android-activity",
- "bitflags",
+ "bitflags 1.3.2",
"cfg_aliases",
"core-foundation",
"core-graphics",
diff --git a/Cargo.toml b/Cargo.toml
index 6a433c6954ee..bd3b9f138eec 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,39 +16,39 @@ include = ["../../LICENSE-APACHE", "../../LICENSE-MIT", "**/*.rs", "Cargo.toml"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rerun-io/rerun"
rust-version = "1.67"
-version = "0.4.0"
+version = "0.6.0-alpha.0"
[workspace.dependencies]
# When using alpha-release, always use exact version, e.g. `version = "=0.x.y-alpha.z"
# This is because we treat alpha-releases as incompatible, but semver doesn't.
# In particular: if we compile rerun 0.3.0-alpha.0 we only want it to use
# re_log_types 0.3.0-alpha.0, NOT 0.3.0-alpha.4 even though it is newer and semver-compatible.
-re_analytics = { path = "crates/re_analytics", version = "0.4.0" }
-re_arrow_store = { path = "crates/re_arrow_store", version = "0.4.0" }
-re_build_build_info = { path = "crates/re_build_build_info", version = "0.4.0" }
-re_build_info = { path = "crates/re_build_info", version = "0.4.0" }
-re_build_web_viewer = { path = "crates/re_build_web_viewer", version = "0.4.0" }
-re_data_store = { path = "crates/re_data_store", version = "0.4.0" }
-re_error = { path = "crates/re_error", version = "0.4.0" }
-re_format = { path = "crates/re_format", version = "0.4.0" }
-re_int_histogram = { path = "crates/re_int_histogram", version = "0.4.0" }
-re_log = { path = "crates/re_log", version = "0.4.0" }
-re_log_encoding = { path = "crates/re_log_encoding", version = "0.4.0" }
-re_log_types = { path = "crates/re_log_types", version = "0.4.0" }
-re_memory = { path = "crates/re_memory", version = "0.4.0" }
-re_query = { path = "crates/re_query", version = "0.4.0" }
-re_renderer = { path = "crates/re_renderer", version = "0.4.0" }
-re_sdk = { path = "crates/re_sdk", version = "0.4.0" }
-re_sdk_comms = { path = "crates/re_sdk_comms", version = "0.4.0" }
-re_smart_channel = { path = "crates/re_smart_channel", version = "0.4.0" }
-re_string_interner = { path = "crates/re_string_interner", version = "0.4.0" }
-re_tensor_ops = { path = "crates/re_tensor_ops", version = "0.4.0" }
-re_tuid = { path = "crates/re_tuid", version = "0.4.0" }
-re_ui = { path = "crates/re_ui", version = "0.4.0" }
-re_viewer = { path = "crates/re_viewer", version = "0.4.0" }
-re_web_viewer_server = { path = "crates/re_web_viewer_server", version = "0.4.0" }
-re_ws_comms = { path = "crates/re_ws_comms", version = "0.4.0" }
-rerun = { path = "crates/rerun", version = "0.4.0" }
+re_sdk_comms = { path = "crates/re_sdk_comms", version = "=0.6.0-alpha.0" }
+re_analytics = { path = "crates/re_analytics", version = "=0.6.0-alpha.0" }
+re_arrow_store = { path = "crates/re_arrow_store", version = "=0.6.0-alpha.0" }
+re_build_build_info = { path = "crates/re_build_build_info", version = "=0.6.0-alpha.0" }
+re_build_info = { path = "crates/re_build_info", version = "=0.6.0-alpha.0" }
+re_build_web_viewer = { path = "crates/re_build_web_viewer", version = "=0.6.0-alpha.0" }
+re_data_store = { path = "crates/re_data_store", version = "=0.6.0-alpha.0" }
+re_error = { path = "crates/re_error", version = "=0.6.0-alpha.0" }
+re_format = { path = "crates/re_format", version = "=0.6.0-alpha.0" }
+re_int_histogram = { path = "crates/re_int_histogram", version = "=0.6.0-alpha.0" }
+re_log = { path = "crates/re_log", version = "=0.6.0-alpha.0" }
+re_log_encoding = { path = "crates/re_log_encoding", version = "=0.6.0-alpha.0" }
+re_log_types = { path = "crates/re_log_types", version = "=0.6.0-alpha.0" }
+re_memory = { path = "crates/re_memory", version = "=0.6.0-alpha.0" }
+re_query = { path = "crates/re_query", version = "=0.6.0-alpha.0" }
+re_renderer = { path = "crates/re_renderer", version = "=0.6.0-alpha.0", default-features = false }
+re_sdk = { path = "crates/re_sdk", version = "=0.6.0-alpha.0" }
+re_smart_channel = { path = "crates/re_smart_channel", version = "=0.6.0-alpha.0" }
+re_string_interner = { path = "crates/re_string_interner", version = "=0.6.0-alpha.0" }
+re_tensor_ops = { path = "crates/re_tensor_ops", version = "=0.6.0-alpha.0" }
+re_tuid = { path = "crates/re_tuid", version = "=0.6.0-alpha.0" }
+re_ui = { path = "crates/re_ui", version = "=0.6.0-alpha.0" }
+re_viewer = { path = "crates/re_viewer", version = "=0.6.0-alpha.0", default-features = false }
+re_web_viewer_server = { path = "crates/re_web_viewer_server", version = "=0.6.0-alpha.0" }
+re_ws_comms = { path = "crates/re_ws_comms", version = "=0.6.0-alpha.0" }
+depthai-viewer = { path = "crates/rerun", version = "=0.6.0-alpha.0" }
ahash = "0.8"
anyhow = "1.0"
@@ -59,10 +59,10 @@ comfy-table = { version = "6.1", default-features = false }
ctrlc = { version = "3.0", features = ["termination"] }
ecolor = "0.21.0"
eframe = { version = "0.21.3", default-features = false }
-egui = "0.21.0"
+egui = { version = "0.21.0", features = ["extra_debug_asserts", "log"] }
egui-wgpu = "0.21.0"
egui_dock = "0.4"
-egui_extras = "0.21.0"
+egui_extras = { version = "0.21.0", features = ["log"] }
emath = "0.21.0"
enumset = "1.0.12"
epaint = "0.21.0"
@@ -85,9 +85,8 @@ thiserror = "1.0"
time = { version = "0.3", features = ["wasm-bindgen"] }
tinyvec = { version = "1.6", features = ["alloc", "rustc_1_55"] }
tokio = "1.24"
-wgpu = { version = "0.15.1", default-features = false }
-wgpu-core = { version = "0.15.1", default-features = false }
-wgpu-hal = { version = "0.15.4", default-features = false }
+wgpu = { version = "0.16" }
+wgpu-core = { version = "0.16" }
[profile.dev]
@@ -112,3 +111,17 @@ debug = true
# If that is not possible, patch to a branch that has a PR open on the upstream repo.
# As a last resport, patch with a commit to our own repository.
# ALWAYS document what PR the commit hash is part of, or when it was merged into the upstream trunk.
+
+# TODO(andreas/emilk): Update to a stable egui version
+# wgpu 0.16 support, device configuration dependent on adapter
+ecolor = { git = "https://github.com/emilk/egui", rev = "f76eefb98d23cbf71989255aafe75a07d343f6ed" }
+eframe = { git = "https://github.com/emilk/egui", rev = "f76eefb98d23cbf71989255aafe75a07d343f6ed" }
+egui = { git = "https://github.com/emilk/egui", rev = "f76eefb98d23cbf71989255aafe75a07d343f6ed" }
+egui-wgpu = { git = "https://github.com/emilk/egui", rev = "f76eefb98d23cbf71989255aafe75a07d343f6ed" }
+egui_extras = { git = "https://github.com/emilk/egui", rev = "f76eefb98d23cbf71989255aafe75a07d343f6ed" }
+emath = { git = "https://github.com/emilk/egui", rev = "f76eefb98d23cbf71989255aafe75a07d343f6ed" }
+
+# TODO(andreas): Either work around this issue in wgpu-egui (never discard command buffers) or wait for wgpu patch release.
+# Fix for command buffer dropping crash https://github.com/gfx-rs/wgpu/pull/3726
+wgpu = { git = "https://github.com/rerun-io/wgpu", rev = "de497aeda152a3515bac5eb4bf1b17f1757b9dac" }
+wgpu-core = { git = "https://github.com/rerun-io/wgpu", rev = "de497aeda152a3515bac5eb4bf1b17f1757b9dac" }
diff --git a/README.md b/README.md
index bae9d9f0f30c..69788eb69ebd 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
-
+
@@ -19,11 +19,11 @@ Use one of our logging APIs (Python or Rust) to log rich data, such as images an
```py
import rerun as rr
-rr.init("my_app", spawn = True) # Spawn a Rerun Viewer and stream log events to it
+viewer.init("my_app", spawn = True) # Spawn a Rerun Viewer and stream log events to it
-rr.log_image("rgb_image", image)
-rr.log_points("points", positions)
-rr.log_rect("car", bbox)
+viewer.log_image("rgb_image", image)
+viewer.log_points("points", positions)
+viewer.log_rect("car", bbox)
…
```
@@ -32,57 +32,59 @@ rr.log_rect("car", bbox)
## Getting started
-* **Python**: `pip install rerun-sdk`
-* **Rust**: `cargo add rerun`
-* **C / C++**: Coming soon
+
+- **Python**: `pip install depthai-viewer`
+- **Rust**: `cargo add rerun`
+- **C / C++**: Coming soon
### Rerun Viewer binary
+
Both the Python and Rust library can start the Rerun Viewer, but to stream log data over the network or load our `.rrd` data files you also need the `rerun` binary.
-It can be installed with `pip install rerun-sdk` or with `cargo install rerun`.
+It can be installed with `pip install depthai-viewer` or with `cargo install rerun`.
You should now be able to run `rerun --help` in any terminal.
-
### Documentation
+
- 📚 [High-level docs](http://rerun.io/docs)
- ⚙️ [Examples](examples)
- 🐍 [Python API docs](https://ref.rerun.io/docs/python)
- 🦀 [Rust API docs](https://docs.rs/rerun/)
- ⁉️ [Troubleshooting](https://www.rerun.io/docs/getting-started/troubleshooting)
-
## Status
+
We are in early beta.
There are many features we want to add, and the API is still evolving.
_Expect breaking changes!_
Some shortcomings:
-* Big points clouds (1M+) are slow ([#1136](https://github.com/rerun-io/rerun/issues/1136))
-* The data you want to visualize must fit in RAM.
+
+- Big points clouds (1M+) are slow ([#1136](https://github.com/rerun-io/rerun/issues/1136))
+- The data you want to visualize must fit in RAM.
- See for how to bound memory use
- We plan on having a disk-based data store some time in the future
-* The Rust library takes a long time to compile
+- The Rust library takes a long time to compile
- We have way too many big dependencies, and we are planning on improving the situation ([#1316](https://github.com/rerun-io/rerun/pull/1316))
-
## Business model
+
Rerun uses an open-core model. Everything in this repository will stay open source and free (both as in beer and as in freedom).
In the future, Rerun will offer a commercial product that builds on top of the core free project.
The Rerun open source project targets the needs of individual developers.
The commercial product targets the needs specific to teams that build and run computer vision and robotics products.
-
# Development
-* [`ARCHITECTURE.md`](ARCHITECTURE.md)
-* [`BUILD.md`](BUILD.md)
-* [`rerun_py/README.md`](rerun_py/README.md) - build instructions for Python SDK
-* [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
-* [`CODE_STYLE.md`](CODE_STYLE.md)
-* [`CONTRIBUTING.md`](CONTRIBUTING.md)
-* [`RELEASES.md`](RELEASES.md)
+- [`ARCHITECTURE.md`](ARCHITECTURE.md)
+- [`BUILD.md`](BUILD.md)
+- [`rerun_py/README.md`](rerun_py/README.md) - build instructions for Python SDK
+- [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
+- [`CODE_STYLE.md`](CODE_STYLE.md)
+- [`CONTRIBUTING.md`](CONTRIBUTING.md)
+- [`RELEASES.md`](RELEASES.md)
## Installing a pre-release Python SDK
diff --git a/RELEASES.md b/RELEASES.md
index 6ab1bded58fd..c83448189c04 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -1,24 +1,26 @@
# Releases and versioning
-This document describes the current release and versioning strategy. This strategy is likely to change as Rerun matures.
+This document describes the current release and versioning strategy. This strategy is likely to change as Rerun matures.
## See also
-* [`ARCHITECTURE.md`](ARCHITECTURE.md)
-* [`BUILD.md`](BUILD.md)
-* [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
-* [`CODE_STYLE.md`](CODE_STYLE.md)
-* [`CONTRIBUTING.md`](CONTRIBUTING.md)
+- [`ARCHITECTURE.md`](ARCHITECTURE.md)
+- [`BUILD.md`](BUILD.md)
+- [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
+- [`CODE_STYLE.md`](CODE_STYLE.md)
+- [`CONTRIBUTING.md`](CONTRIBUTING.md)
## Release Cadence
-New Rerun versions are released every two weeks. Sometimes we do out-of-schedule patch releases.
+New Rerun versions are released every two weeks. Sometimes we do out-of-schedule patch releases.
## Library versioning and release cadence
+
Each release include new versions of:
-* The Python SDK
-* The Rust SDK
-* All rust crates
+
+- The Python SDK
+- The Rust SDK
+- All rust crates
We use semantic versioning. All versions are increased in lockstep, with a minor version bump each time (`0.1.0`, `0.2.0`, `0.3.0`, …).
@@ -28,121 +30,127 @@ In rare cases we will do patch releases, e.g. `0.3.1`, when there is a critical
We sometimes do pre-releases. Then we use the versioning `0.2.0-alpha.0` etc.
-
## Data and communication versioning
+
We have not yet committed to any backwards or forwards compatibility.
We tag all data files (`.rrd` files) and communication protocols with the rerun version number. If there is a version mismatch, a warning is logged, but an attempt is still made to load the older or newer data.
-
## Releases
+
Release builds of the Python Wheels are triggered by pushing a release tag to GitHub in the form `v0.2.0`.
If we are doing a patch release, we do a branch off of the latest release tag (e.g. `v0.3.0`) and cherry-pick any fixes we want into that branch.
### Release checklist
+
Go through this checklist from top to bottom, and check each item before moving onto the next.
This is a living document. Strive to improve it on each new release.
-* [ ] Create a release branch called `release-0.x.y`
-* [ ] If it is a patch release branch off `latest` and cherry-pick the commits that should be included
-* [ ] Update `CHANGELOG.md` with the new version number with:
- * [ ] A one-line summary of the release
- * [ ] A multi-line summary of the release
- * [ ] A gif showing a major new feature
- * [ ] Run `pip install GitPython && scripts/generate_changelog.py`
- * [ ] Edit PR descriptions/labels to improve the generated changelog
- * [ ] Copy-paste the results into `CHANGELOG.md`.
- * [ ] Editorialize the changelog if necessary
- * [ ] Make sure the changelog includes instructions for handling any breaking changes
- * [ ] Commit and push the changelog
-* [ ] Create a draft PR containing:
- * [ ] One-line summary of the release
- * [ ] A multi-line summary of the release
- * [ ] A gif showing a major new feature
-* [ ] Test the branch ([see below](#testing-a-release))
-* [ ] Open the PR up for review with the `⛴ release` label
-* [ ] Bump version number in root `Cargo.toml`.
-* [ ] Check that CI is green
-* [ ] Publish the crates (see below)
-* [ ] `git tag -a v0.x.y -m 'Release 0.x.y - summary'`
- * `git push --tags`
- * This will trigger a PyPI release when pushed
-* [ ] `git pull --tags && git tag -d latest && git tag -a latest -m 'Latest release' && git push --tags origin latest --force`
-* [ ] Manually trigger a new web viewer build and upload at https://github.com/rerun-io/rerun/actions/workflows/rust.yml
-* [ ] Wait for CI to build release artifacts and publish them on GitHub and PyPI.
-* [ ] Merge PR
-* [ ] Edit the GitHub release at https://github.com/rerun-io/rerun/releases/edit/v0.x.0
- * [ ] Mark it as as the latest release
- * [ ] Paste in the `CHANGELOG.md`
-* [ ] Wait for wheel to appear on https://pypi.org/project/rerun-sdk/
-* [ ] Test the released Python and Rust libraries (see below)
-* [ ] Wait for documentation to build: https://docs.rs/releases/queue
-* [ ] Point to the latest release via instructions in .
-* [ ] Post on:
- * [ ] Community Discord
- * [ ] Rerun Twitter
- * [ ] Reddit?
-
+- [ ] Create a release branch called `release-0.x.y`
+- [ ] If it is a patch release branch off `latest` and cherry-pick the commits that should be included
+- [ ] Update `CHANGELOG.md` with the new version number with:
+ - [ ] A one-line summary of the release
+ - [ ] A multi-line summary of the release
+ - [ ] A gif showing a major new feature
+ - [ ] Run `pip install GitPython && scripts/generate_changelog.py`
+ - [ ] Edit PR descriptions/labels to improve the generated changelog
+ - [ ] Copy-paste the results into `CHANGELOG.md`.
+ - [ ] Editorialize the changelog if necessary
+ - [ ] Make sure the changelog includes instructions for handling any breaking changes
+ - [ ] Commit and push the changelog
+- [ ] Create a draft PR containing:
+ - [ ] One-line summary of the release
+ - [ ] A multi-line summary of the release
+ - [ ] A gif showing a major new feature
+- [ ] Test the branch ([see below](#testing-a-release))
+- [ ] Open the PR up for review with the `⛴ release` label
+- [ ] Bump version number in root `Cargo.toml`.
+- [ ] Check that CI is green
+- [ ] Publish the crates (see below)
+- [ ] `git tag -a v0.x.y -m 'Release 0.x.y - summary'`
+ - `git push --tags`
+ - This will trigger a PyPI release when pushed
+- [ ] `git pull --tags && git tag -d latest && git tag -a latest -m 'Latest release' && git push --tags origin latest --force`
+- [ ] Manually trigger a new web viewer build and upload at https://github.com/rerun-io/rerun/actions/workflows/rust.yml
+- [ ] Wait for CI to build release artifacts and publish them on GitHub and PyPI.
+- [ ] Merge PR
+- [ ] Edit the GitHub release at https://github.com/rerun-io/rerun/releases/edit/v0.x.0
+ - [ ] Mark it as as the latest release
+ - [ ] Paste in the `CHANGELOG.md`
+- [ ] Wait for wheel to appear on https://pypi.org/project/depthai-viewer/
+- [ ] Test the released Python and Rust libraries (see below)
+- [ ] Wait for documentation to build: https://docs.rs/releases/queue
+- [ ] Point to the latest release via instructions in .
+- [ ] Post on:
+ - [ ] Community Discord
+ - [ ] Rerun Twitter
+ - [ ] Reddit?
### Testing a release
+
Before pushing the release tag:
- * [ ] `just py-run-all`
- * [ ] Test the web viewer:
- * [ ] `cargo run -p rerun --features web_viewer -- --web-viewer ../nyud.rrd`
- * [ ] Test on:
- * [ ] Chromium
- * [ ] Firefox
- * [ ] Mobile
+
+- [ ] `just py-run-all`
+- [ ] Test the web viewer:
+ - [ ] `cargo run -p rerun --features web_viewer -- --web-viewer ../nyud.rrd`
+ - [ ] Test on:
+ - [ ] Chromium
+ - [ ] Firefox
+ - [ ] Mobile
After tagging and the CI has published:
- * [ ] Test the Python packages from PyPI: `pip install rerun_sdk==0.x.0a1`
- * [ ] Test rust install version: `cargo install -f rerun@0.x.0-alpha.1 -F web_viewer && rerun --web-viewer api.rrd`
- * [ ] Test rust crate: Modify Cargo.toml of any example to not point to the workspace
- * [ ] run with `--serve` to test web player
+
+- [ ] Test the Python packages from PyPI: `pip install rerun_sdk==0.x.0a1`
+- [ ] Test rust install version: `cargo install -f rerun@0.x.0-alpha.1 -F web_viewer && rerun --web-viewer api.rrd`
+- [ ] Test rust crate: Modify Cargo.toml of any example to not point to the workspace
+ - [ ] run with `--serve` to test web player
Checklist for testing alpha releases:
-* Windows
- * [ ] Python Wheel
- * [ ] Web
- * [ ] Native
- * [ ] Rust crate
- * [ ] Web
- * [ ] Native
- * [ ] Rust install
- * [ ] Web
- * [ ] Native
-* Linux
- * [ ] Python Wheel
- * [ ] Web
- * [ ] Native
- * [ ] Rust crate
- * [ ] Web
- * [ ] Native
- * [ ] Rust install
- * [ ] Web
- * [ ] Native
-* Mac
- * [ ] Python Wheel
- * [ ] Web
- * [ ] Native
- * [ ] Rust crate
- * [ ] Web
- * [ ] Native
- * [ ] Rust install
- * [ ] Web
- * [ ] Native
+- Windows
+ - [ ] Python Wheel
+ - [ ] Web
+ - [ ] Native
+ - [ ] Rust crate
+ - [ ] Web
+ - [ ] Native
+ - [ ] Rust install
+ - [ ] Web
+ - [ ] Native
+- Linux
+ - [ ] Python Wheel
+ - [ ] Web
+ - [ ] Native
+ - [ ] Rust crate
+ - [ ] Web
+ - [ ] Native
+ - [ ] Rust install
+ - [ ] Web
+ - [ ] Native
+- Mac
+ - [ ] Python Wheel
+ - [ ] Web
+ - [ ] Native
+ - [ ] Rust crate
+ - [ ] Web
+ - [ ] Native
+ - [ ] Rust install
+ - [ ] Web
+ - [ ] Native
## Publishing
+
First login as https://crates.io/users/rerunio with and API key you get from Emil:
```bash
cargo login $API_KEY
```
------------------------------------------------------------------------------------------------
-!! IMPORTANT !! Shut off VSCode, and don't touch anything while `publish_crates.sh` is running!
-!! IMPORTANT !! Read `publish_crates.sh` for details
------------------------------------------------------------------------------------------------
+---
+
+!! IMPORTANT !! Shut off VSCode, and don't touch anything while `publish_crates.sh` is running!
+!! IMPORTANT !! Read `publish_crates.sh` for details
+
+---
./scripts/publish_crates.sh --execute
diff --git a/api.py b/api.py
new file mode 100644
index 000000000000..cdc7ee253283
--- /dev/null
+++ b/api.py
@@ -0,0 +1,50 @@
+import depthai_viewer as viewer
+import cv2
+import depthai as dai
+import queue
+
+viewer.init("Depthai Viewer")
+viewer.connect()
+
+# Create pipeline
+pipeline = dai.Pipeline()
+color = pipeline.createColorCamera()
+color.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P)
+color.setFps(60)
+
+# Create output
+xout = pipeline.createXLinkOut()
+xout.setStreamName("color")
+color.video.link(xout.input)
+
+q = queue.Queue(maxsize=4)
+
+
+def color_frame_callback(frame: dai.ImgFrame):
+ global q
+ q.put(frame.getCvFrame())
+
+
+import time
+
+# Connect to device and start pipeline
+with dai.Device(pipeline) as device:
+ q = device.getOutputQueue("color", maxSize=4, blocking=False) # .addCallback(color_frame_callback)
+ t = time.time_ns()
+ fps = 0
+ display_fps = 0
+ while True:
+ # in_color = q.get()
+ # cv2.imshow("color", in_color)
+ in_color = q.get()
+ fps += 1
+ if time.time_ns() - t > 1e9:
+ display_fps = fps
+ fps = 0
+ print("fps: ", display_fps)
+ t = time.time_ns()
+ frame = in_color.getCvFrame()
+ # cv2.putText(frame, f"fps: {display_fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
+ # cv2.imshow("color", frame)
+ viewer.log_image("color/camera/rgb/Color camera", cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
+ cv2.waitKey(1)
diff --git a/ci_docker/Dockerfile b/ci_docker/Dockerfile
index 80c2f73bf820..f3fa89019ce5 100644
--- a/ci_docker/Dockerfile
+++ b/ci_docker/Dockerfile
@@ -58,7 +58,8 @@ RUN set -eux; \
# Install some cargo tools we know we'll always need
# We can't do this until after we've installed rust / cargo above
RUN cargo install cargo-deny && \
- cargo install cargo-cranky
+ cargo install cargo-cranky && \
+ cargo install cargo-benchcmp
# Install the python build dependencies
ADD rerun_py/requirements-build.txt requirements-build.txt
diff --git a/clippy.toml b/clippy.toml
index 4da41d009fbc..bd8f68dcbf99 100644
--- a/clippy.toml
+++ b/clippy.toml
@@ -1,4 +1,4 @@
-# There is also a clippy_wasm/clippy.toml which forbids some mthods that are not available in wasm.
+# There is also a scripts/clippy_wasm/clippy.toml which forbids some methods that are not available in wasm.
msrv = "1.67"
@@ -47,7 +47,7 @@ disallowed-types = [
# Allow-list of words for markdown in dosctrings https://rust-lang.github.io/rust-clippy/master/index.html#doc_markdown
doc-valid-idents = [
- # You must also update the same list in `clippy_wasm/clippy.toml`!
+ # You must also update the same list in `scripts/clippy_wasm/clippy.toml`!
"GitHub",
"GLB",
"GLTF",
diff --git a/crates/re_analytics/src/cli.rs b/crates/re_analytics/src/cli.rs
index 7055563dcd92..4b146daa6996 100644
--- a/crates/re_analytics/src/cli.rs
+++ b/crates/re_analytics/src/cli.rs
@@ -83,7 +83,7 @@ const DETAILS: &str = "
What data is collected?
- The exact set of analytics events and parameters can be found here:
https://github.com/rerun-io/rerun/blob/GIT_HASH/crates/re_viewer/src/viewer_analytics.rs
- - We collect high level events about the usage of the Rerun Viewer. For example:
+ - We collect high level events about the usage of the Depthai Viewer. For example:
- The event 'Viewer Opened' helps us estimate how often Rerun is used.
- The event 'Data Source Connected' helps us understand if users tend to use live
data sources or recordings most, which helps us prioritize features.
diff --git a/crates/re_analytics/src/lib.rs b/crates/re_analytics/src/lib.rs
index 9938887a5f55..8f346c3ea3df 100644
--- a/crates/re_analytics/src/lib.rs
+++ b/crates/re_analytics/src/lib.rs
@@ -211,7 +211,7 @@ const DISCLAIMER: &str = "
help the Rerun team improve the library.
Summary:
- - We only collect high level events about the features used within the Rerun Viewer.
+ - We only collect high level events about the features used within the Depthai Viewer.
- The actual data you log to Rerun, such as point clouds, images, or text logs,
will never be collected.
- We don't log IP addresses.
diff --git a/crates/re_build_info/src/crate_version.rs b/crates/re_build_info/src/crate_version.rs
index 9a29e8e734a7..a4c3ee5e04bf 100644
--- a/crates/re_build_info/src/crate_version.rs
+++ b/crates/re_build_info/src/crate_version.rs
@@ -55,7 +55,7 @@ impl CrateVersion {
pub fn from_bytes([major, minor, patch, suffix_byte]: [u8; 4]) -> Self {
let is_alpha = (suffix_byte & IS_ALPHA_BIT) != 0;
let is_prerelease = (suffix_byte & IS_PRERELEASE_BIT) != 0;
- let alpha_version = suffix_byte & 0b0111_1111;
+ let alpha_version = suffix_byte & !(IS_ALPHA_BIT | IS_PRERELEASE_BIT);
Self {
major,
@@ -273,6 +273,22 @@ fn test_format_parse_roundtrip() {
}
}
+#[test]
+fn test_format_parse_roundtrip_bytes() {
+ let parse = CrateVersion::parse;
+ for version in [
+ "0.2.0",
+ "1.2.3",
+ "12.23.24",
+ "12.23.24-alpha.31",
+ "12.23.24-alpha.31+foo",
+ ] {
+ let version = parse(version);
+ let bytes = version.to_bytes();
+ assert_eq!(CrateVersion::from_bytes(bytes), version);
+ }
+}
+
#[test]
fn test_compatibility() {
fn are_compatible(a: &str, b: &str) -> bool {
diff --git a/crates/re_build_web_viewer/src/lib.rs b/crates/re_build_web_viewer/src/lib.rs
index 8ec1d53f0a88..c5f1c179f10a 100644
--- a/crates/re_build_web_viewer/src/lib.rs
+++ b/crates/re_build_web_viewer/src/lib.rs
@@ -12,7 +12,7 @@ fn target_directory() -> Utf8PathBuf {
}
/// Build `re_viewer` as Wasm, generate .js bindings for it, and place it all into the `./web_viewer` folder.
-pub fn build(release: bool) {
+pub fn build(release: bool, webgpu: bool) {
eprintln!("Building web viewer wasm…");
eprintln!("We assume you've already run ./scripts/setup_web.sh");
@@ -63,7 +63,13 @@ pub fn build(release: bool) {
"wasm32-unknown-unknown",
"--target-dir",
target_wasm_dir.as_str(),
+ "--no-default-features",
]);
+ if webgpu {
+ cmd.arg("--features=analytics");
+ } else {
+ cmd.arg("--features=analytics,webgl");
+ }
if release {
cmd.arg("--release");
}
@@ -71,6 +77,7 @@ pub fn build(release: bool) {
// This is required to enable the web_sys clipboard API which egui_web uses
// https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html
// https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html
+ // Furthermore, it's necessary for unstable WebGPU apis to work.
cmd.env("RUSTFLAGS", "--cfg=web_sys_unstable_apis");
// When executing this script from a Rust build script, do _not_, under any circumstances,
diff --git a/crates/re_build_web_viewer/src/main.rs b/crates/re_build_web_viewer/src/main.rs
index 137cd401a742..1c3d2249d26f 100644
--- a/crates/re_build_web_viewer/src/main.rs
+++ b/crates/re_build_web_viewer/src/main.rs
@@ -2,6 +2,7 @@ use std::process::ExitCode;
fn main() -> ExitCode {
let mut release = None;
+ let mut webgpu = false;
for arg in std::env::args().skip(1) {
match arg.as_str() {
@@ -17,6 +18,9 @@ fn main() -> ExitCode {
assert!(release.is_none(), "Can't set both --release and --debug");
release = Some(true);
}
+ "--webgpu" => {
+ webgpu = true;
+ }
_ => {
print_help();
return ExitCode::FAILURE;
@@ -29,7 +33,7 @@ fn main() -> ExitCode {
return ExitCode::FAILURE;
};
- re_build_web_viewer::build(release);
+ re_build_web_viewer::build(release, webgpu);
ExitCode::SUCCESS
}
@@ -41,6 +45,7 @@ fn print_help() {
--debug: Build a debug binary
--release: Compile for release, and run wasm-opt.
NOTE: --release also removes debug symbols which are otherwise useful for in-browser profiling.
+ --webgpu: Enable WebGPU support (experimental). If not set the viewer will use WebGL instead.
"
);
}
diff --git a/crates/re_data_store/src/entity_properties.rs b/crates/re_data_store/src/entity_properties.rs
index 9929ca4c13c3..96ccd7f91aed 100644
--- a/crates/re_data_store/src/entity_properties.rs
+++ b/crates/re_data_store/src/entity_properties.rs
@@ -44,9 +44,16 @@ pub struct EntityProperties {
pub visible_history: ExtraQueryHistory,
pub interactive: bool,
+ /// Enable color mapping?
+ ///
/// What kind of color mapping should be applied (none, map, texture, transfer..)?
pub color_mapper: EditableAutoValue,
+ /// Points to an entity with an albedo texture.
+ ///
+ /// Only relevant if [`Self::color_mapper`] is set to `AlbedoTexture`.
+ pub albedo_texture: Option,
+
/// Distance of the projection plane (frustum far plane).
///
/// Only applies to pinhole cameras when in a spatial view, using 3D navigation.
@@ -80,6 +87,7 @@ impl Default for EntityProperties {
backproject_depth: EditableAutoValue::Auto(true),
depth_from_world_scale: EditableAutoValue::default(),
backproject_radius_scale: EditableAutoValue::Auto(1.0),
+ albedo_texture: None,
}
}
}
@@ -94,7 +102,7 @@ impl EntityProperties {
interactive: self.interactive && child.interactive,
color_mapper: self.color_mapper.or(&child.color_mapper).clone(),
-
+ albedo_texture: self.albedo_texture.clone().or(child.albedo_texture.clone()),
pinhole_image_plane_distance: self
.pinhole_image_plane_distance
.or(&child.pinhole_image_plane_distance)
@@ -170,25 +178,28 @@ impl std::fmt::Display for Colormap {
pub enum ColorMapper {
/// Use a well-known color map, pre-implemented as a wgsl module.
Colormap(Colormap),
- // TODO(cmc): support textures.
+
+ /// Point to an entity with an albedo texture.
+ AlbedoTexture,
// TODO(cmc): support custom transfer functions.
}
+impl Default for ColorMapper {
+ #[inline]
+ fn default() -> Self {
+ Self::AlbedoTexture
+ }
+}
+
impl std::fmt::Display for ColorMapper {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
- ColorMapper::Colormap(colormap) => colormap.fmt(f),
+ ColorMapper::Colormap(colormap) => write!(f, "Map:{colormap}"),
+ ColorMapper::AlbedoTexture => write!(f, "Albedo texture"),
}
}
}
-impl Default for ColorMapper {
- #[inline]
- fn default() -> Self {
- Self::Colormap(Colormap::default())
- }
-}
-
// ----------------------------------------------------------------------------
/// Get the latest value for a given [`re_log_types::Component`].
diff --git a/crates/re_format/Cargo.toml b/crates/re_format/Cargo.toml
index 198768511bc0..b502f8f6eb4e 100644
--- a/crates/re_format/Cargo.toml
+++ b/crates/re_format/Cargo.toml
@@ -19,4 +19,4 @@ all-features = true
arrow2.workspace = true
arrow2_convert.workspace = true
comfy-table.workspace = true
-re_tuid.workspace = true
+re_tuid = { workspace = true, features = ["arrow2_convert"] }
diff --git a/crates/re_log_types/src/arrow_msg.rs b/crates/re_log_types/src/arrow_msg.rs
index 54e5c01b68e5..b83e24266d29 100644
--- a/crates/re_log_types/src/arrow_msg.rs
+++ b/crates/re_log_types/src/arrow_msg.rs
@@ -42,13 +42,13 @@ impl serde::Serialize for ArrowMsg {
let mut writer = StreamWriter::new(&mut buf, Default::default());
writer
.start(&self.schema, None)
- .map_err(|e| serde::ser::Error::custom(e.to_string()))?;
+ .map_err(|err| serde::ser::Error::custom(err.to_string()))?;
writer
.write(&self.chunk, None)
- .map_err(|e| serde::ser::Error::custom(e.to_string()))?;
+ .map_err(|err| serde::ser::Error::custom(err.to_string()))?;
writer
.finish()
- .map_err(|e| serde::ser::Error::custom(e.to_string()))?;
+ .map_err(|err| serde::ser::Error::custom(err.to_string()))?;
let mut inner = serializer.serialize_tuple(3)?;
inner.serialize_element(&self.table_id)?;
diff --git a/crates/re_log_types/src/component_types/arrow_convert_shims.rs b/crates/re_log_types/src/component_types/arrow_convert_shims.rs
index 8d196842169d..b78ff5f4c065 100644
--- a/crates/re_log_types/src/component_types/arrow_convert_shims.rs
+++ b/crates/re_log_types/src/component_types/arrow_convert_shims.rs
@@ -79,6 +79,7 @@ impl<'a> Iterator for BufferBinaryArrayIter<'a> {
/// Internal `ArrowArray` helper to iterate over a `BinaryArray` while exposing Buffer slices
pub struct BufferBinaryArray;
+#[cfg(not(target_os = "windows"))]
extern "C" {
fn do_not_call_into_iter(); // we never define this function, so the linker will fail
}
diff --git a/crates/re_log_types/src/component_types/imu.rs b/crates/re_log_types/src/component_types/imu.rs
new file mode 100644
index 000000000000..bfcdf7566eb8
--- /dev/null
+++ b/crates/re_log_types/src/component_types/imu.rs
@@ -0,0 +1,25 @@
+use crate::{Component, EntityPath};
+use arrow2_convert::{ArrowDeserialize, ArrowField, ArrowSerialize};
+
+use super::{Point3D, Quaternion};
+
+#[derive(Clone, Debug, PartialEq, ArrowField, ArrowSerialize, ArrowDeserialize)]
+pub struct ImuData {
+ pub accel: Point3D,
+ pub gyro: Point3D,
+ pub mag: Option,
+ pub orientation: Quaternion,
+}
+
+impl ImuData {
+ pub fn entity_path() -> EntityPath {
+ "imu_data".into()
+ }
+}
+
+impl Component for ImuData {
+ #[inline]
+ fn name() -> crate::ComponentName {
+ "rerun.imu".into()
+ }
+}
diff --git a/crates/re_log_types/src/component_types/mod.rs b/crates/re_log_types/src/component_types/mod.rs
index 61066b8c8f58..b1e4ddec13a6 100644
--- a/crates/re_log_types/src/component_types/mod.rs
+++ b/crates/re_log_types/src/component_types/mod.rs
@@ -23,12 +23,14 @@ mod class_id;
mod color;
pub mod context;
pub mod coordinates;
+mod imu;
mod instance_key;
mod keypoint_id;
mod label;
mod linestrip;
mod mat;
mod mesh3d;
+mod node_graph;
mod point;
mod quaternion;
mod radius;
@@ -39,6 +41,7 @@ mod tensor;
mod text_entry;
mod transform;
mod vec;
+mod xlink_stats;
pub use arrow::Arrow3D;
pub use bbox::Box3D;
@@ -46,12 +49,14 @@ pub use class_id::ClassId;
pub use color::ColorRGBA;
pub use context::{AnnotationContext, AnnotationInfo, ClassDescription};
pub use coordinates::ViewCoordinates;
+pub use imu::ImuData;
pub use instance_key::InstanceKey;
pub use keypoint_id::KeypointId;
pub use label::Label;
pub use linestrip::{LineStrip2D, LineStrip3D};
pub use mat::Mat3x3;
pub use mesh3d::{EncodedMesh3D, Mesh3D, MeshFormat, MeshId, RawMesh3D};
+pub use node_graph::NodeGraph;
pub use point::{Point2D, Point3D};
pub use quaternion::Quaternion;
pub use radius::Radius;
@@ -67,10 +72,11 @@ pub use tensor::{TensorImageLoadError, TensorImageSaveError};
pub use text_entry::TextEntry;
pub use transform::{Pinhole, Rigid3, Transform};
pub use vec::{Vec2D, Vec3D, Vec4D};
+pub use xlink_stats::XlinkStats;
lazy_static! {
//TODO(john): use a run-time type registry
- static ref FIELDS: [Field; 25] = [
+ static ref FIELDS: [Field; 28] = [
::field(),
::field(),
::field(),
@@ -96,6 +102,9 @@ lazy_static! {
::field(),
::field(),
::field(),
+ ::field(),
+ ::field(),
+ ::field(),
];
}
@@ -210,6 +219,7 @@ where
pub struct FastFixedSizeListArray(std::marker::PhantomData);
+#[cfg(not(target_os = "windows"))]
extern "C" {
fn do_not_call_into_iter(); // we never define this function, so the linker will fail
}
diff --git a/crates/re_log_types/src/component_types/node_graph.rs b/crates/re_log_types/src/component_types/node_graph.rs
new file mode 100644
index 000000000000..edf8a83270ad
--- /dev/null
+++ b/crates/re_log_types/src/component_types/node_graph.rs
@@ -0,0 +1,40 @@
+use arrow2_convert::{ArrowDeserialize, ArrowField, ArrowSerialize};
+
+use crate::Component;
+
+// ---
+
+/// A double-precision NodeGraph.
+///
+/// ## Examples
+///
+/// ```
+/// # use re_log_types::component_types::NodeGraph;
+/// # use arrow2_convert::field::ArrowField;
+/// # use arrow2::datatypes::{DataType, Field};
+/// assert_eq!(NodeGraph::data_type(), DataType::Float64);
+/// ```
+#[derive(Debug, Clone, Copy, ArrowField, ArrowSerialize, ArrowDeserialize)]
+#[arrow_field(transparent)]
+pub struct NodeGraph(pub f64);
+
+impl Component for NodeGraph {
+ #[inline]
+ fn name() -> crate::ComponentName {
+ "rerun.pipeline_graph".into()
+ }
+}
+
+impl From for NodeGraph {
+ #[inline]
+ fn from(value: f64) -> Self {
+ Self(value)
+ }
+}
+
+impl From for f64 {
+ #[inline]
+ fn from(value: NodeGraph) -> Self {
+ value.0
+ }
+}
diff --git a/crates/re_log_types/src/component_types/tensor.rs b/crates/re_log_types/src/component_types/tensor.rs
index 9c4228b845e6..cf02a3bc2b8e 100644
--- a/crates/re_log_types/src/component_types/tensor.rs
+++ b/crates/re_log_types/src/component_types/tensor.rs
@@ -857,7 +857,7 @@ impl Tensor {
/// A thin wrapper around a [`Tensor`] that is guaranteed to not be compressed (never a jpeg).
///
/// All clones are shallow, like for [`Tensor`].
-#[derive(Clone)]
+#[derive(Clone, Debug)]
pub struct DecodedTensor(Tensor);
impl DecodedTensor {
diff --git a/crates/re_log_types/src/component_types/xlink_stats.rs b/crates/re_log_types/src/component_types/xlink_stats.rs
new file mode 100644
index 000000000000..82b5f3b5522c
--- /dev/null
+++ b/crates/re_log_types/src/component_types/xlink_stats.rs
@@ -0,0 +1,28 @@
+use crate::{Component, EntityPath};
+use arrow2::array::Int128Array;
+use arrow2_convert::{field::I128, ArrowDeserialize, ArrowField, ArrowSerialize};
+
+// TODO(filip): Convert to use i128
+
+/// Stats about the XLink connection throughput
+#[derive(Clone, Debug, PartialEq, ArrowField, ArrowSerialize, ArrowDeserialize)]
+pub struct XlinkStats {
+ /// Bytes read from the XLink by the host (PC)
+ pub bytes_read: i64,
+
+ /// Bytes written to the XLink by the host (PC)
+ pub bytes_written: i64,
+}
+
+impl XlinkStats {
+ pub fn entity_path() -> EntityPath {
+ "xlink_stats".into()
+ }
+}
+
+impl Component for XlinkStats {
+ #[inline]
+ fn name() -> crate::ComponentName {
+ "rerun.xlink_stats".into()
+ }
+}
diff --git a/crates/re_log_types/src/lib.rs b/crates/re_log_types/src/lib.rs
index 7775be821e74..bc2785fd7c2e 100644
--- a/crates/re_log_types/src/lib.rs
+++ b/crates/re_log_types/src/lib.rs
@@ -42,7 +42,9 @@ pub use self::component_types::coordinates;
pub use self::component_types::AnnotationContext;
pub use self::component_types::Arrow3D;
pub use self::component_types::DecodedTensor;
-pub use self::component_types::{EncodedMesh3D, Mesh3D, MeshFormat, MeshId, RawMesh3D};
+pub use self::component_types::{
+ EncodedMesh3D, ImuData, Mesh3D, MeshFormat, MeshId, RawMesh3D, XlinkStats,
+};
pub use self::component_types::{Tensor, ViewCoordinates};
pub use self::data::*;
pub use self::data_cell::{DataCell, DataCellError, DataCellInner, DataCellResult};
diff --git a/crates/re_memory/src/memory_limit.rs b/crates/re_memory/src/memory_limit.rs
index 6d747d2be4ab..ec59cb66e48f 100644
--- a/crates/re_memory/src/memory_limit.rs
+++ b/crates/re_memory/src/memory_limit.rs
@@ -1,13 +1,22 @@
-#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct MemoryLimit {
/// Limit in bytes.
///
/// This is primarily compared to what is reported by [`crate::AccountingAllocator`] ('counted').
/// We limit based on this instead of `resident` (RSS) because `counted` is what we have immediate
/// control over, while RSS depends on what our allocator (MiMalloc) decides to do.
+ /// Default is Some(100MB)
pub limit: Option,
}
+impl Default for MemoryLimit {
+ fn default() -> Self {
+ Self {
+ limit: re_format::parse_bytes("100MB"),
+ }
+ }
+}
+
impl MemoryLimit {
pub fn parse(limit: &str) -> Result {
re_format::parse_bytes(limit)
diff --git a/crates/re_renderer/Cargo.toml b/crates/re_renderer/Cargo.toml
index 03bc85390551..c5a2fb1df2b7 100644
--- a/crates/re_renderer/Cargo.toml
+++ b/crates/re_renderer/Cargo.toml
@@ -24,7 +24,7 @@ targets = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"]
[features]
-default = ["arrow", "import-obj", "import-gltf"]
+default = ["import-obj", "import-gltf"]
## Support for Arrow datatypes for end-to-end zero-copy.
arrow = ["dep:arrow2"]
@@ -38,6 +38,8 @@ import-gltf = ["dep:gltf"]
## Enable (de)serialization using serde.
serde = ["dep:serde"]
+## Render using webgl instead of webgpu on wasm builds.
+webgl = ["wgpu/webgl"]
[dependencies]
re_error.workspace = true
@@ -55,6 +57,7 @@ glam = { workspace = true, features = ["bytemuck"] }
half = { workspace = true, features = ["bytemuck"] }
itertools = { workspace = true }
macaw.workspace = true
+never = '0.1'
ordered-float = "3.2"
parking_lot.workspace = true
slotmap = "1.0.6"
@@ -62,6 +65,7 @@ smallvec.workspace = true
static_assertions = "1.1"
thiserror.workspace = true
type-map = "0.5"
+wgpu.workspace = true
# optional
arrow2 = { workspace = true, optional = true }
@@ -74,17 +78,7 @@ tobj = { version = "3.2", optional = true }
crossbeam = "0.8"
notify = "5.0"
puffin.workspace = true
-wgpu = { workspace = true, default-features = false, features = ["wgsl"] }
wgpu-core.workspace = true
-wgpu-hal.workspace = true
-
-# wasm
-[target.'cfg(target_arch = "wasm32")'.dependencies]
-wgpu = { workspace = true, default-features = false, features = [
- "webgl",
- "wgsl",
-] }
-
# For examples:
[dev-dependencies]
@@ -109,7 +103,7 @@ console_error_panic_hook = "0.1.6"
# required to make rand work on wasm, see https://github.com/rust-random/rand#wasm-support
getrandom = { version = "0.2", features = ["js"] }
wasm-bindgen-futures = "0.4.33"
-web-sys = { version = "0.3.60", features = [
+web-sys = { version = "0.3.61", features = [
"Location",
"Blob",
"RequestInit",
diff --git a/crates/re_renderer/examples/2d.rs b/crates/re_renderer/examples/2d.rs
index 32940991c1f2..eb17d6955cfd 100644
--- a/crates/re_renderer/examples/2d.rs
+++ b/crates/re_renderer/examples/2d.rs
@@ -36,16 +36,19 @@ impl framework::Example for Render2D {
);
}
- let rerun_logo_texture = re_ctx.texture_manager_2d.create(
- &mut re_ctx.gpu_resources.textures,
- &Texture2DCreationDesc {
- label: "rerun logo".into(),
- data: image_data.into(),
- format: wgpu::TextureFormat::Rgba8UnormSrgb,
- width: rerun_logo.width(),
- height: rerun_logo.height(),
- },
- );
+ let rerun_logo_texture = re_ctx
+ .texture_manager_2d
+ .create(
+ &mut re_ctx.gpu_resources.textures,
+ &Texture2DCreationDesc {
+ label: "rerun logo".into(),
+ data: image_data.into(),
+ format: wgpu::TextureFormat::Rgba8UnormSrgb,
+ width: rerun_logo.width(),
+ height: rerun_logo.height(),
+ },
+ )
+ .expect("Failed to create texture for rerun logo");
Render2D {
rerun_logo_texture,
diff --git a/crates/re_renderer/examples/depth_cloud.rs b/crates/re_renderer/examples/depth_cloud.rs
index c66c17eb79b3..2f5cdb8f6905 100644
--- a/crates/re_renderer/examples/depth_cloud.rs
+++ b/crates/re_renderer/examples/depth_cloud.rs
@@ -20,8 +20,8 @@ use itertools::Itertools;
use macaw::IsoTransform;
use re_renderer::{
renderer::{
- ColormappedTexture, DepthCloud, DepthCloudDepthData, DepthCloudDrawData, DepthClouds,
- DrawData, GenericSkyboxDrawData, RectangleDrawData, RectangleOptions, TexturedRect,
+ ColormappedTexture, DepthCloud, DepthCloudDrawData, DepthClouds, DrawData,
+ GenericSkyboxDrawData, RectangleDrawData, RectangleOptions, TexturedRect,
},
resource_managers::{GpuTexture2D, Texture2DCreationDesc},
view_builder::{self, Projection, ViewBuilder},
@@ -44,7 +44,6 @@ enum CameraControl {
struct RenderDepthClouds {
depth: DepthTexture,
albedo: AlbedoTexture,
- albedo_handle: GpuTexture2D,
scale: f32,
point_radius_from_world_depth: f32,
@@ -175,14 +174,16 @@ impl RenderDepthClouds {
clouds: vec![DepthCloud {
world_from_obj,
depth_camera_intrinsics: *intrinsics,
- world_depth_from_data_depth: 1.0,
+ world_depth_from_texture_depth: 1.0,
point_radius_from_world_depth: *point_radius_from_world_depth,
max_depth_in_world: 5.0,
depth_dimensions: depth.dimensions,
- depth_data: depth.data.clone(),
+ depth_texture: depth.texture.clone(),
colormap: re_renderer::Colormap::Turbo,
outline_mask_id: Default::default(),
picking_object_id: Default::default(),
+ albedo_dimensions: glam::UVec2::ZERO,
+ albedo_data: None,
}],
radius_boost_in_ui_points_for_outlines: 2.5,
},
@@ -233,19 +234,8 @@ impl framework::Example for RenderDepthClouds {
fn new(re_ctx: &mut re_renderer::RenderContext) -> Self {
re_log::info!("Stop camera movement by pressing 'Space'");
- let depth = DepthTexture::spiral((640, 480).into());
- let albedo = AlbedoTexture::spiral(depth.dimensions);
-
- let albedo_handle = re_ctx.texture_manager_2d.create(
- &mut re_ctx.gpu_resources.textures,
- &Texture2DCreationDesc {
- label: "albedo".into(),
- data: bytemuck::cast_slice(&albedo.rgba8).into(),
- format: wgpu::TextureFormat::Rgba8UnormSrgb,
- width: albedo.dimensions.x,
- height: albedo.dimensions.y,
- },
- );
+ let depth = DepthTexture::spiral(re_ctx, glam::uvec2(640, 480));
+ let albedo = AlbedoTexture::spiral(re_ctx, depth.dimensions);
let scale = 50.0;
let point_radius_from_world_depth = 0.1;
@@ -263,7 +253,6 @@ impl framework::Example for RenderDepthClouds {
RenderDepthClouds {
depth,
albedo,
- albedo_handle,
scale,
point_radius_from_world_depth,
@@ -283,7 +272,6 @@ impl framework::Example for RenderDepthClouds {
) -> Vec {
let Self {
albedo,
- albedo_handle,
camera_control,
camera_position,
..
@@ -326,7 +314,7 @@ impl framework::Example for RenderDepthClouds {
.transform_point3(glam::Vec3::new(1.0, 1.0, 0.0)),
extent_u: world_from_model.transform_vector3(-glam::Vec3::X),
extent_v: world_from_model.transform_vector3(-glam::Vec3::Y),
- colormapped_texture: ColormappedTexture::from_unorm_srgba(albedo_handle.clone()),
+ colormapped_texture: ColormappedTexture::from_unorm_srgba(albedo.texture.clone()),
options: RectangleOptions {
texture_filter_magnification: re_renderer::renderer::TextureFilterMag::Nearest,
texture_filter_minification: re_renderer::renderer::TextureFilterMin::Linear,
@@ -403,40 +391,60 @@ fn spiral(dimensions: glam::UVec2) -> impl Iterator- {
})
}
+pub fn hash(value: &impl std::hash::Hash) -> u64 {
+ ahash::RandomState::with_seeds(1, 2, 3, 4).hash_one(value)
+}
+
struct DepthTexture {
dimensions: glam::UVec2,
- data: DepthCloudDepthData,
+ data: Vec,
+ texture: GpuTexture2D,
}
impl DepthTexture {
- pub fn spiral(dimensions: glam::UVec2) -> Self {
+ pub fn spiral(re_ctx: &mut re_renderer::RenderContext, dimensions: glam::UVec2) -> Self {
let size = (dimensions.x * dimensions.y) as usize;
let mut data = std::iter::repeat(0f32).take(size).collect_vec();
spiral(dimensions).for_each(|(texcoords, d)| {
data[(texcoords.x + texcoords.y * dimensions.x) as usize] = d;
});
- let data = DepthCloudDepthData::F32(data.into());
- Self { dimensions, data }
+ let label = format!("depth texture spiral {dimensions}");
+ let texture = re_ctx
+ .texture_manager_2d
+ .get_or_create(
+ hash(&label),
+ &mut re_ctx.gpu_resources.textures,
+ Texture2DCreationDesc {
+ label: label.into(),
+ data: bytemuck::cast_slice(&data).into(),
+ format: wgpu::TextureFormat::R32Float,
+ width: dimensions.x,
+ height: dimensions.y,
+ },
+ )
+ .expect("Failed to create depth texture.");
+
+ Self {
+ dimensions,
+ data,
+ texture,
+ }
}
pub fn get_linear(&self, x: u32, y: u32) -> f32 {
- match &self.data {
- DepthCloudDepthData::U16(data) => {
- data[(x + y * self.dimensions.x) as usize] as f32 / u16::MAX as f32
- }
- DepthCloudDepthData::F32(data) => data[(x + y * self.dimensions.x) as usize],
- }
+ self.data[(x + y * self.dimensions.x) as usize]
}
}
struct AlbedoTexture {
dimensions: glam::UVec2,
rgba8: Vec,
+ texture: GpuTexture2D,
}
impl AlbedoTexture {
- pub fn spiral(dimensions: glam::UVec2) -> Self {
+ pub fn spiral(re_ctx: &mut re_renderer::RenderContext, dimensions: glam::UVec2) -> Self {
let size = (dimensions.x * dimensions.y) as usize;
let mut rgba8 = std::iter::repeat(0).take(size * 4).collect_vec();
spiral(dimensions).for_each(|(texcoords, d)| {
@@ -444,7 +452,27 @@ impl AlbedoTexture {
rgba8[idx..idx + 4].copy_from_slice(re_renderer::colormap_turbo_srgb(d).as_slice());
});
- Self { dimensions, rgba8 }
+ let label = format!("albedo texture spiral {dimensions}");
+ let texture = re_ctx
+ .texture_manager_2d
+ .get_or_create(
+ hash(&label),
+ &mut re_ctx.gpu_resources.textures,
+ Texture2DCreationDesc {
+ label: label.into(),
+ data: bytemuck::cast_slice(&rgba8).into(),
+ format: wgpu::TextureFormat::Rgba8UnormSrgb,
+ width: dimensions.x,
+ height: dimensions.y,
+ },
+ )
+ .expect("Failed to create albedo texture.");
+
+ Self {
+ dimensions,
+ rgba8,
+ texture,
+ }
}
#[allow(dead_code)]
diff --git a/crates/re_renderer/examples/framework.rs b/crates/re_renderer/examples/framework.rs
index fef6e7544b5b..2575f9d82463 100644
--- a/crates/re_renderer/examples/framework.rs
+++ b/crates/re_renderer/examples/framework.rs
@@ -125,7 +125,7 @@ impl Application {
.await
.context("failed to find an appropriate adapter")?;
- let hardware_tier = HardwareTier::default();
+ let hardware_tier = HardwareTier::from_adapter(&adapter);
hardware_tier.check_downlevel_capabilities(&adapter.get_downlevel_capabilities())?;
let (device, queue) = adapter
.request_device(
@@ -159,6 +159,7 @@ impl Application {
surface.configure(&device, &surface_config);
let mut re_ctx = RenderContext::new(
+ &adapter,
device,
queue,
RenderContextConfig {
diff --git a/crates/re_renderer/shader/colormap.wgsl b/crates/re_renderer/shader/colormap.wgsl
index 59be61afdfe4..7d4676ac8852 100644
--- a/crates/re_renderer/shader/colormap.wgsl
+++ b/crates/re_renderer/shader/colormap.wgsl
@@ -8,11 +8,12 @@ const COLORMAP_MAGMA: u32 = 3u;
const COLORMAP_PLASMA: u32 = 4u;
const COLORMAP_TURBO: u32 = 5u;
const COLORMAP_VIRIDIS: u32 = 6u;
-
+const ALBEDO_TEXTURE: u32 = 7u;
/// Returns a gamma-space sRGB in 0-1 range.
///
/// The input will be saturated to [0, 1] range.
-fn colormap_srgb(which: u32, t: f32) -> Vec3 {
+fn colormap_srgb(which: u32, t_unsaturated: f32) -> Vec3 {
+ let t = saturate(t_unsaturated);
if which == COLORMAP_GRAYSCALE {
return linear_from_srgb(Vec3(t));
} else if which == COLORMAP_INFERNO {
@@ -61,7 +62,6 @@ fn colormap_turbo_srgb(t: f32) -> Vec3 {
let g2 = Vec2(4.27729857, 2.82956604);
let b2 = Vec2(-89.90310912, 27.34824973);
- let t = saturate(t);
let v4 = vec4(1.0, t, t * t, t * t * t);
let v2 = v4.zw * v4.z;
@@ -97,7 +97,6 @@ fn colormap_viridis_srgb(t: f32) -> Vec3 {
let c4 = Vec3(6.228269936347081, 14.17993336680509, 56.69055260068105);
let c5 = Vec3(4.776384997670288, -13.74514537774601, -65.35303263337234);
let c6 = Vec3(-5.435455855934631, 4.645852612178535, 26.3124352495832);
- let t = saturate(t);
return c0 + t * (c1 + t * (c2 + t * (c3 + t * (c4 + t * (c5 + t * c6)))));
}
@@ -112,7 +111,6 @@ fn colormap_plasma_srgb(t: f32) -> Vec3 {
let c4 = Vec3(-11.10743619062271, -82.66631109428045, 60.13984767418263);
let c5 = Vec3(10.02306557647065, 71.41361770095349, -54.07218655560067);
let c6 = Vec3(-3.658713842777788, -22.93153465461149, 18.19190778539828);
- let t = saturate(t);
return c0 + t * (c1 + t * (c2 + t * (c3 + t * (c4 + t * (c5 + t * c6)))));
}
@@ -127,7 +125,6 @@ fn colormap_magma_srgb(t: f32) -> Vec3 {
let c4 = Vec3(52.17613981234068, -27.94360607168351, 12.94416944238394);
let c5 = Vec3(-50.76852536473588, 29.04658282127291, 4.23415299384598);
let c6 = Vec3(18.65570506591883, -11.48977351997711, -5.601961508734096);
- let t = saturate(t);
return c0 + t * (c1 + t * (c2 + t * (c3 + t * (c4 + t * (c5 + t * c6)))));
}
@@ -142,6 +139,5 @@ fn colormap_inferno_srgb(t: f32) -> Vec3 {
let c4 = Vec3(77.162935699427, -33.40235894210092, -81.80730925738993);
let c5 = Vec3(-71.31942824499214, 32.62606426397723, 73.20951985803202);
let c6 = Vec3(25.13112622477341, -12.24266895238567, -23.07032500287172);
- let t = saturate(t);
return c0 + t * (c1 + t * (c2 + t * (c3 + t * (c4 + t * (c5 + t * c6)))));
}
diff --git a/crates/re_renderer/shader/depth_cloud.wgsl b/crates/re_renderer/shader/depth_cloud.wgsl
index 1e7f7afdf0d7..db39dd6d20d2 100644
--- a/crates/re_renderer/shader/depth_cloud.wgsl
+++ b/crates/re_renderer/shader/depth_cloud.wgsl
@@ -43,16 +43,26 @@ struct DepthCloudInfo {
/// Configures color mapping mode, see `colormap.wgsl`.
colormap: u32,
+ /// Is the albedo texture rgb or mono
+ albedo_color_space: u32,
+
/// Changes between the opaque and outline draw-phases.
radius_boost_in_ui_points: f32,
};
+const ALBEDO_COLOR_RGB: u32 = 0u;
+const ALBEDO_COLOR_MONO: u32 = 1u;
+
@group(1) @binding(0)
var depth_cloud_info: DepthCloudInfo;
@group(1) @binding(1)
var depth_texture: texture_2d;
+/// Only sampled if `DepthCloudInfo::colormap == ALBEDO_TEXTURE`.
+@group(1) @binding(2)
+var albedo_texture: texture_2d;
+
struct VertexOut {
@builtin(position)
pos_in_clip: Vec4,
@@ -82,19 +92,32 @@ struct PointData {
}
// Backprojects the depth texture using the intrinsics passed in the uniform buffer.
-fn compute_point_data(quad_idx: i32) -> PointData {
+fn compute_point_data(quad_idx: u32) -> PointData {
let wh = textureDimensions(depth_texture);
- let texcoords = IVec2(quad_idx % wh.x, quad_idx / wh.x);
+ let texcoords = UVec2(quad_idx % wh.x, quad_idx / wh.x);
// TODO(cmc): expose knobs to linearize/normalize/flip/cam-to-plane depth.
let world_space_depth = depth_cloud_info.world_depth_from_texture_value * textureLoad(depth_texture, texcoords, 0).x;
var data: PointData;
-
if 0.0 < world_space_depth && world_space_depth < f32max {
// TODO(cmc): albedo textures
- let color = Vec4(colormap_linear(depth_cloud_info.colormap, world_space_depth / depth_cloud_info.max_depth_in_world), 1.0);
-
+ // let color = Vec4(colormap_linear(depth_cloud_info.colormap, world_space_depth / depth_cloud_info.max_depth_in_world), 1.0);
+
+ var color: Vec4;
+ if depth_cloud_info.colormap == ALBEDO_TEXTURE {
+ color = textureSampleLevel(
+ albedo_texture,
+ trilinear_sampler,
+ Vec2(texcoords) / Vec2(textureDimensions(albedo_texture)),
+ 0.0
+ );
+ if depth_cloud_info.albedo_color_space == ALBEDO_COLOR_MONO {
+ color = Vec4(linear_from_srgb(Vec3(color.r)), 1.0);
+ }
+ } else {
+ color = Vec4(colormap_srgb(depth_cloud_info.colormap, world_space_depth), 1.0);
+ }
// TODO(cmc): This assumes a pinhole camera; need to support other kinds at some point.
let intrinsics = depth_cloud_info.depth_camera_intrinsics;
let focal_length = Vec2(intrinsics[0][0], intrinsics[1][1]);
diff --git a/crates/re_renderer/shader/generic_skybox.wgsl b/crates/re_renderer/shader/generic_skybox.wgsl
index b94e714ff5a6..854cfc530b34 100644
--- a/crates/re_renderer/shader/generic_skybox.wgsl
+++ b/crates/re_renderer/shader/generic_skybox.wgsl
@@ -18,7 +18,7 @@ fn skybox_light_srgb(dir: Vec3) -> Vec3 {
fn main(in: FragmentInput) -> @location(0) Vec4 {
let camera_dir = camera_ray_direction_from_screenuv(in.texcoord);
// Messing with direction a bit so it looks like in our old three-d based renderer (for easier comparison)
- let rgb = skybox_dark_srgb(camera_dir); // TODO(andreas): Allow switching to skybox_light
+ let rgb = skybox_light_srgb(camera_dir); // TODO(andreas): Allow switching to skybox_light
return Vec4(linear_from_srgb(rgb), 1.0);
//return Vec4(camera_dir, 1.0);
}
diff --git a/crates/re_renderer/shader/lines.wgsl b/crates/re_renderer/shader/lines.wgsl
index c8812e8112df..6a143a8233c8 100644
--- a/crates/re_renderer/shader/lines.wgsl
+++ b/crates/re_renderer/shader/lines.wgsl
@@ -32,11 +32,8 @@ struct BatchUniformBuffer {
@group(2) @binding(0)
var batch: BatchUniformBuffer;
-
-// textureLoad needs i32 right now, so we use that with all sizes & indices to avoid casts
-// https://github.com/gfx-rs/naga/issues/1997
-const POSITION_TEXTURE_SIZE: i32 = 512;
-const LINE_STRIP_TEXTURE_SIZE: i32 = 256;
+const POSITION_TEXTURE_SIZE: u32 = 512u;
+const LINE_STRIP_TEXTURE_SIZE: u32 = 256u;
// Flags
// See lines.rs#LineStripFlags
@@ -87,9 +84,7 @@ struct LineStripData {
// Read and unpack line strip data at a given location
fn read_strip_data(idx: u32) -> LineStripData {
- // can be u32 once https://github.com/gfx-rs/naga/issues/1997 is solved
- let idx = i32(idx);
- let coord = IVec2(idx % LINE_STRIP_TEXTURE_SIZE, idx / LINE_STRIP_TEXTURE_SIZE);
+ let coord = UVec2(idx % LINE_STRIP_TEXTURE_SIZE, idx / LINE_STRIP_TEXTURE_SIZE);
var raw_data = textureLoad(position_data_texture, coord, 0).xy;
var data: LineStripData;
@@ -110,9 +105,7 @@ struct PositionData {
// Read and unpack position data at a given location
fn read_position_data(idx: u32) -> PositionData {
- // can be u32 once https://github.com/gfx-rs/naga/issues/1997 is solved
- let idx = i32(idx);
- var raw_data = textureLoad(line_strip_texture, IVec2(idx % POSITION_TEXTURE_SIZE, idx / POSITION_TEXTURE_SIZE), 0);
+ var raw_data = textureLoad(line_strip_texture, UVec2(idx % POSITION_TEXTURE_SIZE, idx / POSITION_TEXTURE_SIZE), 0);
var data: PositionData;
let pos_4d = batch.world_from_obj * Vec4(raw_data.xyz, 1.0);
@@ -198,7 +191,7 @@ fn vs_main(@builtin(vertex_index) vertex_idx: u32) -> VertexOut {
quad_dir = pos_data_quad_after.pos - pos_data_quad_end.pos; // Go one pos data forward.
} else if is_cap_triangle {
// Discard vertex.
- center_position = Vec3(0.0/0.0, 0.0/0.0, 0.0/0.0);
+ center_position = Vec3(f32max);
} else {
quad_dir = pos_data_quad_end.pos - pos_data_quad_begin.pos;
}
diff --git a/crates/re_renderer/shader/point_cloud.wgsl b/crates/re_renderer/shader/point_cloud.wgsl
index dc6efe6df9b5..a55404230692 100644
--- a/crates/re_renderer/shader/point_cloud.wgsl
+++ b/crates/re_renderer/shader/point_cloud.wgsl
@@ -36,10 +36,7 @@ var batch: BatchUniformBuffer;
// Flags
// See point_cloud.rs#PointCloudBatchFlags
const ENABLE_SHADING: u32 = 1u;
-
-// textureLoad needs i32 right now, so we use that with all sizes & indices to avoid casts
-// https://github.com/gfx-rs/naga/issues/1997
-var TEXTURE_SIZE: i32 = 2048;
+const TEXTURE_SIZE: u32 = 2048u;
struct VertexOut {
@builtin(position)
@@ -75,8 +72,8 @@ struct PointData {
}
// Read and unpack data at a given location
-fn read_data(idx: i32) -> PointData {
- let coord = IVec2(i32(idx % TEXTURE_SIZE), idx / TEXTURE_SIZE);
+fn read_data(idx: u32) -> PointData {
+ let coord = UVec2(idx % TEXTURE_SIZE, idx / TEXTURE_SIZE);
let position_data = textureLoad(position_data_texture, coord, 0);
let color = textureLoad(color_texture, coord, 0);
diff --git a/crates/re_renderer/shader/rectangle_fs.wgsl b/crates/re_renderer/shader/rectangle_fs.wgsl
index 0d1a35cad961..62f65952fe21 100644
--- a/crates/re_renderer/shader/rectangle_fs.wgsl
+++ b/crates/re_renderer/shader/rectangle_fs.wgsl
@@ -86,10 +86,12 @@ fn fs_main(in: VertexOut) -> @location(0) Vec4 {
let colormap_size = textureDimensions(colormap_texture).xy;
let color_index = normalized_value.r * f32(colormap_size.x * colormap_size.y);
// TODO(emilk): interpolate between neighboring colors for non-integral color indices
- let color_index_i32 = i32(color_index);
- let x = color_index_i32 % colormap_size.x;
- let y = color_index_i32 / colormap_size.x;
- texture_color = textureLoad(colormap_texture, IVec2(x, y), 0);
+ // It's important to round here since otherwise numerical instability can push us to the adjacent class-id
+ // See: https://github.com/rerun-io/rerun/issues/1968
+ let color_index_u32 = u32(round(color_index));
+ let x = color_index_u32 % colormap_size.x;
+ let y = color_index_u32 / colormap_size.x;
+ texture_color = textureLoad(colormap_texture, UVec2(x, y), 0);
} else {
return ERROR_RGBA; // unknown color mapper
}
diff --git a/crates/re_renderer/shader/screen_triangle_vertex.wgsl b/crates/re_renderer/shader/screen_triangle_vertex.wgsl
index 224da3317d4b..e42fac7827a6 100644
--- a/crates/re_renderer/shader/screen_triangle_vertex.wgsl
+++ b/crates/re_renderer/shader/screen_triangle_vertex.wgsl
@@ -4,8 +4,10 @@ struct VertexOutput {
// Mark output position as invariant so it's safe to use it with depth test Equal.
// Without @invariant, different usages in different render pipelines might optimize differently,
// causing slightly different results.
- @invariant @builtin(position) position: Vec4,
- @location(0) texcoord: Vec2,
+ @invariant @builtin(position)
+ position: Vec4,
+ @location(0)
+ texcoord: Vec2,
};
// Workaround for https://github.com/gfx-rs/naga/issues/2252
diff --git a/crates/re_renderer/shader/types.wgsl b/crates/re_renderer/shader/types.wgsl
index 3323c7a6cd1f..6355bcc668b5 100644
--- a/crates/re_renderer/shader/types.wgsl
+++ b/crates/re_renderer/shader/types.wgsl
@@ -1,16 +1,16 @@
// Names chosen to match [`glam`](https://docs.rs/glam/latest/glam/)
-type Vec2 = vec2;
-type Vec3 = vec3;
-type Vec4 = vec4;
-type UVec2 = vec2;
-type UVec3 = vec3;
-type UVec4 = vec4;
-type IVec2 = vec2;
-type IVec3 = vec3;
-type IVec4 = vec4;
-type Mat3 = mat3x3;
-type Mat4x3 = mat4x3;
-type Mat4 = mat4x4;
+alias Vec2 = vec2;
+alias Vec3 = vec3;
+alias Vec4 = vec4;
+alias UVec2 = vec2;
+alias UVec3 = vec3;
+alias UVec4 = vec4;
+alias IVec2 = vec2;
+alias IVec3 = vec3;
+alias IVec4 = vec4;
+alias Mat3 = mat3x3;
+alias Mat4x3 = mat4x3;
+alias Mat4 = mat4x4;
// Extreme values as documented by the spec:
// https://www.w3.org/TR/WGSL/#floating-point-types
@@ -22,7 +22,7 @@ const f32min_normal = 0x1p-126f; // Smallest positive normal float value.
//const f16max = 0x1.ffcp+15h; // Largest positive float value.
//const f16min_normal = 0x1p-14h; // Smallest positive normal float value.
// https://www.w3.org/TR/WGSL/#integer-types
-const i32min = -0x80000000i;
+const i32min = -2147483648; // Naga has some issues with correct negative hexadecimal numbers https://github.com/gfx-rs/naga/issues/2314
const i32max = 0x7fffffffi;
const u32min = 0u;
const u32max = 0xffffffffu;
diff --git a/crates/re_renderer/shader/utils/sphere_quad.wgsl b/crates/re_renderer/shader/utils/sphere_quad.wgsl
index ccdd4b771a0b..00937d8e7701 100644
--- a/crates/re_renderer/shader/utils/sphere_quad.wgsl
+++ b/crates/re_renderer/shader/utils/sphere_quad.wgsl
@@ -56,8 +56,8 @@ fn sphere_quad_span_orthographic(point_pos: Vec3, point_radius: f32, top_bottom:
}
/// Returns the index of the current quad.
-fn sphere_quad_index(vertex_idx: u32) -> i32 {
- return i32(vertex_idx) / 6;
+fn sphere_quad_index(vertex_idx: u32) -> u32 {
+ return vertex_idx / 6u;
}
struct SphereQuadData {
diff --git a/crates/re_renderer/src/allocator/cpu_write_gpu_read_belt.rs b/crates/re_renderer/src/allocator/cpu_write_gpu_read_belt.rs
index db1a1d085a90..6bc86a60d112 100644
--- a/crates/re_renderer/src/allocator/cpu_write_gpu_read_belt.rs
+++ b/crates/re_renderer/src/allocator/cpu_write_gpu_read_belt.rs
@@ -1,6 +1,9 @@
-use std::{num::NonZeroU32, sync::mpsc};
+use std::sync::mpsc;
-use crate::wgpu_resources::{BufferDesc, GpuBuffer, GpuBufferPool, Texture2DBufferInfo};
+use crate::{
+ texture_info::Texture2DBufferInfo,
+ wgpu_resources::{BufferDesc, GpuBuffer, GpuBufferPool},
+};
/// A sub-allocated staging buffer that can be written to.
///
@@ -119,7 +122,7 @@ where
buffer: &self.chunk_buffer,
layout: wgpu::ImageDataLayout {
offset: self.byte_offset_in_chunk_buffer,
- bytes_per_row: NonZeroU32::new(buffer_info.bytes_per_row_padded),
+ bytes_per_row: Some(buffer_info.bytes_per_row_padded),
rows_per_image: None,
},
},
@@ -290,7 +293,7 @@ impl CpuWriteGpuReadBelt {
);
// Largest uncompressed texture format (btw. many compressed texture format have the same block size!)
debug_assert!(
- wgpu::TextureFormat::Rgba32Uint.describe().block_size as u64
+ wgpu::TextureFormat::Rgba32Uint.block_size(None).unwrap() as u64
<= CpuWriteGpuReadBelt::MIN_OFFSET_ALIGNMENT
);
diff --git a/crates/re_renderer/src/allocator/gpu_readback_belt.rs b/crates/re_renderer/src/allocator/gpu_readback_belt.rs
index 8e5f413743e9..d20e231cb269 100644
--- a/crates/re_renderer/src/allocator/gpu_readback_belt.rs
+++ b/crates/re_renderer/src/allocator/gpu_readback_belt.rs
@@ -1,6 +1,7 @@
-use std::{num::NonZeroU32, ops::Range, sync::mpsc};
+use std::{ops::Range, sync::mpsc};
-use crate::wgpu_resources::{BufferDesc, GpuBuffer, GpuBufferPool, Texture2DBufferInfo};
+use crate::texture_info::Texture2DBufferInfo;
+use crate::wgpu_resources::{BufferDesc, GpuBuffer, GpuBufferPool};
/// Identifier used to identify a buffer upon retrieval of the data.
///
@@ -16,6 +17,12 @@ struct PendingReadbackRange {
user_data: GpuReadbackUserDataStorage,
}
+#[derive(thiserror::Error, Debug)]
+pub enum GpuReadbackError {
+ #[error("Texture format {0:?} is not supported for readback.")]
+ UnsupportedTextureFormatForReadback(wgpu::TextureFormat),
+}
+
/// A reserved slice for GPU readback.
///
/// Readback needs to happen from a buffer/texture with copy-source usage,
@@ -36,8 +43,8 @@ impl GpuReadbackBuffer {
encoder: &mut wgpu::CommandEncoder,
source: wgpu::ImageCopyTexture<'_>,
copy_extents: glam::UVec2,
- ) {
- self.read_multiple_texture2d(encoder, &[(source, copy_extents)]);
+ ) -> Result<(), GpuReadbackError> {
+ self.read_multiple_texture2d(encoder, &[(source, copy_extents)])
}
/// Reads multiple textures into the same buffer.
@@ -54,11 +61,17 @@ impl GpuReadbackBuffer {
mut self,
encoder: &mut wgpu::CommandEncoder,
sources_and_extents: &[(wgpu::ImageCopyTexture<'_>, glam::UVec2)],
- ) {
+ ) -> Result<(), GpuReadbackError> {
for (source, copy_extents) in sources_and_extents {
let start_offset = wgpu::util::align_to(
self.range_in_chunk.start,
- source.texture.format().describe().block_size as u64,
+ source
+ .texture
+ .format()
+ .block_size(Some(source.aspect))
+ .ok_or(GpuReadbackError::UnsupportedTextureFormatForReadback(
+ source.texture.format(),
+ ))? as u64,
);
let buffer_info = Texture2DBufferInfo::new(source.texture.format(), *copy_extents);
@@ -75,7 +88,7 @@ impl GpuReadbackBuffer {
buffer: &self.chunk_buffer,
layout: wgpu::ImageDataLayout {
offset: start_offset,
- bytes_per_row: NonZeroU32::new(buffer_info.bytes_per_row_padded),
+ bytes_per_row: Some(buffer_info.bytes_per_row_padded),
rows_per_image: None,
},
},
@@ -89,6 +102,7 @@ impl GpuReadbackBuffer {
self.range_in_chunk =
(start_offset + buffer_info.buffer_size_padded)..self.range_in_chunk.end;
}
+ Ok(())
}
// TODO(andreas): Unused & untested so far!
diff --git a/crates/re_renderer/src/allocator/mod.rs b/crates/re_renderer/src/allocator/mod.rs
index 11a092b1b374..382376416d54 100644
--- a/crates/re_renderer/src/allocator/mod.rs
+++ b/crates/re_renderer/src/allocator/mod.rs
@@ -9,7 +9,8 @@ mod uniform_buffer_fill;
pub use cpu_write_gpu_read_belt::{CpuWriteGpuReadBelt, CpuWriteGpuReadBuffer};
pub use gpu_readback_belt::{
- GpuReadbackBelt, GpuReadbackBuffer, GpuReadbackIdentifier, GpuReadbackUserDataStorage,
+ GpuReadbackBelt, GpuReadbackBuffer, GpuReadbackError, GpuReadbackIdentifier,
+ GpuReadbackUserDataStorage,
};
pub use uniform_buffer_fill::{
create_and_fill_uniform_buffer, create_and_fill_uniform_buffer_batch,
diff --git a/crates/re_renderer/src/colormap.rs b/crates/re_renderer/src/colormap.rs
index 15cd98d5dc14..e4a4927ed3fe 100644
--- a/crates/re_renderer/src/colormap.rs
+++ b/crates/re_renderer/src/colormap.rs
@@ -18,6 +18,7 @@ pub enum Colormap {
Plasma = 4,
Turbo = 5,
Viridis = 6,
+ AlbedoTexture = 7,
}
impl Colormap {
@@ -40,6 +41,7 @@ impl std::fmt::Display for Colormap {
Colormap::Plasma => write!(f, "Plasma"),
Colormap::Turbo => write!(f, "Turbo"),
Colormap::Viridis => write!(f, "Viridis"),
+ Colormap::AlbedoTexture => write!(f, "AlbedoTexture"),
}
}
}
@@ -52,6 +54,10 @@ pub fn colormap_srgb(which: Colormap, t: f32) -> [u8; 4] {
Colormap::Plasma => colormap_plasma_srgb(t),
Colormap::Magma => colormap_magma_srgb(t),
Colormap::Inferno => colormap_inferno_srgb(t),
+ Colormap::AlbedoTexture => {
+ re_log::error_once!("Trying to do texture sampling on the CPU");
+ [0; 4]
+ }
}
}
diff --git a/crates/re_renderer/src/config.rs b/crates/re_renderer/src/config.rs
index 91e0315d401d..7b85283b505f 100644
--- a/crates/re_renderer/src/config.rs
+++ b/crates/re_renderer/src/config.rs
@@ -2,6 +2,11 @@
///
/// To reduce complexity, we don't do fine-grained feature checks,
/// but instead support set of features, each a superset of the next.
+///
+/// Tiers are sorted from lowest to highest. Certain tiers may not be possible on a given machine/setup,
+/// but choosing lower tiers is always possible.
+/// Tiers may loosely relate to quality settings, but their primary function is an easier way to
+/// do bundle feature *support* checks.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum HardwareTier {
/// Limited feature support as provided by WebGL and native GLES2/OpenGL3(ish).
@@ -34,18 +39,22 @@ impl HardwareTier {
}
}
-impl Default for HardwareTier {
- fn default() -> Self {
- // Use "Basic" tier for actual web but also if someone forces the GL backend!
- if supported_backends() == wgpu::Backends::GL {
- HardwareTier::Gles
- } else {
- HardwareTier::FullWebGpuSupport
+impl HardwareTier {
+ /// Picks the highest possible tier for a given adapter.
+ ///
+ /// Note that it is always possible to pick a lower tier!
+ pub fn from_adapter(adapter: &wgpu::Adapter) -> Self {
+ match adapter.get_info().backend {
+ wgpu::Backend::Vulkan
+ | wgpu::Backend::Metal
+ | wgpu::Backend::Dx12
+ | wgpu::Backend::BrowserWebGpu => HardwareTier::FullWebGpuSupport,
+
+ // Dx11 support in wgpu is sporadic, treat it like GLES to be on the safe side.
+ wgpu::Backend::Dx11 | wgpu::Backend::Gl | wgpu::Backend::Empty => HardwareTier::Gles,
}
}
-}
-impl HardwareTier {
/// Wgpu limits required by the given hardware tier.
pub fn limits(self) -> wgpu::Limits {
wgpu::Limits {
@@ -127,22 +136,19 @@ pub struct RenderContextConfig {
///
/// Other backend might work as well, but lack of support isn't regarded as a bug.
pub fn supported_backends() -> wgpu::Backends {
- // Native.
- // Only use Vulkan & Metal unless explicitly told so since this reduces surfaces and thus surprises.
- //
- // Bunch of cases where it's still useful to switch though:
- // * Some Windows VMs only provide DX12 drivers, observed with Parallels on Apple Silicon
- // * May run into Linux issues that warrant trying out the GL backend.
- //
- // For changing the backend we use standard wgpu env var, i.e. WGPU_BACKEND.
- #[cfg(not(target_arch = "wasm32"))]
- {
+ if cfg!(target_arch = "wasm32") {
+ // Web - WebGL is used automatically when wgpu is compiled with `webgl` feature.
+ wgpu::Backends::GL | wgpu::Backends::BROWSER_WEBGPU
+ } else {
+ // Native.
+ // Only use Vulkan & Metal unless explicitly told so since this reduces surfaces and thus surprises.
+ //
+ // Bunch of cases where it's still useful to switch though:
+ // * Some Windows VMs only provide DX12 drivers, observed with Parallels on Apple Silicon
+ // * May run into Linux issues that warrant trying out the GL backend.
+ //
+ // For changing the backend we use standard wgpu env var, i.e. WGPU_BACKEND.
wgpu::util::backend_bits_from_env()
.unwrap_or(wgpu::Backends::VULKAN | wgpu::Backends::METAL)
}
- // Web - we support only WebGL right now, WebGPU should work but hasn't been tested.
- #[cfg(target_arch = "wasm32")]
- {
- wgpu::Backends::GL
- }
}
diff --git a/crates/re_renderer/src/context.rs b/crates/re_renderer/src/context.rs
index 701d1800d561..a2c8d032b819 100644
--- a/crates/re_renderer/src/context.rs
+++ b/crates/re_renderer/src/context.rs
@@ -106,6 +106,7 @@ impl RenderContext {
const MAX_NUM_INFLIGHT_QUEUE_SUBMISSIONS: usize = 4;
pub fn new(
+ adapter: &wgpu::Adapter,
device: Arc,
queue: Arc,
config: RenderContextConfig,
@@ -138,7 +139,16 @@ impl RenderContext {
config.hardware_tier.features(),
device.features(),
);
- // Can't check downlevel feature flags since they sit on the adapter, not on the device.
+ assert!(adapter.get_downlevel_capabilities().flags.contains(config.hardware_tier.required_downlevel_capabilities().flags),
+ "The given device doesn't support the required downlevel capabilities for the given hardware tier {:?}.
+ Required:
+ {:?}
+ Actual:
+ {:?}",
+ config.hardware_tier,
+ config.hardware_tier.required_downlevel_capabilities(),
+ adapter.get_downlevel_capabilities(),
+ );
// In debug builds, make sure to catch all errors, never crash, and try to
// always let the user find a way to return a poisoned pipeline back into a
@@ -178,6 +188,21 @@ impl RenderContext {
frame_index: 0,
};
+ // Register shader workarounds for the current device.
+ if adapter.get_info().backend == wgpu::Backend::BrowserWebGpu {
+ // Chrome/Tint does not support `@invariant` when targeting Metal.
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=1439273
+ // (bug is fixed as of writing, but hasn't hit any public released version yet)
+ // Ignoring it is fine in the cases we use it, it's mostly there to avoid a (correct!) warning in wgpu.
+ gpu_resources
+ .shader_modules
+ .shader_text_workaround_replacements
+ .push((
+ "@invariant @builtin(position)".to_owned(),
+ "@builtin(position)".to_owned(),
+ ));
+ }
+
RenderContext {
device,
queue,
diff --git a/crates/re_renderer/src/draw_phases/mod.rs b/crates/re_renderer/src/draw_phases/mod.rs
index fe7ce542f245..f77d70e9ec5c 100644
--- a/crates/re_renderer/src/draw_phases/mod.rs
+++ b/crates/re_renderer/src/draw_phases/mod.rs
@@ -6,7 +6,8 @@ pub use outlines::{OutlineConfig, OutlineMaskPreference, OutlineMaskProcessor};
mod picking_layer;
pub use picking_layer::{
- PickingLayerId, PickingLayerInstanceId, PickingLayerObjectId, PickingLayerProcessor,
+ PickingLayerError, PickingLayerId, PickingLayerInstanceId, PickingLayerObjectId,
+ PickingLayerProcessor,
};
mod screenshot;
diff --git a/crates/re_renderer/src/draw_phases/picking_layer.rs b/crates/re_renderer/src/draw_phases/picking_layer.rs
index dc5cf38f033f..cd4d6601ebb0 100644
--- a/crates/re_renderer/src/draw_phases/picking_layer.rs
+++ b/crates/re_renderer/src/draw_phases/picking_layer.rs
@@ -13,11 +13,12 @@ use crate::{
allocator::create_and_fill_uniform_buffer,
global_bindings::FrameUniformBuffer,
include_shader_module,
+ texture_info::Texture2DBufferInfo,
view_builder::ViewBuilder,
wgpu_resources::{
BindGroupDesc, BindGroupEntry, BindGroupLayoutDesc, GpuBindGroup, GpuRenderPipelineHandle,
GpuTexture, GpuTextureHandle, PipelineLayoutDesc, PoolError, RenderPipelineDesc,
- Texture2DBufferInfo, TextureDesc, WgpuResourcePools,
+ TextureDesc, WgpuResourcePools,
},
DebugLabel, GpuReadbackBuffer, GpuReadbackIdentifier, IntRect, RenderContext,
};
@@ -132,6 +133,15 @@ pub fn pixel_coord_to_ndc(coord: glam::Vec2, target_resolution: glam::Vec2) -> g
)
}
+#[derive(thiserror::Error, Debug)]
+pub enum PickingLayerError {
+ #[error(transparent)]
+ ReadbackError(#[from] crate::allocator::GpuReadbackError),
+
+ #[error(transparent)]
+ ResourcePoolError(#[from] PoolError),
+}
+
/// Manages the rendering of the picking layer pass, its render targets & readback buffer.
///
/// The view builder creates this for every frame that requests a picking result.
@@ -278,8 +288,10 @@ impl PickingLayerProcessor {
// Offset of the depth buffer in the readback buffer needs to be aligned to size of a depth pixel.
// This is "trivially true" if the size of the depth format is a multiple of the size of the id format.
debug_assert!(
- Self::PICKING_LAYER_FORMAT.describe().block_size
- % Self::PICKING_LAYER_DEPTH_FORMAT.describe().block_size
+ Self::PICKING_LAYER_FORMAT.block_size(None).unwrap()
+ % Self::PICKING_LAYER_DEPTH_FORMAT
+ .block_size(Some(wgpu::TextureAspect::DepthOnly))
+ .unwrap()
== 0
);
let buffer_size = row_info_id.buffer_size_padded + row_info_depth.buffer_size_padded;
@@ -342,7 +354,7 @@ impl PickingLayerProcessor {
self,
encoder: &mut wgpu::CommandEncoder,
pools: &WgpuResourcePools,
- ) -> Result<(), PoolError> {
+ ) -> Result<(), PickingLayerError> {
let extent = glam::uvec2(
self.picking_target.texture.width(),
self.picking_target.texture.height(),
@@ -373,12 +385,16 @@ impl PickingLayerProcessor {
texture: &readable_depth_texture.texture,
mip_level: 0,
origin: wgpu::Origin3d::ZERO,
- aspect: wgpu::TextureAspect::All,
+ aspect: if self.depth_readback_workaround.is_some() {
+ wgpu::TextureAspect::All
+ } else {
+ wgpu::TextureAspect::DepthOnly
+ },
},
extent,
),
],
- );
+ )?;
Ok(())
}
@@ -401,11 +417,13 @@ impl PickingLayerProcessor {
.readback_data::>(identifier, |data, metadata| {
// Assert that our texture data reinterpretation works out from a pixel size point of view.
debug_assert_eq!(
- Self::PICKING_LAYER_DEPTH_FORMAT.describe().block_size as usize,
- std::mem::size_of::()
+ Self::PICKING_LAYER_DEPTH_FORMAT
+ .block_size(Some(wgpu::TextureAspect::DepthOnly))
+ .unwrap(),
+ std::mem::size_of::() as u32
);
debug_assert_eq!(
- Self::PICKING_LAYER_FORMAT.describe().block_size as usize,
+ Self::PICKING_LAYER_FORMAT.block_size(None).unwrap() as usize,
std::mem::size_of::()
);
@@ -432,8 +450,8 @@ impl PickingLayerProcessor {
// See https://github.com/gfx-rs/wgpu/issues/3644
debug_assert_eq!(
DepthReadbackWorkaround::READBACK_FORMAT
- .describe()
- .block_size as usize,
+ .block_size(None)
+ .unwrap() as usize,
std::mem::size_of::() * 4
);
picking_depth_data = picking_depth_data.into_iter().step_by(4).collect();
diff --git a/crates/re_renderer/src/draw_phases/screenshot.rs b/crates/re_renderer/src/draw_phases/screenshot.rs
index 68c05b3b545c..79cac54c1a6a 100644
--- a/crates/re_renderer/src/draw_phases/screenshot.rs
+++ b/crates/re_renderer/src/draw_phases/screenshot.rs
@@ -11,7 +11,9 @@
//! Or alternatively try to render the images in several tiles 🤔. In any case this would greatly improve quality!
use crate::{
- wgpu_resources::{GpuTexture, Texture2DBufferInfo, TextureDesc},
+ allocator::GpuReadbackError,
+ texture_info::Texture2DBufferInfo,
+ wgpu_resources::{GpuTexture, TextureDesc},
DebugLabel, GpuReadbackBuffer, GpuReadbackIdentifier, RenderContext,
};
@@ -95,7 +97,10 @@ impl ScreenshotProcessor {
pass
}
- pub fn end_render_pass(self, encoder: &mut wgpu::CommandEncoder) {
+ pub fn end_render_pass(
+ self,
+ encoder: &mut wgpu::CommandEncoder,
+ ) -> Result<(), GpuReadbackError> {
self.screenshot_readback_buffer.read_texture2d(
encoder,
wgpu::ImageCopyTexture {
@@ -108,7 +113,7 @@ impl ScreenshotProcessor {
self.screenshot_texture.texture.width(),
self.screenshot_texture.texture.height(),
),
- );
+ )
}
/// Returns the oldest received screenshot results for a given identifier and user data type.
diff --git a/crates/re_renderer/src/global_bindings.rs b/crates/re_renderer/src/global_bindings.rs
index c00ad0315c67..33fdfa4b2191 100644
--- a/crates/re_renderer/src/global_bindings.rs
+++ b/crates/re_renderer/src/global_bindings.rs
@@ -82,14 +82,14 @@ impl GlobalBindings {
// Sampler without any filtering.
wgpu::BindGroupLayoutEntry {
binding: 1,
- visibility: wgpu::ShaderStages::FRAGMENT,
+ visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT,
ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::NonFiltering),
count: None,
},
// Trilinear sampler.
wgpu::BindGroupLayoutEntry {
binding: 2,
- visibility: wgpu::ShaderStages::FRAGMENT,
+ visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT,
ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering),
count: None,
},
diff --git a/crates/re_renderer/src/importer/gltf.rs b/crates/re_renderer/src/importer/gltf.rs
index 9d628931c6f3..ba259c9f30bb 100644
--- a/crates/re_renderer/src/importer/gltf.rs
+++ b/crates/re_renderer/src/importer/gltf.rs
@@ -68,8 +68,16 @@ pub fn load_gltf_from_buffer(
};
images_as_textures.push(
- ctx.texture_manager_2d
- .create(&mut ctx.gpu_resources.textures, &texture),
+ match ctx
+ .texture_manager_2d
+ .create(&mut ctx.gpu_resources.textures, &texture)
+ {
+ Ok(texture) => texture,
+ Err(err) => {
+ re_log::error!("Failed to create texture: {err}");
+ ctx.texture_manager_2d.white_texture_unorm_handle().clone()
+ }
+ },
);
}
diff --git a/crates/re_renderer/src/lib.rs b/crates/re_renderer/src/lib.rs
index 770c0589f7fe..1932e1aeb9e2 100644
--- a/crates/re_renderer/src/lib.rs
+++ b/crates/re_renderer/src/lib.rs
@@ -12,6 +12,7 @@ pub mod importer;
pub mod mesh;
pub mod renderer;
pub mod resource_managers;
+pub mod texture_info;
pub mod view_builder;
mod allocator;
diff --git a/crates/re_renderer/src/renderer/debug_overlay.rs b/crates/re_renderer/src/renderer/debug_overlay.rs
index 6e615cd4a710..5b78ac3e3139 100644
--- a/crates/re_renderer/src/renderer/debug_overlay.rs
+++ b/crates/re_renderer/src/renderer/debug_overlay.rs
@@ -49,6 +49,12 @@ pub struct DebugOverlayRenderer {
bind_group_layout: GpuBindGroupLayoutHandle,
}
+#[derive(thiserror::Error, Debug)]
+pub enum DebugOverlayError {
+ #[error("Can't display texture with format: {0:?}")]
+ UnsupportedTextureFormat(wgpu::TextureFormat),
+}
+
/// Debug overlay for quick & dirty display of texture contents.
///
/// Executed as part of the composition draw phase in order to allow "direct" output to the screen.
@@ -70,7 +76,7 @@ impl DebugOverlayDrawData {
debug_texture: &GpuTexture,
screen_resolution: glam::UVec2,
overlay_rect: IntRect,
- ) -> Self {
+ ) -> Result {
let mut renderers = ctx.renderers.write();
let debug_overlay = renderers.get_or_create::<_, DebugOverlayRenderer>(
&ctx.shared_renderer_data,
@@ -79,13 +85,22 @@ impl DebugOverlayDrawData {
&mut ctx.resolver,
);
- let mode = match debug_texture.texture.format().describe().sample_type {
- wgpu::TextureSampleType::Depth | wgpu::TextureSampleType::Float { .. } => {
+ let mode = match debug_texture
+ .texture
+ .format()
+ .sample_type(Some(wgpu::TextureAspect::All))
+ {
+ Some(wgpu::TextureSampleType::Depth | wgpu::TextureSampleType::Float { .. }) => {
gpu_data::DebugOverlayMode::ShowFloatTexture
}
- wgpu::TextureSampleType::Sint | wgpu::TextureSampleType::Uint => {
+ Some(wgpu::TextureSampleType::Sint | wgpu::TextureSampleType::Uint) => {
gpu_data::DebugOverlayMode::ShowUintTexture
}
+ None => {
+ return Err(DebugOverlayError::UnsupportedTextureFormat(
+ debug_texture.texture.format(),
+ ))
+ }
};
let uniform_buffer_binding = create_and_fill_uniform_buffer(
@@ -112,7 +127,7 @@ impl DebugOverlayDrawData {
),
};
- DebugOverlayDrawData {
+ Ok(DebugOverlayDrawData {
bind_group: ctx.gpu_resources.bind_groups.alloc(
&ctx.device,
&ctx.gpu_resources,
@@ -126,7 +141,7 @@ impl DebugOverlayDrawData {
layout: debug_overlay.bind_group_layout,
},
),
- }
+ })
}
}
diff --git a/crates/re_renderer/src/renderer/depth_cloud.rs b/crates/re_renderer/src/renderer/depth_cloud.rs
index 285c0a2f9fd0..676d37e45391 100644
--- a/crates/re_renderer/src/renderer/depth_cloud.rs
+++ b/crates/re_renderer/src/renderer/depth_cloud.rs
@@ -11,18 +11,18 @@
//! The vertex shader backprojects the depth texture using the user-specified intrinsics, and then
//! behaves pretty much exactly like our point cloud renderer (see [`point_cloud.rs`]).
+use itertools::Itertools;
use smallvec::smallvec;
use crate::{
allocator::create_and_fill_uniform_buffer_batch,
draw_phases::{DrawPhase, OutlineMaskProcessor},
include_shader_module,
- resource_managers::ResourceManagerError,
+ resource_managers::{GpuTexture2D, ResourceManagerError},
view_builder::ViewBuilder,
wgpu_resources::{
BindGroupDesc, BindGroupEntry, BindGroupLayoutDesc, GpuBindGroup, GpuBindGroupLayoutHandle,
- GpuRenderPipelineHandle, GpuTexture, PipelineLayoutDesc, RenderPipelineDesc,
- Texture2DBufferInfo, TextureDesc,
+ GpuRenderPipelineHandle, GpuTexture, PipelineLayoutDesc, RenderPipelineDesc, TextureDesc,
},
Colormap, OutlineMaskPreference, PickingLayerObjectId, PickingLayerProcessor,
};
@@ -34,9 +34,17 @@ use super::{
// ---
+#[derive(Debug, Clone, Copy)]
+enum AlbedoColorSpace {
+ Rgb,
+ Mono,
+}
+
mod gpu_data {
use crate::{wgpu_buffer_types, PickingLayerObjectId};
+ use super::{AlbedoColorSpace, DepthCloudAlbedoData};
+
/// Keep in sync with mirror in `depth_cloud.wgsl.`
#[repr(C, align(256))]
#[derive(Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)]
@@ -50,7 +58,7 @@ mod gpu_data {
pub picking_layer_object_id: PickingLayerObjectId,
/// Multiplier to get world-space depth from whatever is in the texture.
- pub world_depth_from_texture_value: f32,
+ pub world_depth_from_texture_depth: f32,
/// Point radius is calculated as world-space depth times this value.
pub point_radius_from_world_depth: f32,
@@ -61,10 +69,13 @@ mod gpu_data {
/// Which colormap should be used.
pub colormap: u32,
+ /// Is the albedo texture rgb or mono
+ pub albedo_color_space: wgpu_buffer_types::U32RowPadded,
+
/// Changes over different draw-phases.
pub radius_boost_in_ui_points: wgpu_buffer_types::F32RowPadded,
- pub end_padding: [wgpu_buffer_types::PaddingRow; 16 - 4 - 3 - 1 - 1 - 1],
+ pub end_padding: [wgpu_buffer_types::PaddingRow; 16 - 4 - 3 - 1 - 1 - 1 - 1],
}
impl DepthCloudInfoUBO {
@@ -75,31 +86,35 @@ mod gpu_data {
let super::DepthCloud {
world_from_obj,
depth_camera_intrinsics,
- world_depth_from_data_depth,
+ world_depth_from_texture_depth,
point_radius_from_world_depth,
max_depth_in_world,
depth_dimensions: _,
- depth_data,
+ depth_texture: _,
colormap,
outline_mask_id,
picking_object_id,
+ albedo_dimensions: _,
+ albedo_data: _,
} = depth_cloud;
- let user_depth_from_texture_value = match depth_data {
- super::DepthCloudDepthData::U16(_) => 65535.0, // un-normalize
- super::DepthCloudDepthData::F32(_) => 1.0,
- };
- let world_depth_from_texture_value =
- world_depth_from_data_depth * user_depth_from_texture_value;
-
Self {
world_from_obj: (*world_from_obj).into(),
depth_camera_intrinsics: (*depth_camera_intrinsics).into(),
outline_mask_id: outline_mask_id.0.unwrap_or_default().into(),
- world_depth_from_texture_value,
+ world_depth_from_texture_depth: *world_depth_from_texture_depth,
point_radius_from_world_depth: *point_radius_from_world_depth,
max_depth_in_world: *max_depth_in_world,
colormap: *colormap as u32,
+ albedo_color_space: (depth_cloud
+ .albedo_data
+ .as_ref()
+ .map(|albedo_data| match albedo_data {
+ DepthCloudAlbedoData::Mono8(_) => AlbedoColorSpace::Mono,
+ _ => AlbedoColorSpace::Rgb,
+ })
+ .unwrap_or(AlbedoColorSpace::Rgb) as u32)
+ .into(),
radius_boost_in_ui_points: radius_boost_in_ui_points.into(),
picking_layer_object_id: *picking_object_id,
end_padding: Default::default(),
@@ -108,30 +123,17 @@ mod gpu_data {
}
}
-/// The raw data from a depth texture.
-///
-/// This is either `u16` or `f32` values; in both cases the data will be uploaded to the shader
-/// as-is.
-/// For `u16`s, this results in a `Depth16Unorm` texture, otherwise an `R32Float`.
-/// The reason we normalize `u16` is so that the shader can use a `float` texture in both cases.
-/// However, it means we need to multiply the sampled value by `65535.0` in the shader to get
-/// the actual depth.
-///
-/// The shader assumes that this is normalized, linear, non-flipped depth using the camera
-/// position as reference point (not the camera plane!).
+/// The raw data for the (optional) albedo texture.
//
-// TODO(cmc): support more depth data types.
-// TODO(cmc): expose knobs to linearize/normalize/flip/cam-to-plane depth.
+// TODO(cmc): support more albedo data types.
+// TODO(cmc): arrow buffers for u8...
#[derive(Debug, Clone)]
-pub enum DepthCloudDepthData {
- U16(crate::Buffer),
- F32(crate::Buffer),
-}
-
-impl Default for DepthCloudDepthData {
- fn default() -> Self {
- Self::F32(Default::default())
- }
+pub enum DepthCloudAlbedoData {
+ Rgb8(Vec),
+ Rgb8Srgb(Vec),
+ Rgba8(Vec),
+ Rgba8Srgb(Vec),
+ Mono8(Vec),
}
pub struct DepthCloud {
@@ -143,8 +145,8 @@ pub struct DepthCloud {
/// Only supports pinhole cameras at the moment.
pub depth_camera_intrinsics: glam::Mat3,
- /// Multiplier to get world-space depth from whatever is in [`Self::depth_data`].
- pub world_depth_from_data_depth: f32,
+ /// Multiplier to get world-space depth from whatever is in [`Self::depth_texture`].
+ pub world_depth_from_texture_depth: f32,
/// Point radius is calculated as world-space depth times this value.
pub point_radius_from_world_depth: f32,
@@ -155,10 +157,10 @@ pub struct DepthCloud {
/// The dimensions of the depth texture in pixels.
pub depth_dimensions: glam::UVec2,
- /// The actual data from the depth texture.
+ /// The actual data for the depth texture.
///
- /// See [`DepthCloudDepthData`] for more information.
- pub depth_data: DepthCloudDepthData,
+ /// Only textures with sample type `Float` are supported.
+ pub depth_texture: GpuTexture2D,
/// Configures color mapping mode.
pub colormap: Colormap,
@@ -168,6 +170,16 @@ pub struct DepthCloud {
/// Picking object id that applies for the entire depth cloud.
pub picking_object_id: PickingLayerObjectId,
+
+ /// The dimensions of the (optional) albedo texture in pixels.
+ ///
+ /// Irrelevant if [`Self::albedo_data`] isn't set.
+ pub albedo_dimensions: glam::UVec2,
+
+ /// The actual data for the (optional) albedo texture.
+ ///
+ /// If set, takes precedence over [`Self::colormap`].
+ pub albedo_data: Option,
}
impl DepthCloud {
@@ -192,7 +204,7 @@ impl DepthCloud {
for corner in corners {
let depth = corner.z;
- let pos_in_obj = ((corner.truncate() - offset) * depth / focal_length).extend(depth);
+ let pos_in_obj = (((corner.truncate() - offset) * depth) / focal_length).extend(depth);
let pos_in_world = self.world_from_obj.project_point3(pos_in_obj);
bbox.extend(pos_in_world);
}
@@ -223,11 +235,20 @@ impl DrawData for DepthCloudDrawData {
type Renderer = DepthCloudRenderer;
}
+#[derive(thiserror::Error, Debug)]
+pub enum DepthCloudDrawDataError {
+ #[error("Depth texture format was {0:?}, only formats with sample type float are supported")]
+ InvalidDepthTextureFormat(wgpu::TextureFormat),
+
+ #[error(transparent)]
+ ResourceManagerError(#[from] ResourceManagerError),
+}
+
impl DepthCloudDrawData {
pub fn new(
ctx: &mut RenderContext,
depth_clouds: &DepthClouds,
- ) -> Result {
+ ) -> Result {
crate::profile_function!();
let DepthClouds {
@@ -276,56 +297,84 @@ impl DepthCloudDrawData {
depth_cloud_ubo_binding_outlines,
depth_cloud_ubo_binding_opaque
) {
- let depth_texture = match &depth_cloud.depth_data {
- DepthCloudDepthData::U16(data) => {
- if cfg!(target_arch = "wasm32") {
- // Web: manual normalization because Depth16Unorm textures aren't supported on
- // the web (and won't ever be on the WebGL backend, see
- // https://github.com/gfx-rs/wgpu/issues/3537).
- //
- // TODO(cmc): use an RG8 texture and unpack it manually in the shader instead.
- use itertools::Itertools as _;
- let dataf32 = data
- .as_slice()
- .iter()
- .map(|d| *d as f32 / u16::MAX as f32)
+ if !matches!(
+ depth_cloud.depth_texture.format().sample_type(None),
+ Some(wgpu::TextureSampleType::Float { filterable: _ })
+ ) {
+ return Err(DepthCloudDrawDataError::InvalidDepthTextureFormat(
+ depth_cloud.depth_texture.format(),
+ ));
+ }
+ let albedo_texture = depth_cloud
+ .albedo_data
+ .as_ref()
+ .map_or_else(|| {
+ create_and_upload_texture(
+ ctx,
+ (1, 1).into(),
+ wgpu::TextureFormat::Rgba8Unorm,
+ [0u8; 4].as_slice(),
+ )
+ }, |data| match data {
+ DepthCloudAlbedoData::Rgba8(data) => create_and_upload_texture(
+ ctx,
+ depth_cloud.albedo_dimensions,
+ wgpu::TextureFormat::Rgba8Unorm,
+ data.as_slice(),
+ ),
+ DepthCloudAlbedoData::Rgba8Srgb(data) => create_and_upload_texture(
+ ctx,
+ depth_cloud.albedo_dimensions,
+ wgpu::TextureFormat::Rgba8UnormSrgb,
+ data.as_slice(),
+ ),
+ DepthCloudAlbedoData::Rgb8(data) => {
+ let data = data
+ .chunks(3)
+ .into_iter()
+ .flat_map(|c| [c[0], c[1], c[2], 255])
.collect_vec();
create_and_upload_texture(
ctx,
- depth_cloud,
- dataf32.as_slice(),
- wgpu::TextureFormat::R32Float,
+ depth_cloud.albedo_dimensions,
+ wgpu::TextureFormat::Rgba8Unorm,
+ data.as_slice(),
)
- } else {
- // Native: We use Depth16Unorm over R16Unorm because the latter is behind a feature flag and doesn't work on WebGPU.
+ }
+ DepthCloudAlbedoData::Rgb8Srgb(data) => {
+ let data = data
+ .chunks(3)
+ .into_iter()
+ .flat_map(|c| [c[0], c[1], c[2], 255])
+ .collect_vec();
create_and_upload_texture(
ctx,
- depth_cloud,
+ depth_cloud.albedo_dimensions,
+ wgpu::TextureFormat::Rgba8UnormSrgb,
data.as_slice(),
- wgpu::TextureFormat::Depth16Unorm,
)
}
- }
- DepthCloudDepthData::F32(data) => create_and_upload_texture(
- ctx,
- depth_cloud,
- data.as_slice(),
- wgpu::TextureFormat::R32Float,
- ),
- };
+ DepthCloudAlbedoData::Mono8(data) => create_and_upload_texture(
+ ctx,
+ depth_cloud.albedo_dimensions,
+ wgpu::TextureFormat::R8Unorm,
+ data.as_slice(),
+ ),
+ });
let mk_bind_group = |label, ubo: BindGroupEntry| {
ctx.gpu_resources.bind_groups.alloc(
&ctx.device,
&ctx.gpu_resources,
- &BindGroupDesc {
+ &(BindGroupDesc {
label,
entries: smallvec![
ubo,
- BindGroupEntry::DefaultTextureView(depth_texture.handle),
+ BindGroupEntry::DefaultTextureView(depth_cloud.depth_texture.handle),
+ BindGroupEntry::DefaultTextureView(albedo_texture.handle)
],
layout: bg_layout,
- },
+ }),
)
};
@@ -345,78 +394,51 @@ impl DepthCloudDrawData {
}
fn create_and_upload_texture(
- ctx: &mut RenderContext,
- depth_cloud: &DepthCloud,
+ ctx: &RenderContext,
+ dimensions: glam::UVec2,
+ format: wgpu::TextureFormat,
data: &[T],
- depth_format: wgpu::TextureFormat,
) -> GpuTexture {
crate::profile_function!();
- let depth_texture_size = wgpu::Extent3d {
- width: depth_cloud.depth_dimensions.x,
- height: depth_cloud.depth_dimensions.y,
+ let texture_size = wgpu::Extent3d {
+ width: dimensions.x,
+ height: dimensions.y,
depth_or_array_layers: 1,
};
- let depth_texture_desc = TextureDesc {
- label: "depth_texture".into(),
- size: depth_texture_size,
+ let texture_desc = TextureDesc {
+ label: "texture".into(),
+ size: texture_size,
mip_level_count: 1,
sample_count: 1,
dimension: wgpu::TextureDimension::D2,
- format: depth_format,
+ format,
usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
};
- let depth_texture = ctx
- .gpu_resources
- .textures
- .alloc(&ctx.device, &depth_texture_desc);
-
- // Not supporting compressed formats here.
- debug_assert!(depth_texture_desc.format.describe().block_dimensions == (1, 1));
-
- let buffer_info =
- Texture2DBufferInfo::new(depth_texture_desc.format, depth_cloud.depth_dimensions);
-
- // TODO(andreas): CpuGpuWriteBelt should make it easier to do this.
- let bytes_padding_per_row =
- (buffer_info.bytes_per_row_padded - buffer_info.bytes_per_row_unpadded) as usize;
- // Sanity check the padding size. If this happens something is seriously wrong, as it would imply
- // that we can't express the required alignment with the block size.
- debug_assert!(
- bytes_padding_per_row % std::mem::size_of::() == 0,
- "Padding is not a multiple of pixel size. Can't correctly pad the texture data"
- );
+ let texture = ctx.gpu_resources.textures.alloc(&ctx.device, &texture_desc);
+
+ let format_info = texture_desc.format;
+ let width_blocks = dimensions.x / (format_info.block_dimensions().0 as u32);
- let mut depth_texture_staging = ctx.cpu_write_gpu_read_belt.lock().allocate::(
+ let mut texture_staging = ctx.cpu_write_gpu_read_belt.lock().allocate::(
&ctx.device,
&ctx.gpu_resources.buffers,
- buffer_info.buffer_size_padded as usize / std::mem::size_of::(),
+ data.len(),
);
+ texture_staging.extend_from_slice(data);
- // Fill with a single copy if possible, otherwise do multiple, filling in padding.
- if bytes_padding_per_row == 0 {
- depth_texture_staging.extend_from_slice(data);
- } else {
- let num_pixel_padding_per_row = bytes_padding_per_row / std::mem::size_of::();
- for row in data.chunks(depth_texture_desc.size.width as usize) {
- depth_texture_staging.extend_from_slice(row);
- depth_texture_staging
- .extend(std::iter::repeat(T::zeroed()).take(num_pixel_padding_per_row));
- }
- }
-
- depth_texture_staging.copy_to_texture2d(
+ texture_staging.copy_to_texture2d(
ctx.active_frame.before_view_builder_encoder.lock().get(),
wgpu::ImageCopyTexture {
- texture: &depth_texture.inner.texture,
+ texture: &texture.inner.texture,
mip_level: 0,
origin: wgpu::Origin3d::ZERO,
aspect: wgpu::TextureAspect::All,
},
- depth_cloud.depth_dimensions,
+ glam::UVec2::new(texture_size.width, texture_size.height),
);
- depth_texture
+ texture
}
pub struct DepthCloudRenderer {
@@ -447,7 +469,7 @@ impl Renderer for DepthCloudRenderer {
let bind_group_layout = pools.bind_group_layouts.get_or_create(
device,
- &BindGroupLayoutDesc {
+ &(BindGroupLayoutDesc {
label: "depth_cloud_bg_layout".into(),
entries: vec![
wgpu::BindGroupLayoutEntry {
@@ -473,16 +495,26 @@ impl Renderer for DepthCloudRenderer {
},
count: None,
},
+ wgpu::BindGroupLayoutEntry {
+ binding: 2,
+ visibility: wgpu::ShaderStages::VERTEX,
+ ty: wgpu::BindingType::Texture {
+ sample_type: wgpu::TextureSampleType::Float { filterable: true },
+ view_dimension: wgpu::TextureViewDimension::D2,
+ multisampled: false,
+ },
+ count: None,
+ },
],
- },
+ }),
);
let pipeline_layout = pools.pipeline_layouts.get_or_create(
device,
- &PipelineLayoutDesc {
+ &(PipelineLayoutDesc {
label: "depth_cloud_rp_layout".into(),
entries: vec![shared_data.global_bindings.layout, bind_group_layout],
- },
+ }),
&pools.bind_group_layouts,
);
@@ -521,20 +553,20 @@ impl Renderer for DepthCloudRenderer {
);
let render_pipeline_picking_layer = pools.render_pipelines.get_or_create(
device,
- &RenderPipelineDesc {
+ &(RenderPipelineDesc {
label: "DepthCloudRenderer::render_pipeline_picking_layer".into(),
fragment_entrypoint: "fs_main_picking_layer".into(),
render_targets: smallvec![Some(PickingLayerProcessor::PICKING_LAYER_FORMAT.into())],
depth_stencil: PickingLayerProcessor::PICKING_LAYER_DEPTH_STATE,
multisample: PickingLayerProcessor::PICKING_LAYER_MSAA_STATE,
..render_pipeline_desc_color.clone()
- },
+ }),
&pools.pipeline_layouts,
&pools.shader_modules,
);
let render_pipeline_outline_mask = pools.render_pipelines.get_or_create(
device,
- &RenderPipelineDesc {
+ &(RenderPipelineDesc {
label: "DepthCloudRenderer::render_pipeline_outline_mask".into(),
fragment_entrypoint: "fs_main_outline_mask".into(),
render_targets: smallvec![Some(OutlineMaskProcessor::MASK_FORMAT.into())],
@@ -544,7 +576,7 @@ impl Renderer for DepthCloudRenderer {
shared_data.config.hardware_tier,
),
..render_pipeline_desc_color
- },
+ }),
&pools.pipeline_layouts,
&pools.shader_modules,
);
diff --git a/crates/re_renderer/src/renderer/lines.rs b/crates/re_renderer/src/renderer/lines.rs
index cf1222acfe1b..a46571928c63 100644
--- a/crates/re_renderer/src/renderer/lines.rs
+++ b/crates/re_renderer/src/renderer/lines.rs
@@ -104,10 +104,7 @@
//! * note that this would let us remove the degenerated quads between lines, making the approach cleaner and removing the "restart bit"
//!
-use std::{
- num::{NonZeroU32, NonZeroU64},
- ops::Range,
-};
+use std::{num::NonZeroU64, ops::Range};
use bitflags::bitflags;
use bytemuck::Zeroable;
@@ -479,7 +476,7 @@ impl LineDrawData {
bytemuck::cast_slice(&position_data_staging),
wgpu::ImageDataLayout {
offset: 0,
- bytes_per_row: NonZeroU32::new(
+ bytes_per_row: Some(
POSITION_TEXTURE_SIZE * std::mem::size_of::() as u32,
),
rows_per_image: None,
@@ -529,7 +526,7 @@ impl LineDrawData {
bytemuck::cast_slice(&line_strip_info_staging),
wgpu::ImageDataLayout {
offset: 0,
- bytes_per_row: NonZeroU32::new(
+ bytes_per_row: Some(
LINE_STRIP_TEXTURE_SIZE
* std::mem::size_of::() as u32,
),
diff --git a/crates/re_renderer/src/renderer/mod.rs b/crates/re_renderer/src/renderer/mod.rs
index 3b4284bc2a6d..b8b2bc508968 100644
--- a/crates/re_renderer/src/renderer/mod.rs
+++ b/crates/re_renderer/src/renderer/mod.rs
@@ -15,7 +15,7 @@ pub use point_cloud::{
mod depth_cloud;
pub use self::depth_cloud::{
- DepthCloud, DepthCloudDepthData, DepthCloudDrawData, DepthCloudRenderer, DepthClouds,
+ DepthCloud, DepthCloudAlbedoData, DepthCloudDrawData, DepthCloudRenderer, DepthClouds,
};
mod test_triangle;
@@ -35,7 +35,7 @@ mod compositor;
pub(crate) use compositor::CompositorDrawData;
mod debug_overlay;
-pub use debug_overlay::{DebugOverlayDrawData, DebugOverlayRenderer};
+pub use debug_overlay::{DebugOverlayDrawData, DebugOverlayError, DebugOverlayRenderer};
use crate::{
context::{RenderContext, SharedRendererData},
diff --git a/crates/re_renderer/src/renderer/point_cloud.rs b/crates/re_renderer/src/renderer/point_cloud.rs
index 639db5a17ceb..03611b80a256 100644
--- a/crates/re_renderer/src/renderer/point_cloud.rs
+++ b/crates/re_renderer/src/renderer/point_cloud.rs
@@ -130,7 +130,7 @@ pub struct PointCloudBatchInfo {
/// Defines an outline mask for an individual vertex ranges.
///
- /// Vertex ranges are *not* relative within the current batch, but relates to the draw data vertex buffer.
+ /// Vertex ranges are relative within the current batch.
///
/// Having many of these individual outline masks can be slow as they require each their own uniform buffer & draw call.
/// This feature is meant for a limited number of "extra selections"
@@ -455,6 +455,8 @@ impl PointCloudDrawData {
));
for (range, _) in &batch_info.additional_outline_mask_ids_vertex_ranges {
+ let range = (range.start + start_point_for_next_batch)
+ ..(range.end + start_point_for_next_batch);
batches_internal.push(point_renderer.create_point_cloud_batch(
ctx,
format!("{:?} strip-only {:?}", batch_info.label, range).into(),
diff --git a/crates/re_renderer/src/renderer/rectangles.rs b/crates/re_renderer/src/renderer/rectangles.rs
index 799655ecf78c..8b380a30a2bd 100644
--- a/crates/re_renderer/src/renderer/rectangles.rs
+++ b/crates/re_renderer/src/renderer/rectangles.rs
@@ -19,6 +19,7 @@ use crate::{
draw_phases::{DrawPhase, OutlineMaskProcessor},
include_shader_module,
resource_managers::{GpuTexture2D, ResourceManagerError},
+ texture_info,
view_builder::ViewBuilder,
wgpu_resources::{
BindGroupDesc, BindGroupEntry, BindGroupLayoutDesc, GpuBindGroup, GpuBindGroupLayoutHandle,
@@ -33,7 +34,7 @@ use super::{
};
/// Texture filter setting for magnification (a texel covers several pixels).
-#[derive(Debug)]
+#[derive(Debug, Clone, Copy)]
pub enum TextureFilterMag {
Linear,
Nearest,
@@ -41,7 +42,7 @@ pub enum TextureFilterMag {
}
/// Texture filter setting for minification (several texels fall to one pixel).
-#[derive(Debug)]
+#[derive(Debug, Clone, Copy)]
pub enum TextureFilterMin {
Linear,
Nearest,
@@ -98,6 +99,7 @@ impl ColormappedTexture {
}
}
+#[derive(Clone)]
pub struct TexturedRect {
/// Top left corner position in world space.
pub top_left_corner_position: glam::Vec3,
@@ -114,6 +116,7 @@ pub struct TexturedRect {
pub options: RectangleOptions,
}
+#[derive(Clone)]
pub struct RectangleOptions {
pub texture_filter_magnification: TextureFilterMag,
pub texture_filter_minification: TextureFilterMin,
@@ -166,7 +169,7 @@ pub enum RectangleError {
}
mod gpu_data {
- use crate::wgpu_buffer_types;
+ use crate::{texture_info, wgpu_buffer_types};
use super::{ColorMapper, RectangleError, TexturedRect};
@@ -214,9 +217,11 @@ mod gpu_data {
}
impl UniformBuffer {
- pub fn from_textured_rect(rectangle: &super::TexturedRect) -> Result {
+ pub fn from_textured_rect(
+ rectangle: &super::TexturedRect,
+ device_features: wgpu::Features,
+ ) -> Result {
let texture_format = rectangle.colormapped_texture.texture.format();
- let texture_info = texture_format.describe();
let TexturedRect {
top_left_corner_position,
@@ -241,25 +246,25 @@ mod gpu_data {
outline_mask,
} = options;
- let sample_type = match texture_info.sample_type {
- wgpu::TextureSampleType::Float { .. } => {
- if super::is_float_filterable(&texture_format) {
+ let sample_type = match texture_format.sample_type(None) {
+ Some(wgpu::TextureSampleType::Float { .. }) => {
+ if texture_info::is_float_filterable(texture_format, device_features) {
SAMPLE_TYPE_FLOAT_FILTER
} else {
SAMPLE_TYPE_FLOAT_NOFILTER
}
}
- wgpu::TextureSampleType::Depth => {
+ Some(wgpu::TextureSampleType::Sint) => SAMPLE_TYPE_SINT_NOFILTER,
+ Some(wgpu::TextureSampleType::Uint) => SAMPLE_TYPE_UINT_NOFILTER,
+ _ => {
return Err(RectangleError::DepthTexturesNotSupported);
}
- wgpu::TextureSampleType::Sint => SAMPLE_TYPE_SINT_NOFILTER,
- wgpu::TextureSampleType::Uint => SAMPLE_TYPE_UINT_NOFILTER,
};
let mut colormap_function = 0;
let color_mapper_int;
- match texture_info.components {
+ match texture_info::num_texture_components(texture_format) {
1 => match color_mapper {
Some(ColorMapper::Function(colormap)) => {
color_mapper_int = COLOR_MAPPER_FUNCTION;
@@ -352,7 +357,7 @@ impl RectangleDrawData {
// TODO(emilk): continue on error (skipping just that rectangle)?
let uniform_buffers: Vec<_> = rectangles
.iter()
- .map(gpu_data::UniformBuffer::from_textured_rect)
+ .map(|rect| gpu_data::UniformBuffer::from_textured_rect(rect, ctx.device.features()))
.try_collect()?;
let uniform_buffer_bindings = create_and_fill_uniform_buffer_batch(
@@ -387,10 +392,9 @@ impl RectangleDrawData {
let texture = &rectangle.colormapped_texture.texture;
let texture_format = texture.creation_desc.format;
- let texture_description = texture_format.describe();
- if texture_description.required_features != Default::default() {
+ if texture_format.required_features() != Default::default() {
return Err(RectangleError::SpecialFeatures(
- texture_description.required_features,
+ texture_format.required_features(),
));
}
@@ -400,23 +404,23 @@ impl RectangleDrawData {
let mut texture_sint = ctx.texture_manager_2d.zeroed_texture_sint().handle;
let mut texture_uint = ctx.texture_manager_2d.zeroed_texture_uint().handle;
- match texture_description.sample_type {
- wgpu::TextureSampleType::Float { .. } => {
- if is_float_filterable(&texture_format) {
+ match texture_format.sample_type(None) {
+ Some(wgpu::TextureSampleType::Float { .. }) => {
+ if texture_info::is_float_filterable(texture_format, ctx.device.features()) {
texture_float_filterable = texture.handle;
} else {
texture_float_nofilter = texture.handle;
}
}
- wgpu::TextureSampleType::Depth => {
- return Err(RectangleError::DepthTexturesNotSupported);
- }
- wgpu::TextureSampleType::Sint => {
+ Some(wgpu::TextureSampleType::Sint) => {
texture_sint = texture.handle;
}
- wgpu::TextureSampleType::Uint => {
+ Some(wgpu::TextureSampleType::Uint) => {
texture_uint = texture.handle;
}
+ _ => {
+ return Err(RectangleError::DepthTexturesNotSupported);
+ }
}
// We also set up an optional colormap texture.
@@ -689,11 +693,3 @@ impl Renderer for RectangleRenderer {
]
}
}
-
-fn is_float_filterable(format: &wgpu::TextureFormat) -> bool {
- format
- .describe()
- .guaranteed_format_features
- .flags
- .contains(wgpu::TextureFormatFeatureFlags::FILTERABLE)
-}
diff --git a/crates/re_renderer/src/resource_managers/mod.rs b/crates/re_renderer/src/resource_managers/mod.rs
index 7e1eff185a79..d9455d266071 100644
--- a/crates/re_renderer/src/resource_managers/mod.rs
+++ b/crates/re_renderer/src/resource_managers/mod.rs
@@ -10,7 +10,10 @@ mod mesh_manager;
pub use mesh_manager::{GpuMeshHandle, MeshManager};
mod texture_manager;
-pub use texture_manager::{GpuTexture2D, Texture2DCreationDesc, TextureManager2D};
+pub use texture_manager::{
+ GpuTexture2D, Texture2DCreationDesc, TextureCreationError, TextureManager2D,
+ TextureManager2DError,
+};
mod resource_manager;
pub use resource_manager::{ResourceHandle, ResourceLifeTime, ResourceManagerError};
diff --git a/crates/re_renderer/src/resource_managers/texture_manager.rs b/crates/re_renderer/src/resource_managers/texture_manager.rs
index 980918cb8a48..80da2c5768fe 100644
--- a/crates/re_renderer/src/resource_managers/texture_manager.rs
+++ b/crates/re_renderer/src/resource_managers/texture_manager.rs
@@ -1,4 +1,4 @@
-use std::{num::NonZeroU32, sync::Arc};
+use std::sync::Arc;
use ahash::{HashMap, HashSet};
@@ -75,7 +75,9 @@ pub struct Texture2DCreationDesc<'a> {
pub label: DebugLabel,
/// Data for the highest mipmap level.
- /// Must be padded according to wgpu rules and ready for upload.
+ ///
+ /// Data is expected to be tightly packed.
+ /// I.e. it is *not* padded according to wgpu buffer->texture transfer rules, padding will happen on the fly if necessary.
/// TODO(andreas): This should be a kind of factory function/builder instead which gets target memory passed in.
pub data: std::borrow::Cow<'a, [u8]>,
pub format: wgpu::TextureFormat,
@@ -93,6 +95,41 @@ impl<'a> Texture2DCreationDesc<'a> {
}
}
+// TODO(andreas): Move this to texture pool.
+#[derive(thiserror::Error, Debug)]
+pub enum TextureCreationError {
+ #[error("Texture with debug label {0:?} has zero width or height!")]
+ ZeroSize(DebugLabel),
+
+ #[error(
+ "Texture with debug label {label:?} has a format {format:?} that data can't be transferred to!"
+ )]
+ UnsupportedFormatForTransfer {
+ label: DebugLabel,
+ format: wgpu::TextureFormat,
+ },
+}
+
+#[derive(thiserror::Error, Debug)]
+pub enum TextureManager2DError {
+ /// Something went wrong when creating the GPU texture.
+ #[error(transparent)]
+ TextureCreation(#[from] TextureCreationError),
+
+ /// Something went wrong in a user-callback.
+ #[error(transparent)]
+ DataCreation(DataCreationError),
+}
+
+impl From> for TextureCreationError {
+ fn from(err: TextureManager2DError) -> Self {
+ match err {
+ TextureManager2DError::TextureCreation(texture_creation) => texture_creation,
+ TextureManager2DError::DataCreation(never) => match never {},
+ }
+ }
+}
+
/// Texture manager for 2D textures.
///
/// The scope is intentionally limited to particular kinds of textures that currently
@@ -144,7 +181,8 @@ impl TextureManager2D {
width: 1,
height: 1,
},
- );
+ )
+ .expect("Failed to create white pixel texture!");
let zeroed_texture_float =
create_zero_texture(texture_pool, &device, wgpu::TextureFormat::Rgba8Unorm);
@@ -174,7 +212,7 @@ impl TextureManager2D {
&mut self,
texture_pool: &mut GpuTexturePool,
creation_desc: &Texture2DCreationDesc<'_>,
- ) -> GpuTexture2D {
+ ) -> Result {
// TODO(andreas): Disabled the warning as we're moving towards using this texture manager for user-logged images.
// However, it's still very much a concern especially once we add mipmapping. Something we need to keep in mind.
//
@@ -201,39 +239,47 @@ impl TextureManager2D {
key: u64,
texture_pool: &mut GpuTexturePool,
texture_desc: Texture2DCreationDesc<'_>,
- ) -> GpuTexture2D {
- enum Never {}
- match self.get_or_create_with(key, texture_pool, || -> Result<_, Never> {
- Ok(texture_desc)
- }) {
- Ok(tex_handle) => tex_handle,
- Err(never) => match never {},
- }
+ ) -> Result {
+ self.get_or_create_with(key, texture_pool, || texture_desc)
}
/// Creates a new 2D texture resource and schedules data upload to the GPU if a texture
/// wasn't already created using the same key.
- pub fn get_or_create_with<'a, Err>(
+ pub fn get_or_create_with<'a>(
+ &mut self,
+ key: u64,
+ texture_pool: &mut GpuTexturePool,
+ create_texture_desc: impl FnOnce() -> Texture2DCreationDesc<'a>,
+ ) -> Result {
+ self.get_or_try_create_with(key, texture_pool, || -> Result<_, never::Never> {
+ Ok(create_texture_desc())
+ })
+ .map_err(|err| err.into())
+ }
+
+ /// Creates a new 2D texture resource and schedules data upload to the GPU if a texture
+ /// wasn't already created using the same key.
+ pub fn get_or_try_create_with<'a, Err: std::fmt::Display>(
&mut self,
key: u64,
texture_pool: &mut GpuTexturePool,
try_create_texture_desc: impl FnOnce() -> Result, Err>,
- ) -> Result {
+ ) -> Result> {
let texture_handle = match self.texture_cache.entry(key) {
std::collections::hash_map::Entry::Occupied(texture_handle) => {
texture_handle.get().clone() // already inserted
}
std::collections::hash_map::Entry::Vacant(entry) => {
// Run potentially expensive texture creation code:
- let tex_creation_desc = try_create_texture_desc()?;
- entry
- .insert(Self::create_and_upload_texture(
- &self.device,
- &self.queue,
- texture_pool,
- &tex_creation_desc,
- ))
- .clone()
+ let tex_creation_desc = try_create_texture_desc()
+ .map_err(|err| TextureManager2DError::DataCreation(err))?;
+ let texture = Self::create_and_upload_texture(
+ &self.device,
+ &self.queue,
+ texture_pool,
+ &tex_creation_desc,
+ )?;
+ entry.insert(texture).clone()
}
};
@@ -276,8 +322,13 @@ impl TextureManager2D {
queue: &wgpu::Queue,
texture_pool: &mut GpuTexturePool,
creation_desc: &Texture2DCreationDesc<'_>,
- ) -> GpuTexture2D {
+ ) -> Result {
crate::profile_function!();
+
+ if creation_desc.width == 0 || creation_desc.height == 0 {
+ return Err(TextureCreationError::ZeroSize(creation_desc.label.clone()));
+ }
+
let size = wgpu::Extent3d {
width: creation_desc.width,
height: creation_desc.height,
@@ -296,9 +347,15 @@ impl TextureManager2D {
},
);
- let format_info = creation_desc.format.describe();
- let width_blocks = creation_desc.width / format_info.block_dimensions.0 as u32;
- let bytes_per_row_unaligned = width_blocks * format_info.block_size as u32;
+ let width_blocks = creation_desc.width / creation_desc.format.block_dimensions().0;
+ let block_size = creation_desc
+ .format
+ .block_size(Some(wgpu::TextureAspect::All))
+ .ok_or_else(|| TextureCreationError::UnsupportedFormatForTransfer {
+ label: creation_desc.label.clone(),
+ format: creation_desc.format,
+ })?;
+ let bytes_per_row_unaligned = width_blocks * block_size;
// TODO(andreas): Once we have our own temp buffer for uploading, we can do the padding inplace
// I.e. the only difference will be if we do one memcopy or one memcopy per row, making row padding a nuisance!
@@ -317,9 +374,7 @@ impl TextureManager2D {
data,
wgpu::ImageDataLayout {
offset: 0,
- bytes_per_row: Some(
- NonZeroU32::new(bytes_per_row_unaligned).expect("invalid bytes per row"),
- ),
+ bytes_per_row: Some(bytes_per_row_unaligned),
rows_per_image: None,
},
size,
@@ -327,7 +382,7 @@ impl TextureManager2D {
// TODO(andreas): mipmap generation
- GpuTexture2D(texture)
+ Ok(GpuTexture2D(texture))
}
pub(crate) fn begin_frame(&mut self, _frame_index: u64) {
diff --git a/crates/re_renderer/src/texture_info.rs b/crates/re_renderer/src/texture_info.rs
new file mode 100644
index 000000000000..e18d447e62f8
--- /dev/null
+++ b/crates/re_renderer/src/texture_info.rs
@@ -0,0 +1,206 @@
+use std::borrow::Cow;
+
+/// Utility for dealing with buffers containing raw 2D texture data.
+#[derive(Clone)]
+pub struct Texture2DBufferInfo {
+ /// How many bytes per row contain actual data.
+ pub bytes_per_row_unpadded: u32,
+
+ /// How many bytes per row are required to be allocated in total.
+ ///
+ /// Padding bytes are always at the end of a row.
+ pub bytes_per_row_padded: u32,
+
+ /// Size required for an unpadded buffer.
+ pub buffer_size_unpadded: wgpu::BufferAddress,
+
+ /// Size required for a padded buffer as it is read/written from/to the GPU.
+ pub buffer_size_padded: wgpu::BufferAddress,
+}
+
+impl Texture2DBufferInfo {
+ /// Retrieves 2D texture buffer info for a given format & texture size.
+ ///
+ /// If a single buffer is not possible for all aspects of the texture format, all sizes will be zero.
+ #[inline]
+ pub fn new(format: wgpu::TextureFormat, extent: glam::UVec2) -> Self {
+ let block_dimensions = format.block_dimensions();
+ let width_blocks = extent.x / block_dimensions.0;
+ let height_blocks = extent.y / block_dimensions.1;
+
+ let block_size = format
+ .block_size(Some(wgpu::TextureAspect::All))
+ .unwrap_or(0); // This happens if we can't have a single buffer.
+ let bytes_per_row_unpadded = width_blocks * block_size;
+ let bytes_per_row_padded =
+ wgpu::util::align_to(bytes_per_row_unpadded, wgpu::COPY_BYTES_PER_ROW_ALIGNMENT);
+
+ Self {
+ bytes_per_row_unpadded,
+ bytes_per_row_padded,
+ buffer_size_unpadded: (bytes_per_row_unpadded * height_blocks) as wgpu::BufferAddress,
+ buffer_size_padded: (bytes_per_row_padded * height_blocks) as wgpu::BufferAddress,
+ }
+ }
+
+ #[inline]
+ pub fn num_rows(&self) -> u32 {
+ self.buffer_size_padded as u32 / self.bytes_per_row_padded
+ }
+
+ /// Removes the padding from a buffer containing gpu texture data.
+ ///
+ /// The passed in buffer is to be expected to be exactly of size [`Texture2DBufferInfo::buffer_size_padded`].
+ ///
+ /// Note that if you're passing in gpu data, there no alignment guarantees on the returned slice,
+ /// do NOT convert it using [`bytemuck`]. Use [`Texture2DBufferInfo::remove_padding_and_convert`] instead.
+ pub fn remove_padding<'a>(&self, buffer: &'a [u8]) -> Cow<'a, [u8]> {
+ crate::profile_function!();
+
+ assert_eq!(buffer.len() as wgpu::BufferAddress, self.buffer_size_padded);
+
+ if self.bytes_per_row_padded == self.bytes_per_row_unpadded {
+ return Cow::Borrowed(buffer);
+ }
+
+ let mut unpadded_buffer = Vec::with_capacity(self.buffer_size_unpadded as _);
+
+ for row in 0..self.num_rows() {
+ let offset = (self.bytes_per_row_padded * row) as usize;
+ unpadded_buffer.extend_from_slice(
+ &buffer[offset..(offset + self.bytes_per_row_unpadded as usize)],
+ );
+ }
+
+ unpadded_buffer.into()
+ }
+
+ /// Removes the padding from a buffer containing gpu texture data and remove convert to a given type.
+ ///
+ /// The passed in buffer is to be expected to be exactly of size [`Texture2DBufferInfo::buffer_size_padded`].
+ ///
+ /// The unpadded row size is expected to be a multiple of the size of the target type.
+ /// (Which means that, while uncommon, it technically doesn't need to be as big as a block in the pixel - this can be useful for e.g. packing wide bitfields)
+ pub fn remove_padding_and_convert(&self, buffer: &[u8]) -> Vec {
+ crate::profile_function!();
+
+ assert_eq!(buffer.len() as wgpu::BufferAddress, self.buffer_size_padded);
+ assert!(self.bytes_per_row_unpadded % std::mem::size_of::() as u32 == 0);
+
+ // Due to https://github.com/gfx-rs/wgpu/issues/3508 the data might be completely unaligned,
+ // so much, that we can't even interpret it as e.g. a u32 slice.
+ // Therefore, we have to do a copy of the data regardless of whether it's padded or not.
+
+ let mut unpadded_buffer: Vec = vec![
+ T::zeroed();
+ (self.num_rows() * self.bytes_per_row_unpadded / std::mem::size_of::() as u32)
+ as usize
+ ]; // TODO(andreas): Consider using unsafe set_len() instead of vec![] to avoid zeroing the memory.
+
+ // The copy has to happen on a u8 slice, because any other type would assume some alignment that we can't guarantee because of the above.
+ let unpadded_buffer_u8_view = bytemuck::cast_slice_mut(&mut unpadded_buffer);
+
+ for row in 0..self.num_rows() {
+ let offset_padded = (self.bytes_per_row_padded * row) as usize;
+ let offset_unpadded = (self.bytes_per_row_unpadded * row) as usize;
+ unpadded_buffer_u8_view
+ [offset_unpadded..(offset_unpadded + self.bytes_per_row_unpadded as usize)]
+ .copy_from_slice(
+ &buffer[offset_padded..(offset_padded + self.bytes_per_row_unpadded as usize)],
+ );
+ }
+
+ unpadded_buffer
+ }
+}
+
+pub fn is_float_filterable(format: wgpu::TextureFormat, device_features: wgpu::Features) -> bool {
+ format
+ .guaranteed_format_features(device_features)
+ .flags
+ .contains(wgpu::TextureFormatFeatureFlags::FILTERABLE)
+}
+
+pub fn num_texture_components(format: wgpu::TextureFormat) -> u8 {
+ #[allow(clippy::match_same_arms)]
+ match format {
+ wgpu::TextureFormat::R8Unorm
+ | wgpu::TextureFormat::R8Snorm
+ | wgpu::TextureFormat::R8Uint
+ | wgpu::TextureFormat::R8Sint
+ | wgpu::TextureFormat::R16Uint
+ | wgpu::TextureFormat::R16Sint
+ | wgpu::TextureFormat::R16Unorm
+ | wgpu::TextureFormat::R16Snorm
+ | wgpu::TextureFormat::R16Float
+ | wgpu::TextureFormat::R32Uint
+ | wgpu::TextureFormat::R32Sint
+ | wgpu::TextureFormat::R32Float => 1,
+
+ wgpu::TextureFormat::Rg8Unorm
+ | wgpu::TextureFormat::Rg8Snorm
+ | wgpu::TextureFormat::Rg8Uint
+ | wgpu::TextureFormat::Rg8Sint
+ | wgpu::TextureFormat::Rg16Uint
+ | wgpu::TextureFormat::Rg16Sint
+ | wgpu::TextureFormat::Rg16Unorm
+ | wgpu::TextureFormat::Rg16Snorm
+ | wgpu::TextureFormat::Rg16Float
+ | wgpu::TextureFormat::Rg32Uint
+ | wgpu::TextureFormat::Rg32Sint
+ | wgpu::TextureFormat::Rg32Float => 2,
+
+ wgpu::TextureFormat::Rgba8Unorm
+ | wgpu::TextureFormat::Rgba8UnormSrgb
+ | wgpu::TextureFormat::Rgba8Snorm
+ | wgpu::TextureFormat::Rgba8Uint
+ | wgpu::TextureFormat::Rgba8Sint
+ | wgpu::TextureFormat::Bgra8Unorm
+ | wgpu::TextureFormat::Bgra8UnormSrgb
+ | wgpu::TextureFormat::Rgba16Uint
+ | wgpu::TextureFormat::Rgba16Sint
+ | wgpu::TextureFormat::Rgba16Unorm
+ | wgpu::TextureFormat::Rgba16Snorm
+ | wgpu::TextureFormat::Rgba16Float
+ | wgpu::TextureFormat::Rgba32Uint
+ | wgpu::TextureFormat::Rgba32Sint
+ | wgpu::TextureFormat::Rgba32Float => 4,
+
+ wgpu::TextureFormat::Rgb9e5Ufloat | wgpu::TextureFormat::Rg11b10Float => 3,
+ wgpu::TextureFormat::Rgb10a2Unorm => 4,
+
+ wgpu::TextureFormat::Stencil8
+ | wgpu::TextureFormat::Depth16Unorm
+ | wgpu::TextureFormat::Depth24Plus
+ | wgpu::TextureFormat::Depth32Float => 1,
+
+ // It's complicated. Each aspect has actually only a single channel.
+ wgpu::TextureFormat::Depth24PlusStencil8 | wgpu::TextureFormat::Depth32FloatStencil8 => 2,
+
+ wgpu::TextureFormat::Bc1RgbaUnorm
+ | wgpu::TextureFormat::Bc1RgbaUnormSrgb
+ | wgpu::TextureFormat::Bc2RgbaUnorm
+ | wgpu::TextureFormat::Bc2RgbaUnormSrgb
+ | wgpu::TextureFormat::Bc3RgbaUnorm
+ | wgpu::TextureFormat::Bc3RgbaUnormSrgb
+ | wgpu::TextureFormat::Bc4RUnorm
+ | wgpu::TextureFormat::Bc4RSnorm
+ | wgpu::TextureFormat::Bc5RgUnorm
+ | wgpu::TextureFormat::Bc5RgSnorm
+ | wgpu::TextureFormat::Bc6hRgbUfloat
+ | wgpu::TextureFormat::Bc6hRgbFloat
+ | wgpu::TextureFormat::Bc7RgbaUnorm
+ | wgpu::TextureFormat::Bc7RgbaUnormSrgb
+ | wgpu::TextureFormat::Etc2Rgb8Unorm
+ | wgpu::TextureFormat::Etc2Rgb8UnormSrgb
+ | wgpu::TextureFormat::Etc2Rgb8A1Unorm
+ | wgpu::TextureFormat::Etc2Rgb8A1UnormSrgb
+ | wgpu::TextureFormat::Etc2Rgba8Unorm
+ | wgpu::TextureFormat::Etc2Rgba8UnormSrgb
+ | wgpu::TextureFormat::EacR11Unorm
+ | wgpu::TextureFormat::EacR11Snorm
+ | wgpu::TextureFormat::EacRg11Unorm
+ | wgpu::TextureFormat::EacRg11Snorm
+ | wgpu::TextureFormat::Astc { .. } => 4,
+ }
+}
diff --git a/crates/re_renderer/src/view_builder.rs b/crates/re_renderer/src/view_builder.rs
index 3d57b21a6f1c..86d8fc817b59 100644
--- a/crates/re_renderer/src/view_builder.rs
+++ b/crates/re_renderer/src/view_builder.rs
@@ -6,7 +6,8 @@ use crate::{
allocator::{create_and_fill_uniform_buffer, GpuReadbackIdentifier},
context::RenderContext,
draw_phases::{
- DrawPhase, OutlineConfig, OutlineMaskProcessor, PickingLayerProcessor, ScreenshotProcessor,
+ DrawPhase, OutlineConfig, OutlineMaskProcessor, PickingLayerError, PickingLayerProcessor,
+ ScreenshotProcessor,
},
global_bindings::FrameUniformBuffer,
renderer::{CompositorDrawData, DebugOverlayDrawData, DrawData, Renderer},
@@ -37,6 +38,9 @@ pub enum ViewBuilderError {
#[error("Picking rectangle readback was already scheduled.")]
PickingRectAlreadyScheduled,
+
+ #[error(transparent)]
+ InvalidDebugOverlay(#[from] crate::renderer::DebugOverlayError),
}
/// The highest level rendering block in `re_renderer`.
@@ -562,7 +566,15 @@ impl ViewBuilder {
//pass.set_bind_group(0, &setup.bind_group_0, &[]);
self.draw_phase(ctx, DrawPhase::PickingLayer, &mut pass);
}
- picking_processor.end_render_pass(&mut encoder, &ctx.gpu_resources)?;
+ match picking_processor.end_render_pass(&mut encoder, &ctx.gpu_resources) {
+ Err(PickingLayerError::ResourcePoolError(err)) => {
+ return Err(err);
+ }
+ Err(PickingLayerError::ReadbackError(err)) => {
+ re_log::warn_once!("Failed to schedule picking data readback: {err}");
+ }
+ Ok(()) => {}
+ }
}
if let Some(outline_mask_processor) = self.outline_mask_processor.take() {
@@ -582,7 +594,12 @@ impl ViewBuilder {
pass.set_bind_group(0, &setup.bind_group_0, &[]);
self.draw_phase(ctx, DrawPhase::CompositingScreenshot, &mut pass);
}
- screenshot_processor.end_render_pass(&mut encoder);
+ match screenshot_processor.end_render_pass(&mut encoder) {
+ Ok(()) => {}
+ Err(err) => {
+ re_log::warn_once!("Failed to schedule screenshot data readback: {err}");
+ }
+ }
}
Ok(encoder.finish())
@@ -692,7 +709,7 @@ impl ViewBuilder {
&picking_processor.picking_target,
self.setup.resolution_in_pixel.into(),
picking_rect,
- ));
+ )?);
}
self.picking_processor = Some(picking_processor);
diff --git a/crates/re_renderer/src/wgpu_resources/dynamic_resource_pool.rs b/crates/re_renderer/src/wgpu_resources/dynamic_resource_pool.rs
index 6c873429db4b..5c71fe51ac28 100644
--- a/crates/re_renderer/src/wgpu_resources/dynamic_resource_pool.rs
+++ b/crates/re_renderer/src/wgpu_resources/dynamic_resource_pool.rs
@@ -148,6 +148,13 @@ where
self.current_frame_index = frame_index;
let state = self.state.get_mut();
+ let update_stats = |creation_desc: &Desc| {
+ self.total_resource_size_in_bytes.fetch_sub(
+ creation_desc.resource_size_in_bytes(),
+ std::sync::atomic::Ordering::Relaxed,
+ );
+ };
+
// Throw out any resources that we haven't reclaimed last frame.
for (desc, resources) in state.last_frame_deallocated.drain() {
re_log::trace!(
@@ -160,11 +167,8 @@ where
debug_assert!(false, "a resource was marked as destroyed last frame that we no longer kept track of");
continue;
};
+ update_stats(&desc);
on_destroy_resource(&removed_resource);
- self.total_resource_size_in_bytes.fetch_sub(
- desc.resource_size_in_bytes(),
- std::sync::atomic::Ordering::Relaxed,
- );
}
}
@@ -184,6 +188,7 @@ where
.push(resource.handle);
true
} else {
+ update_stats(&resource.creation_desc);
on_destroy_resource(&resource.inner);
false
}
diff --git a/crates/re_renderer/src/wgpu_resources/mod.rs b/crates/re_renderer/src/wgpu_resources/mod.rs
index 06f30b6292d3..e5e3a389f731 100644
--- a/crates/re_renderer/src/wgpu_resources/mod.rs
+++ b/crates/re_renderer/src/wgpu_resources/mod.rs
@@ -7,7 +7,6 @@
//! higher level resources that arise from processing user provided data.
mod bind_group_layout_pool;
-use std::borrow::Cow;
pub use bind_group_layout_pool::{
BindGroupLayoutDesc, GpuBindGroupLayoutHandle, GpuBindGroupLayoutPool,
@@ -116,112 +115,3 @@ impl WgpuResourcePools {
}
}
}
-
-/// Utility for dealing with buffers containing raw 2D texture data.
-#[derive(Clone)]
-pub struct Texture2DBufferInfo {
- /// How many bytes per row contain actual data.
- pub bytes_per_row_unpadded: u32,
-
- /// How many bytes per row are required to be allocated in total.
- ///
- /// Padding bytes are always at the end of a row.
- pub bytes_per_row_padded: u32,
-
- /// Size required for an unpadded buffer.
- pub buffer_size_unpadded: wgpu::BufferAddress,
-
- /// Size required for a padded buffer as it is read/written from/to the GPU.
- pub buffer_size_padded: wgpu::BufferAddress,
-}
-
-impl Texture2DBufferInfo {
- #[inline]
- pub fn new(format: wgpu::TextureFormat, extent: glam::UVec2) -> Self {
- let format_info = format.describe();
-
- let width_blocks = extent.x / format_info.block_dimensions.0 as u32;
- let height_blocks = extent.y / format_info.block_dimensions.1 as u32;
-
- let bytes_per_row_unpadded = width_blocks * format_info.block_size as u32;
- let bytes_per_row_padded =
- wgpu::util::align_to(bytes_per_row_unpadded, wgpu::COPY_BYTES_PER_ROW_ALIGNMENT);
-
- Self {
- bytes_per_row_unpadded,
- bytes_per_row_padded,
- buffer_size_unpadded: (bytes_per_row_unpadded * height_blocks) as wgpu::BufferAddress,
- buffer_size_padded: (bytes_per_row_padded * height_blocks) as wgpu::BufferAddress,
- }
- }
-
- #[inline]
- pub fn num_rows(&self) -> u32 {
- self.buffer_size_padded as u32 / self.bytes_per_row_padded
- }
-
- /// Removes the padding from a buffer containing gpu texture data.
- ///
- /// The passed in buffer is to be expected to be exactly of size [`Texture2DBufferInfo::buffer_size_padded`].
- ///
- /// Note that if you're passing in gpu data, there no alignment guarantees on the returned slice,
- /// do NOT convert it using [`bytemuck`]. Use [`Texture2DBufferInfo::remove_padding_and_convert`] instead.
- pub fn remove_padding<'a>(&self, buffer: &'a [u8]) -> Cow<'a, [u8]> {
- crate::profile_function!();
-
- assert_eq!(buffer.len() as wgpu::BufferAddress, self.buffer_size_padded);
-
- if self.bytes_per_row_padded == self.bytes_per_row_unpadded {
- return Cow::Borrowed(buffer);
- }
-
- let mut unpadded_buffer = Vec::with_capacity(self.buffer_size_unpadded as _);
-
- for row in 0..self.num_rows() {
- let offset = (self.bytes_per_row_padded * row) as usize;
- unpadded_buffer.extend_from_slice(
- &buffer[offset..(offset + self.bytes_per_row_unpadded as usize)],
- );
- }
-
- unpadded_buffer.into()
- }
-
- /// Removes the padding from a buffer containing gpu texture data and remove convert to a given type.
- ///
- /// The passed in buffer is to be expected to be exactly of size [`Texture2DBufferInfo::buffer_size_padded`].
- ///
- /// The unpadded row size is expected to be a multiple of the size of the target type.
- /// (Which means that, while uncommon, it technically doesn't need to be as big as a block in the pixel - this can be useful for e.g. packing wide bitfields)
- pub fn remove_padding_and_convert(&self, buffer: &[u8]) -> Vec {
- crate::profile_function!();
-
- assert_eq!(buffer.len() as wgpu::BufferAddress, self.buffer_size_padded);
- assert!(self.bytes_per_row_unpadded % std::mem::size_of::() as u32 == 0);
-
- // Due to https://github.com/gfx-rs/wgpu/issues/3508 the data might be completely unaligned,
- // so much, that we can't even interpret it as e.g. a u32 slice.
- // Therefore, we have to do a copy of the data regardless of whether it's padded or not.
-
- let mut unpadded_buffer: Vec = vec![
- T::zeroed();
- (self.num_rows() * self.bytes_per_row_unpadded / std::mem::size_of::() as u32)
- as usize
- ]; // TODO(andreas): Consider using unsafe set_len() instead of vec![] to avoid zeroing the memory.
-
- // The copy has to happen on a u8 slice, because any other type would assume some alignment that we can't guarantee because of the above.
- let unpadded_buffer_u8_view = bytemuck::cast_slice_mut(&mut unpadded_buffer);
-
- for row in 0..self.num_rows() {
- let offset_padded = (self.bytes_per_row_padded * row) as usize;
- let offset_unpadded = (self.bytes_per_row_unpadded * row) as usize;
- unpadded_buffer_u8_view
- [offset_unpadded..(offset_unpadded + self.bytes_per_row_unpadded as usize)]
- .copy_from_slice(
- &buffer[offset_padded..(offset_padded + self.bytes_per_row_unpadded as usize)],
- );
- }
-
- unpadded_buffer
- }
-}
diff --git a/crates/re_renderer/src/wgpu_resources/sampler_pool.rs b/crates/re_renderer/src/wgpu_resources/sampler_pool.rs
index 53eed49cdf73..2c03824cf1c9 100644
--- a/crates/re_renderer/src/wgpu_resources/sampler_pool.rs
+++ b/crates/re_renderer/src/wgpu_resources/sampler_pool.rs
@@ -1,4 +1,4 @@
-use std::{hash::Hash, num::NonZeroU8};
+use std::hash::Hash;
use super::{resource::PoolError, static_resource_pool::StaticResourcePool};
use crate::debug_label::DebugLabel;
@@ -33,9 +33,6 @@ pub struct SamplerDesc {
/// Maximum level of detail (i.e. mip level) to use
pub lod_max_clamp: ordered_float::NotNan,
-
- /// Valid values: 1, 2, 4, 8, and 16.
- pub anisotropy_clamp: Option,
}
#[derive(Default)]
@@ -56,11 +53,11 @@ impl GpuSamplerPool {
mipmap_filter: desc.mipmap_filter,
lod_min_clamp: desc.lod_min_clamp.into(),
lod_max_clamp: desc.lod_max_clamp.into(),
- anisotropy_clamp: desc.anisotropy_clamp,
// Unsupported
compare: None,
border_color: None,
+ anisotropy_clamp: 1,
})
})
}
diff --git a/crates/re_renderer/src/wgpu_resources/shader_module_pool.rs b/crates/re_renderer/src/wgpu_resources/shader_module_pool.rs
index 1fb291f47f05..9b42f87d1788 100644
--- a/crates/re_renderer/src/wgpu_resources/shader_module_pool.rs
+++ b/crates/re_renderer/src/wgpu_resources/shader_module_pool.rs
@@ -54,13 +54,18 @@ impl ShaderModuleDesc {
&self,
device: &wgpu::Device,
resolver: &mut FileResolver,
+ shader_text_workaround_replacements: &[(String, String)],
) -> wgpu::ShaderModule {
- let source_interpolated = resolver
+ let mut source_interpolated = resolver
.populate(&self.source)
.context("couldn't resolve shader module's contents")
.map_err(|err| re_log::error!(err=%re_error::format(err)))
.unwrap_or_default();
+ for (from, to) in shader_text_workaround_replacements {
+ source_interpolated.contents = source_interpolated.contents.replace(from, to);
+ }
+
// All wgpu errors come asynchronously: this call will succeed whether the given
// source is valid or not.
// Only when actually submitting passes that make use of this shader will we know if
@@ -78,6 +83,11 @@ impl ShaderModuleDesc {
#[derive(Default)]
pub struct GpuShaderModulePool {
pool: StaticResourcePool,
+
+ /// Workarounds via text replacement in shader source code.
+ ///
+ /// TODO(andreas): These should be solved with a pre-processor.
+ pub shader_text_workaround_replacements: Vec<(String, String)>,
}
impl GpuShaderModulePool {
@@ -87,8 +97,9 @@ impl GpuShaderModulePool {
resolver: &mut FileResolver,
desc: &ShaderModuleDesc,
) -> GpuShaderModuleHandle {
- self.pool
- .get_or_create(desc, |desc| desc.create_shader_module(device, resolver))
+ self.pool.get_or_create(desc, |desc| {
+ desc.create_shader_module(device, resolver, &self.shader_text_workaround_replacements)
+ })
}
pub fn begin_frame(
@@ -115,7 +126,11 @@ impl GpuShaderModulePool {
}
paths.iter().any(|p| updated_paths.contains(p)).then(|| {
- let shader_module = desc.create_shader_module(device, resolver);
+ let shader_module = desc.create_shader_module(
+ device,
+ resolver,
+ &self.shader_text_workaround_replacements,
+ );
re_log::debug!(?desc.source, label = desc.label.get(), "recompiled shader module");
shader_module
})
diff --git a/crates/re_renderer/src/wgpu_resources/texture_pool.rs b/crates/re_renderer/src/wgpu_resources/texture_pool.rs
index c113b4f603d8..d194b387f773 100644
--- a/crates/re_renderer/src/wgpu_resources/texture_pool.rs
+++ b/crates/re_renderer/src/wgpu_resources/texture_pool.rs
@@ -69,9 +69,20 @@ impl DynamicResourcesDesc for TextureDesc {
/// The actual number might be both bigger (padding) and lower (gpu sided compression).
fn resource_size_in_bytes(&self) -> u64 {
let mut size_in_bytes = 0;
- let format_desc = self.format.describe();
- let pixels_per_block =
- format_desc.block_dimensions.0 as u64 * format_desc.block_dimensions.1 as u64;
+ let block_size = self
+ .format
+ .block_size(Some(wgpu::TextureAspect::All))
+ .unwrap_or_else(|| {
+ self.format
+ .block_size(Some(wgpu::TextureAspect::DepthOnly))
+ .unwrap_or(0)
+ + self
+ .format
+ .block_size(Some(wgpu::TextureAspect::StencilOnly))
+ .unwrap_or(0)
+ });
+ let block_dimension = self.format.block_dimensions();
+ let pixels_per_block = block_dimension.0 as u64 * block_dimension.1 as u64;
for mip in 0..self.size.max_mips(self.dimension) {
let mip_size = self
@@ -80,7 +91,7 @@ impl DynamicResourcesDesc for TextureDesc {
.physical_size(self.format);
let num_pixels = mip_size.width * mip_size.height * mip_size.depth_or_array_layers;
let num_blocks = num_pixels as u64 / pixels_per_block;
- size_in_bytes += num_blocks * format_desc.block_size as u64;
+ size_in_bytes += num_blocks * block_size as u64;
}
size_in_bytes
diff --git a/crates/re_ui/Cargo.toml b/crates/re_ui/Cargo.toml
index cfa5732751ca..b9a59e8f9c0e 100644
--- a/crates/re_ui/Cargo.toml
+++ b/crates/re_ui/Cargo.toml
@@ -30,8 +30,8 @@ egui_dock = ["dep:egui_dock"]
[dependencies]
-egui = { workspace = true, features = ["extra_debug_asserts", "tracing"] }
-egui_extras = { workspace = true, features = ["tracing"] }
+egui.workspace = true
+egui_extras.workspace = true
image = { workspace = true, default-features = false, features = ["png"] }
parking_lot.workspace = true
serde = { version = "1", features = ["derive"] }
@@ -39,11 +39,10 @@ serde_json = "1"
strum = { version = "0.24", features = ["derive"] }
strum_macros = "0.24"
sublime_fuzzy = "0.7"
-
## Optional dependencies:
eframe = { workspace = true, optional = true, default-features = false }
egui_dock = { workspace = true, optional = true, features = ["serde"] }
+re_log.workspace = true
[dev-dependencies]
eframe = { workspace = true, default-features = false, features = ["wgpu"] }
-re_log.workspace = true
diff --git a/crates/re_ui/data/design_tokens.json b/crates/re_ui/data/design_tokens.json
index 9c8974d9a4c5..f8da200e1354 100644
--- a/crates/re_ui/data/design_tokens.json
+++ b/crates/re_ui/data/design_tokens.json
@@ -3,121 +3,126 @@
"Color": {
"Surface": {
"Default": {
- "description": "Background color for most UI surfaces in Rerun",
- "value": "{Global.Color.Grey.100}",
- "type": "color"
+ "value": "{Global.Color.White}",
+ "type": "color",
+ "description": "Background color for most UI surfaces in Rerun"
},
"Floating": {
- "description": "Background color for floating elements like menus, dropdown options, notifications etc.",
- "value": "{Global.Color.Grey.175}",
- "type": "color"
+ "value": "{Global.Color.Primary.25}",
+ "type": "color",
+ "description": "Background color for floating elements like menus, dropdown options, notifications etc."
}
},
"Action": {
"Default": {
- "description": "Background color for UI elements like buttons and selects",
- "value": "{Global.Color.Grey.200}",
- "type": "color"
+ "value": "{Global.Color.White}",
+ "type": "color",
+ "description": "Background color for UI elements like buttons and selects"
},
"Hovered": {
- "description": "Background color for hovered UI elements",
- "value": "{Global.Color.Grey.225}",
- "type": "color"
+ "value": "{Global.Color.Primary.Hover}",
+ "type": "color",
+ "description": "Background color for hovered UI elements"
},
"Active": {
- "description": "Background color for pressed UI elements",
- "value": "{Global.Color.Grey.250}",
- "type": "color"
+ "value": "{Global.Color.Primary.Hover}",
+ "type": "color",
+ "description": "Background color for pressed UI elements"
},
"Pressed": {
- "description": "Background color for suppressed UI elements, like a select that is currently showing a menu",
- "value": "{Global.Color.Grey.250}",
- "type": "color"
+ "value": "{Global.Color.Primary.Hover}",
+ "type": "color",
+ "description": "Background color for suppressed UI elements, like a select that is currently showing a menu"
+ },
+ "Inactive": {
+ "value": "{Global.Color.White}",
+ "type": "color",
+ "description": "Background color for inactive buttons and such"
}
},
"NotificationBadge": {
"Unread": {
- "description": "Used for unread notification indicators",
"value": "{Global.Color.Blue.500}",
- "type": "color"
+ "type": "color",
+ "description": "Used for unread notification indicators"
},
"Read": {
- "description": "Used for read notification indicators",
"value": "{Global.Color.Grey.250}",
- "type": "color"
+ "type": "color",
+ "description": "Used for read notification indicators"
}
},
"Text": {
"Default": {
- "description": "Default text color",
- "value": "{Global.Color.Grey.775}",
- "type": "color"
+ "value": "{Global.Color.Text.Primary}",
+ "type": "color",
+ "description": "Default text color"
},
"Subdued": {
- "description": "Used for less important text",
- "value": "{Global.Color.Grey.550}",
- "type": "color"
+ "value": "{Global.Color.Text.Secondary}",
+ "type": "color",
+ "description": "Used for less important text"
},
"Strong": {
- "description": "Used for highlighted or emphasized items, such as current navigation items",
- "value": "{Global.Color.Grey.1000}",
- "type": "color"
+ "value": "{Global.Color.Black}",
+ "type": "color",
+ "description": "Used for highlighted or emphasized items, such as current navigation items"
}
},
"Border": {
"Default": {
- "value": "{Global.Color.OpaqueGrey.Default}",
- "description": "Default color for borders",
- "type": "color"
+ "value": "{Global.Color.Gray.200}",
+ "type": "color",
+ "description": "Default color for borders"
}
},
"Icon": {
"Default": {
- "description": "Default icon color",
"value": "{Global.Color.Grey.775}",
- "type": "color"
+ "type": "color",
+ "description": "Default icon color"
},
"Subdued": {
- "description": "Used together with subdued text",
"value": "{Global.Color.Grey.550}",
- "type": "color"
+ "type": "color",
+ "description": "Used together with subdued text"
},
"Strong": {
- "description": "Used together width strong text",
"value": "{Global.Color.Grey.1000}",
- "type": "color"
+ "type": "color",
+ "description": "Used together width strong text"
}
},
"Highlight": {
"Default": {
- "value": "{Global.Color.Blue.350}",
- "description": "Default color for highlighted items, like hovered menu items",
- "type": "color"
+ "value": "{Global.Color.Primary.Hover}",
+ "type": "color",
+ "description": "Default color for highlighted items, like hovered menu items"
}
}
},
"Typography": {
"Default": {
"value": "{Global.Typography.200}",
- "description": "Default font in Rerun's UI",
- "type": "typography"
+ "type": "typography",
+ "description": "Default font in Rerun's UI"
}
},
"Shadow": {
"Menu": {
- "description": "Used for menus, such as selects",
"value": "{Global.Shadow.100}",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": "Used for menus, such as selects"
},
"Popover": {
- "description": "Used for popovers and other semi-modal elements",
"value": "{Global.Shadow.400}",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": "Used for popovers and other semi-modal elements"
},
"Modal": {
- "description": "Used for modal views",
"value": "{Global.Shadow.800}",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": "Used for modal views"
}
}
},
@@ -126,1042 +131,1280 @@
"Grey": {
"0": {
"value": "#000000",
- "description": "0 - 0",
- "type": "color"
+ "type": "color",
+ "description": "0 - 0"
},
"25": {
"value": "#020303",
- "description": "0.7405999850077014 - 0.025",
- "type": "color"
+ "type": "color",
+ "description": "0.7405999850077014 - 0.025"
},
"50": {
"value": "#050607",
- "description": "1.7116872276823336 - 0.05",
- "type": "color"
+ "type": "color",
+ "description": "1.7116872276823336 - 0.05"
},
"75": {
"value": "#090b0c",
- "description": "2.911127985087129 - 0.075",
- "type": "color"
+ "type": "color",
+ "description": "2.911127985087129 - 0.075"
},
"100": {
"value": "#0d1011",
- "description": "4.335380638931743 - 0.1",
- "type": "color"
+ "type": "color",
+ "description": "4.335380638931743 - 0.1"
},
"125": {
"value": "#111415",
- "description": "5.979517530826747 - 0.125",
- "type": "color"
+ "type": "color",
+ "description": "5.979517530826747 - 0.125"
},
"150": {
"value": "#141819",
- "description": "7.837255342936205 - 0.15",
- "type": "color"
+ "type": "color",
+ "description": "7.837255342936205 - 0.15"
},
"175": {
"value": "#181c1e",
- "description": "9.90099383672154 - 0.175",
- "type": "color"
+ "type": "color",
+ "description": "9.90099383672154 - 0.175"
},
"200": {
"value": "#1c2123",
- "description": "12.16186271093947 - 0.2",
- "type": "color"
+ "type": "color",
+ "description": "12.16186271093947 - 0.2"
},
"225": {
"value": "#212628",
- "description": "14.609776289998841 - 0.225",
- "type": "color"
+ "type": "color",
+ "description": "14.609776289998841 - 0.225"
},
"250": {
"value": "#262b2e",
- "description": "17.233495705504463 - 0.25",
- "type": "color"
+ "type": "color",
+ "description": "17.233495705504463 - 0.25"
},
"275": {
"value": "#2b3134",
- "description": "20.02069818761812 - 0.275",
- "type": "color"
+ "type": "color",
+ "description": "20.02069818761812 - 0.275"
},
"300": {
"value": "#31383b",
- "description": "22.958053039032254 - 0.3",
- "type": "color"
+ "type": "color",
+ "description": "22.958053039032254 - 0.3"
},
"325": {
"value": "#373f42",
- "description": "26.03130382315192 - 0.325",
- "type": "color"
+ "type": "color",
+ "description": "26.03130382315192 - 0.325"
},
"350": {
"value": "#3e464a",
- "description": "29.22535625976699 - 0.35",
- "type": "color"
+ "type": "color",
+ "description": "29.22535625976699 - 0.35"
},
"375": {
"value": "#454e52",
- "description": "32.524371286309126 - 0.375",
- "type": "color"
+ "type": "color",
+ "description": "32.524371286309126 - 0.375"
},
"400": {
"value": "#4c565a",
- "description": "35.91186271093947 - 0.4",
- "type": "color"
+ "type": "color",
+ "description": "35.91186271093947 - 0.4"
},
"425": {
"value": "#545e63",
- "description": "39.37079885540354 - 0.425",
- "type": "color"
+ "type": "color",
+ "description": "39.37079885540354 - 0.425"
},
"450": {
"value": "#5c676c",
- "description": "42.88370756099135 - 0.45",
- "type": "color"
+ "type": "color",
+ "description": "42.88370756099135 - 0.45"
},
"475": {
"value": "#647075",
- "description": "46.43278391020581 - 0.475",
- "type": "color"
+ "type": "color",
+ "description": "46.43278391020581 - 0.475"
},
"500": {
"value": "#6c797f",
- "description": "49.99999999999999 - 0.5",
- "type": "color"
+ "type": "color",
+ "description": "49.99999999999999 - 0.5"
},
"525": {
"value": "#748288",
- "description": "53.56721608979418 - 0.525",
- "type": "color"
+ "type": "color",
+ "description": "53.56721608979418 - 0.525"
},
"550": {
"value": "#7d8c92",
- "description": "57.11629243900867 - 0.55",
- "type": "color"
+ "type": "color",
+ "description": "57.11629243900867 - 0.55"
},
"575": {
"value": "#85959c",
- "description": "60.62920114459644 - 0.575",
- "type": "color"
+ "type": "color",
+ "description": "60.62920114459644 - 0.575"
},
"600": {
"value": "#8e9ea5",
- "description": "64.08813728906053 - 0.6",
- "type": "color"
+ "type": "color",
+ "description": "64.08813728906053 - 0.6"
},
"625": {
"value": "#96a7af",
- "description": "67.47562871369087 - 0.625",
- "type": "color"
+ "type": "color",
+ "description": "67.47562871369087 - 0.625"
},
"650": {
"value": "#9eb0b8",
- "description": "70.774643740233 - 0.65",
- "type": "color"
+ "type": "color",
+ "description": "70.774643740233 - 0.65"
},
"675": {
"value": "#a6b9c1",
- "description": "73.96869617684807 - 0.675",
- "type": "color"
+ "type": "color",
+ "description": "73.96869617684807 - 0.675"
},
"700": {
"value": "#aec2ca",
- "description": "77.04194696096773 - 0.7",
- "type": "color"
+ "type": "color",
+ "description": "77.04194696096773 - 0.7"
},
"725": {
"value": "#b6cad2",
- "description": "79.97930181238189 - 0.725",
- "type": "color"
+ "type": "color",
+ "description": "79.97930181238189 - 0.725"
},
"750": {
"value": "#c0d1d8",
- "description": "82.76650429449552 - 0.75",
- "type": "color"
+ "type": "color",
+ "description": "82.76650429449552 - 0.75"
},
"775": {
"value": "#cad8de",
- "description": "85.39022371000115 - 0.775",
- "type": "color"
+ "type": "color",
+ "description": "85.39022371000115 - 0.775"
},
"800": {
"value": "#d3dee3",
- "description": "87.83813728906054 - 0.8",
- "type": "color"
+ "type": "color",
+ "description": "87.83813728906054 - 0.8"
},
"825": {
"value": "#dbe4e8",
- "description": "90.09900616327847 - 0.825",
- "type": "color"
+ "type": "color",
+ "description": "90.09900616327847 - 0.825"
},
"850": {
"value": "#e3eaed",
- "description": "92.16274465706378 - 0.85",
- "type": "color"
+ "type": "color",
+ "description": "92.16274465706378 - 0.85"
},
"875": {
"value": "#e9eff1",
- "description": "94.02048246917325 - 0.875",
- "type": "color"
+ "type": "color",
+ "description": "94.02048246917325 - 0.875"
},
"900": {
"value": "#eff3f5",
- "description": "95.66461936106825 - 0.9",
- "type": "color"
+ "type": "color",
+ "description": "95.66461936106825 - 0.9"
},
"925": {
"value": "#f4f7f8",
- "description": "97.08887201491288 - 0.925",
- "type": "color"
+ "type": "color",
+ "description": "97.08887201491288 - 0.925"
},
"950": {
"value": "#f9fafb",
- "description": "98.28831277231767 - 0.95",
- "type": "color"
+ "type": "color",
+ "description": "98.28831277231767 - 0.95"
},
"975": {
"value": "#fcfdfd",
- "description": "99.25940001499231 - 0.975",
- "type": "color"
+ "type": "color",
+ "description": "99.25940001499231 - 0.975"
},
"1000": {
"value": "#ffffff",
- "description": "100 - 1",
- "type": "color"
+ "type": "color",
+ "description": "100 - 1"
}
},
"Green": {
"0": {
"value": "#000000",
- "description": "0 - 0",
- "type": "color"
+ "type": "color",
+ "description": "0 - 0"
},
"25": {
"value": "#000401",
- "description": "0.7405999850077014 - 0.025",
- "type": "color"
+ "type": "color",
+ "description": "0.7405999850077014 - 0.025"
},
"50": {
"value": "#000803",
- "description": "1.7116872276823336 - 0.05",
- "type": "color"
+ "type": "color",
+ "description": "1.7116872276823336 - 0.05"
},
"75": {
"value": "#000e04",
- "description": "2.911127985087129 - 0.075",
- "type": "color"
+ "type": "color",
+ "description": "2.911127985087129 - 0.075"
},
"100": {
"value": "#001306",
- "description": "4.335380638931743 - 0.1",
- "type": "color"
+ "type": "color",
+ "description": "4.335380638931743 - 0.1"
},
"125": {
"value": "#001809",
- "description": "5.979517530826747 - 0.125",
- "type": "color"
+ "type": "color",
+ "description": "5.979517530826747 - 0.125"
},
"150": {
"value": "#001c0b",
- "description": "7.837255342936205 - 0.15",
- "type": "color"
+ "type": "color",
+ "description": "7.837255342936205 - 0.15"
},
"175": {
"value": "#00210e",
- "description": "9.90099383672154 - 0.175",
- "type": "color"
+ "type": "color",
+ "description": "9.90099383672154 - 0.175"
},
"200": {
"value": "#002611",
- "description": "12.16186271093947 - 0.2",
- "type": "color"
+ "type": "color",
+ "description": "12.16186271093947 - 0.2"
},
"225": {
"value": "#002c15",
- "description": "14.609776289998841 - 0.225",
- "type": "color"
+ "type": "color",
+ "description": "14.609776289998841 - 0.225"
},
"250": {
"value": "#003219",
- "description": "17.233495705504463 - 0.25",
- "type": "color"
+ "type": "color",
+ "description": "17.233495705504463 - 0.25"
},
"275": {
"value": "#00391d",
- "description": "20.02069818761812 - 0.275",
- "type": "color"
+ "type": "color",
+ "description": "20.02069818761812 - 0.275"
},
"300": {
"value": "#004021",
- "description": "22.958053039032254 - 0.3",
- "type": "color"
+ "type": "color",
+ "description": "22.958053039032254 - 0.3"
},
"325": {
"value": "#004826",
- "description": "26.03130382315192 - 0.325",
- "type": "color"
+ "type": "color",
+ "description": "26.03130382315192 - 0.325"
},
"350": {
"value": "#00502b",
- "description": "29.22535625976699 - 0.35",
- "type": "color"
+ "type": "color",
+ "description": "29.22535625976699 - 0.35"
},
"375": {
"value": "#005930",
- "description": "32.524371286309126 - 0.375",
- "type": "color"
+ "type": "color",
+ "description": "32.524371286309126 - 0.375"
},
"400": {
"value": "#006236",
- "description": "35.91186271093947 - 0.4",
- "type": "color"
+ "type": "color",
+ "description": "35.91186271093947 - 0.4"
},
"425": {
"value": "#006b3b",
- "description": "39.37079885540354 - 0.425",
- "type": "color"
+ "type": "color",
+ "description": "39.37079885540354 - 0.425"
},
"450": {
"value": "#007541",
- "description": "42.88370756099135 - 0.45",
- "type": "color"
+ "type": "color",
+ "description": "42.88370756099135 - 0.45"
},
"475": {
"value": "#007f47",
- "description": "46.43278391020581 - 0.475",
- "type": "color"
+ "type": "color",
+ "description": "46.43278391020581 - 0.475"
},
"500": {
"value": "#00894d",
- "description": "49.99999999999999 - 0.5",
- "type": "color"
+ "type": "color",
+ "description": "49.99999999999999 - 0.5"
},
"525": {
"value": "#009353",
- "description": "53.56721608979418 - 0.525",
- "type": "color"
+ "type": "color",
+ "description": "53.56721608979418 - 0.525"
},
"550": {
"value": "#009e5a",
- "description": "57.11629243900867 - 0.55",
- "type": "color"
+ "type": "color",
+ "description": "57.11629243900867 - 0.55"
},
"575": {
"value": "#00a860",
- "description": "60.62920114459644 - 0.575",
- "type": "color"
+ "type": "color",
+ "description": "60.62920114459644 - 0.575"
},
"600": {
"value": "#00b266",
- "description": "64.08813728906053 - 0.6",
- "type": "color"
+ "type": "color",
+ "description": "64.08813728906053 - 0.6"
},
"625": {
"value": "#00bc6c",
- "description": "67.47562871369087 - 0.625",
- "type": "color"
+ "type": "color",
+ "description": "67.47562871369087 - 0.625"
},
"650": {
"value": "#00c772",
- "description": "70.774643740233 - 0.65",
- "type": "color"
+ "type": "color",
+ "description": "70.774643740233 - 0.65"
},
"675": {
"value": "#00d078",
- "description": "73.96869617684807 - 0.675",
- "type": "color"
+ "type": "color",
+ "description": "73.96869617684807 - 0.675"
},
"700": {
"value": "#00da7e",
- "description": "77.04194696096773 - 0.7",
- "type": "color"
+ "type": "color",
+ "description": "77.04194696096773 - 0.7"
},
"725": {
"value": "#00e384",
- "description": "79.97930181238189 - 0.725",
- "type": "color"
+ "type": "color",
+ "description": "79.97930181238189 - 0.725"
},
"750": {
"value": "#00ec89",
- "description": "82.76650429449552 - 0.75",
- "type": "color"
+ "type": "color",
+ "description": "82.76650429449552 - 0.75"
},
"775": {
"value": "#00f48e",
- "description": "85.39022371000115 - 0.775",
- "type": "color"
+ "type": "color",
+ "description": "85.39022371000115 - 0.775"
},
"800": {
"value": "#00fc93",
- "description": "87.83813728906054 - 0.8",
- "type": "color"
+ "type": "color",
+ "description": "87.83813728906054 - 0.8"
},
"825": {
"value": "#5cffa5",
- "description": "90.09900616327847 - 0.825",
- "type": "color"
+ "type": "color",
+ "description": "90.09900616327847 - 0.825"
},
"850": {
"value": "#91ffbb",
- "description": "92.16274465706378 - 0.85",
- "type": "color"
+ "type": "color",
+ "description": "92.16274465706378 - 0.85"
},
"875": {
"value": "#b2ffcd",
- "description": "94.02048246917325 - 0.875",
- "type": "color"
+ "type": "color",
+ "description": "94.02048246917325 - 0.875"
},
"900": {
"value": "#caffdc",
- "description": "95.66461936106825 - 0.9",
- "type": "color"
+ "type": "color",
+ "description": "95.66461936106825 - 0.9"
},
"925": {
"value": "#ddffe8",
- "description": "97.08887201491288 - 0.925",
- "type": "color"
+ "type": "color",
+ "description": "97.08887201491288 - 0.925"
},
"950": {
"value": "#ebfff1",
- "description": "98.28831277231767 - 0.95",
- "type": "color"
+ "type": "color",
+ "description": "98.28831277231767 - 0.95"
},
"975": {
"value": "#f7fff9",
- "description": "99.25940001499231 - 0.975",
- "type": "color"
+ "type": "color",
+ "description": "99.25940001499231 - 0.975"
},
"1000": {
"value": "#ffffff",
- "description": "100 - 1",
- "type": "color"
+ "type": "color",
+ "description": "100 - 1"
}
},
"Red": {
"0": {
"value": "#000000",
- "description": "0 - 0",
- "type": "color"
+ "type": "color",
+ "description": "0 - 0"
},
"25": {
"value": "#0c0001",
- "description": "0.7405999850077014 - 0.025",
- "type": "color"
+ "type": "color",
+ "description": "0.7405999850077014 - 0.025"
},
"50": {
"value": "#170003",
- "description": "1.7116872276823336 - 0.05",
- "type": "color"
+ "type": "color",
+ "description": "1.7116872276823336 - 0.05"
},
"75": {
"value": "#200005",
- "description": "2.911127985087129 - 0.075",
- "type": "color"
+ "type": "color",
+ "description": "2.911127985087129 - 0.075"
},
"100": {
"value": "#290007",
- "description": "4.335380638931743 - 0.1",
- "type": "color"
+ "type": "color",
+ "description": "4.335380638931743 - 0.1"
},
"125": {
"value": "#310009",
- "description": "5.979517530826747 - 0.125",
- "type": "color"
+ "type": "color",
+ "description": "5.979517530826747 - 0.125"
},
"150": {
"value": "#38000c",
- "description": "7.837255342936205 - 0.15",
- "type": "color"
+ "type": "color",
+ "description": "7.837255342936205 - 0.15"
},
"175": {
"value": "#40000f",
- "description": "9.90099383672154 - 0.175",
- "type": "color"
+ "type": "color",
+ "description": "9.90099383672154 - 0.175"
},
"200": {
"value": "#480012",
- "description": "12.16186271093947 - 0.2",
- "type": "color"
+ "type": "color",
+ "description": "12.16186271093947 - 0.2"
},
"225": {
"value": "#520016",
- "description": "14.609776289998841 - 0.225",
- "type": "color"
+ "type": "color",
+ "description": "14.609776289998841 - 0.225"
},
"250": {
"value": "#5c001a",
- "description": "17.233495705504463 - 0.25",
- "type": "color"
+ "type": "color",
+ "description": "17.233495705504463 - 0.25"
},
"275": {
"value": "#67001e",
- "description": "20.02069818761812 - 0.275",
- "type": "color"
+ "type": "color",
+ "description": "20.02069818761812 - 0.275"
},
"300": {
"value": "#730022",
- "description": "22.958053039032254 - 0.3",
- "type": "color"
+ "type": "color",
+ "description": "22.958053039032254 - 0.3"
},
"325": {
"value": "#800027",
- "description": "26.03130382315192 - 0.325",
- "type": "color"
+ "type": "color",
+ "description": "26.03130382315192 - 0.325"
},
"350": {
"value": "#8e002c",
- "description": "29.22535625976699 - 0.35",
- "type": "color"
+ "type": "color",
+ "description": "29.22535625976699 - 0.35"
},
"375": {
"value": "#9c0031",
- "description": "32.524371286309126 - 0.375",
- "type": "color"
+ "type": "color",
+ "description": "32.524371286309126 - 0.375"
},
"400": {
"value": "#ab0037",
- "description": "35.91186271093947 - 0.4",
- "type": "color"
+ "type": "color",
+ "description": "35.91186271093947 - 0.4"
},
"425": {
"value": "#bb003d",
- "description": "39.37079885540354 - 0.425",
- "type": "color"
+ "type": "color",
+ "description": "39.37079885540354 - 0.425"
},
"450": {
"value": "#cb0043",
- "description": "42.88370756099135 - 0.45",
- "type": "color"
+ "type": "color",
+ "description": "42.88370756099135 - 0.45"
},
"475": {
"value": "#db0049",
- "description": "46.43278391020581 - 0.475",
- "type": "color"
+ "type": "color",
+ "description": "46.43278391020581 - 0.475"
},
"500": {
"value": "#ec004f",
- "description": "49.99999999999999 - 0.5",
- "type": "color"
+ "type": "color",
+ "description": "49.99999999999999 - 0.5"
},
"525": {
"value": "#fd0056",
- "description": "53.56721608979418 - 0.525",
- "type": "color"
+ "type": "color",
+ "description": "53.56721608979418 - 0.525"
},
"550": {
"value": "#ff3865",
- "description": "57.11629243900867 - 0.55",
- "type": "color"
+ "type": "color",
+ "description": "57.11629243900867 - 0.55"
},
"575": {
"value": "#ff5474",
- "description": "60.62920114459644 - 0.575",
- "type": "color"
+ "type": "color",
+ "description": "60.62920114459644 - 0.575"
},
"600": {
"value": "#ff6981",
- "description": "64.08813728906053 - 0.6",
- "type": "color"
+ "type": "color",
+ "description": "64.08813728906053 - 0.6"
},
"625": {
"value": "#ff7a8e",
- "description": "67.47562871369087 - 0.625",
- "type": "color"
+ "type": "color",
+ "description": "67.47562871369087 - 0.625"
},
"650": {
"value": "#ff8a9a",
- "description": "70.774643740233 - 0.65",
- "type": "color"
+ "type": "color",
+ "description": "70.774643740233 - 0.65"
},
"675": {
"value": "#ff99a6",
- "description": "73.96869617684807 - 0.675",
- "type": "color"
+ "type": "color",
+ "description": "73.96869617684807 - 0.675"
},
"700": {
"value": "#ffa6b1",
- "description": "77.04194696096773 - 0.7",
- "type": "color"
+ "type": "color",
+ "description": "77.04194696096773 - 0.7"
},
"725": {
"value": "#ffb2bb",
- "description": "79.97930181238189 - 0.725",
- "type": "color"
+ "type": "color",
+ "description": "79.97930181238189 - 0.725"
},
"750": {
"value": "#ffbdc5",
- "description": "82.76650429449552 - 0.75",
- "type": "color"
+ "type": "color",
+ "description": "82.76650429449552 - 0.75"
},
"775": {
"value": "#ffc8ce",
- "description": "85.39022371000115 - 0.775",
- "type": "color"
+ "type": "color",
+ "description": "85.39022371000115 - 0.775"
},
"800": {
"value": "#ffd1d6",
- "description": "87.83813728906054 - 0.8",
- "type": "color"
+ "type": "color",
+ "description": "87.83813728906054 - 0.8"
},
"825": {
"value": "#ffdade",
- "description": "90.09900616327847 - 0.825",
- "type": "color"
+ "type": "color",
+ "description": "90.09900616327847 - 0.825"
},
"850": {
"value": "#ffe2e5",
- "description": "92.16274465706378 - 0.85",
- "type": "color"
+ "type": "color",
+ "description": "92.16274465706378 - 0.85"
},
"875": {
"value": "#ffe9eb",
- "description": "94.02048246917325 - 0.875",
- "type": "color"
+ "type": "color",
+ "description": "94.02048246917325 - 0.875"
},
"900": {
"value": "#ffeff0",
- "description": "95.66461936106825 - 0.9",
- "type": "color"
+ "type": "color",
+ "description": "95.66461936106825 - 0.9"
},
"925": {
"value": "#fff4f5",
- "description": "97.08887201491288 - 0.925",
- "type": "color"
+ "type": "color",
+ "description": "97.08887201491288 - 0.925"
},
"950": {
"value": "#fff9f9",
- "description": "98.28831277231767 - 0.95",
- "type": "color"
+ "type": "color",
+ "description": "98.28831277231767 - 0.95"
},
"975": {
"value": "#fffcfd",
- "description": "99.25940001499231 - 0.975",
- "type": "color"
+ "type": "color",
+ "description": "99.25940001499231 - 0.975"
},
"1000": {
"value": "#ffffff",
- "description": "100 - 1",
- "type": "color"
+ "type": "color",
+ "description": "100 - 1"
}
},
"Blue": {
"0": {
"value": "#000000",
- "description": "0 - 0",
- "type": "color"
+ "type": "color",
+ "description": "0 - 0"
},
"25": {
"value": "#00020f",
- "description": "0.7405999850077014 - 0.025",
- "type": "color"
+ "type": "color",
+ "description": "0.7405999850077014 - 0.025"
},
"50": {
"value": "#00051c",
- "description": "1.7116872276823336 - 0.05",
- "type": "color"
+ "type": "color",
+ "description": "1.7116872276823336 - 0.05"
},
"75": {
"value": "#000826",
- "description": "2.911127985087129 - 0.075",
- "type": "color"
+ "type": "color",
+ "description": "2.911127985087129 - 0.075"
},
"100": {
"value": "#000c30",
- "description": "4.335380638931743 - 0.1",
- "type": "color"
+ "type": "color",
+ "description": "4.335380638931743 - 0.1"
},
"125": {
"value": "#001038",
- "description": "5.979517530826747 - 0.125",
- "type": "color"
+ "type": "color",
+ "description": "5.979517530826747 - 0.125"
},
"150": {
"value": "#001441",
- "description": "7.837255342936205 - 0.15",
- "type": "color"
+ "type": "color",
+ "description": "7.837255342936205 - 0.15"
},
"175": {
"value": "#001749",
- "description": "9.90099383672154 - 0.175",
- "type": "color"
+ "type": "color",
+ "description": "9.90099383672154 - 0.175"
},
"200": {
"value": "#001b53",
- "description": "12.16186271093947 - 0.2",
- "type": "color"
+ "type": "color",
+ "description": "12.16186271093947 - 0.2"
},
"225": {
"value": "#00205e",
- "description": "14.609776289998841 - 0.225",
- "type": "color"
+ "type": "color",
+ "description": "14.609776289998841 - 0.225"
},
"250": {
"value": "#002569",
- "description": "17.233495705504463 - 0.25",
- "type": "color"
+ "type": "color",
+ "description": "17.233495705504463 - 0.25"
},
"275": {
"value": "#002a76",
- "description": "20.02069818761812 - 0.275",
- "type": "color"
+ "type": "color",
+ "description": "20.02069818761812 - 0.275"
},
"300": {
"value": "#003084",
- "description": "22.958053039032254 - 0.3",
- "type": "color"
+ "type": "color",
+ "description": "22.958053039032254 - 0.3"
},
"325": {
"value": "#003692",
- "description": "26.03130382315192 - 0.325",
- "type": "color"
+ "type": "color",
+ "description": "26.03130382315192 - 0.325"
},
"350": {
"value": "#003da1",
- "description": "29.22535625976699 - 0.35",
- "type": "color"
+ "type": "color",
+ "description": "29.22535625976699 - 0.35"
},
"375": {
"value": "#0044b2",
- "description": "32.524371286309126 - 0.375",
- "type": "color"
+ "type": "color",
+ "description": "32.524371286309126 - 0.375"
},
"400": {
"value": "#004bc2",
- "description": "35.91186271093947 - 0.4",
- "type": "color"
+ "type": "color",
+ "description": "35.91186271093947 - 0.4"
},
"425": {
"value": "#0053d4",
- "description": "39.37079885540354 - 0.425",
- "type": "color"
+ "type": "color",
+ "description": "39.37079885540354 - 0.425"
},
"450": {
"value": "#005ae6",
- "description": "42.88370756099135 - 0.45",
- "type": "color"
+ "type": "color",
+ "description": "42.88370756099135 - 0.45"
},
"475": {
"value": "#0062f9",
- "description": "46.43278391020581 - 0.475",
- "type": "color"
+ "type": "color",
+ "description": "46.43278391020581 - 0.475"
},
"500": {
"value": "#2a6cff",
- "description": "49.99999999999999 - 0.5",
- "type": "color"
+ "type": "color",
+ "description": "49.99999999999999 - 0.5"
},
"525": {
"value": "#4676ff",
- "description": "53.56721608979418 - 0.525",
- "type": "color"
+ "type": "color",
+ "description": "53.56721608979418 - 0.525"
},
"550": {
"value": "#5a81ff",
- "description": "57.11629243900867 - 0.55",
- "type": "color"
+ "type": "color",
+ "description": "57.11629243900867 - 0.55"
},
"575": {
"value": "#6b8bff",
- "description": "60.62920114459644 - 0.575",
- "type": "color"
+ "type": "color",
+ "description": "60.62920114459644 - 0.575"
},
"600": {
"value": "#7a95ff",
- "description": "64.08813728906053 - 0.6",
- "type": "color"
+ "type": "color",
+ "description": "64.08813728906053 - 0.6"
},
"625": {
"value": "#899fff",
- "description": "67.47562871369087 - 0.625",
- "type": "color"
+ "type": "color",
+ "description": "67.47562871369087 - 0.625"
},
"650": {
"value": "#96a8ff",
- "description": "70.774643740233 - 0.65",
- "type": "color"
+ "type": "color",
+ "description": "70.774643740233 - 0.65"
},
"675": {
"value": "#a2b2ff",
- "description": "73.96869617684807 - 0.675",
- "type": "color"
+ "type": "color",
+ "description": "73.96869617684807 - 0.675"
},
"700": {
"value": "#adbbff",
- "description": "77.04194696096773 - 0.7",
- "type": "color"
+ "type": "color",
+ "description": "77.04194696096773 - 0.7"
},
"725": {
"value": "#b8c3ff",
- "description": "79.97930181238189 - 0.725",
- "type": "color"
+ "type": "color",
+ "description": "79.97930181238189 - 0.725"
},
"750": {
"value": "#c2ccff",
- "description": "82.76650429449552 - 0.75",
- "type": "color"
+ "type": "color",
+ "description": "82.76650429449552 - 0.75"
},
"775": {
"value": "#ccd3ff",
- "description": "85.39022371000115 - 0.775",
- "type": "color"
+ "type": "color",
+ "description": "85.39022371000115 - 0.775"
},
"800": {
"value": "#d4dbff",
- "description": "87.83813728906054 - 0.8",
- "type": "color"
+ "type": "color",
+ "description": "87.83813728906054 - 0.8"
},
"825": {
"value": "#dce1ff",
- "description": "90.09900616327847 - 0.825",
- "type": "color"
+ "type": "color",
+ "description": "90.09900616327847 - 0.825"
},
"850": {
"value": "#e4e7ff",
- "description": "92.16274465706378 - 0.85",
- "type": "color"
+ "type": "color",
+ "description": "92.16274465706378 - 0.85"
},
"875": {
"value": "#eaedff",
- "description": "94.02048246917325 - 0.875",
- "type": "color"
+ "type": "color",
+ "description": "94.02048246917325 - 0.875"
},
"900": {
"value": "#f0f2ff",
- "description": "95.66461936106825 - 0.9",
- "type": "color"
+ "type": "color",
+ "description": "95.66461936106825 - 0.9"
},
"925": {
"value": "#f5f6ff",
- "description": "97.08887201491288 - 0.925",
- "type": "color"
+ "type": "color",
+ "description": "97.08887201491288 - 0.925"
},
"950": {
"value": "#f9faff",
- "description": "98.28831277231767 - 0.95",
- "type": "color"
+ "type": "color",
+ "description": "98.28831277231767 - 0.95"
},
"975": {
"value": "#fcfdff",
- "description": "99.25940001499231 - 0.975",
- "type": "color"
+ "type": "color",
+ "description": "99.25940001499231 - 0.975"
},
"1000": {
"value": "#ffffff",
- "description": "100 - 1",
- "type": "color"
+ "type": "color",
+ "description": "100 - 1"
}
},
"Purple": {
"0": {
"value": "#000000",
- "description": "0 - 0",
- "type": "color"
+ "type": "color",
+ "description": "0 - 0"
},
"25": {
"value": "#060011",
- "description": "0.7405999850077014 - 0.025",
- "type": "color"
+ "type": "color",
+ "description": "0.7405999850077014 - 0.025"
},
"50": {
"value": "#0e001e",
- "description": "1.7116872276823336 - 0.05",
- "type": "color"
+ "type": "color",
+ "description": "1.7116872276823336 - 0.05"
},
"75": {
"value": "#150029",
- "description": "2.911127985087129 - 0.075",
- "type": "color"
+ "type": "color",
+ "description": "2.911127985087129 - 0.075"
},
"100": {
"value": "#1b0033",
- "description": "4.335380638931743 - 0.1",
- "type": "color"
+ "type": "color",
+ "description": "4.335380638931743 - 0.1"
},
"125": {
"value": "#21003d",
- "description": "5.979517530826747 - 0.125",
- "type": "color"
+ "type": "color",
+ "description": "5.979517530826747 - 0.125"
},
"150": {
"value": "#270046",
- "description": "7.837255342936205 - 0.15",
- "type": "color"
+ "type": "color",
+ "description": "7.837255342936205 - 0.15"
},
"175": {
"value": "#2d004f",
- "description": "9.90099383672154 - 0.175",
- "type": "color"
+ "type": "color",
+ "description": "9.90099383672154 - 0.175"
},
"200": {
"value": "#330059",
- "description": "12.16186271093947 - 0.2",
- "type": "color"
+ "type": "color",
+ "description": "12.16186271093947 - 0.2"
},
"225": {
"value": "#3a0065",
- "description": "14.609776289998841 - 0.225",
- "type": "color"
+ "type": "color",
+ "description": "14.609776289998841 - 0.225"
},
"250": {
"value": "#420071",
- "description": "17.233495705504463 - 0.25",
- "type": "color"
+ "type": "color",
+ "description": "17.233495705504463 - 0.25"
},
"275": {
"value": "#4b007e",
- "description": "20.02069818761812 - 0.275",
- "type": "color"
+ "type": "color",
+ "description": "20.02069818761812 - 0.275"
},
"300": {
"value": "#54008d",
- "description": "22.958053039032254 - 0.3",
- "type": "color"
+ "type": "color",
+ "description": "22.958053039032254 - 0.3"
},
"325": {
"value": "#5d009c",
- "description": "26.03130382315192 - 0.325",
- "type": "color"
+ "type": "color",
+ "description": "26.03130382315192 - 0.325"
},
"350": {
"value": "#6800ad",
- "description": "29.22535625976699 - 0.35",
- "type": "color"
+ "type": "color",
+ "description": "29.22535625976699 - 0.35"
},
"375": {
"value": "#7200be",
- "description": "32.524371286309126 - 0.375",
- "type": "color"
+ "type": "color",
+ "description": "32.524371286309126 - 0.375"
},
"400": {
"value": "#7e00d0",
- "description": "35.91186271093947 - 0.4",
- "type": "color"
+ "type": "color",
+ "description": "35.91186271093947 - 0.4"
},
"425": {
"value": "#8a00e2",
- "description": "39.37079885540354 - 0.425",
- "type": "color"
+ "type": "color",
+ "description": "39.37079885540354 - 0.425"
},
"450": {
"value": "#9600f6",
- "description": "42.88370756099135 - 0.45",
- "type": "color"
+ "type": "color",
+ "description": "42.88370756099135 - 0.45"
},
"475": {
"value": "#9e22ff",
- "description": "46.43278391020581 - 0.475",
- "type": "color"
+ "type": "color",
+ "description": "46.43278391020581 - 0.475"
},
"500": {
"value": "#a23eff",
- "description": "49.99999999999999 - 0.5",
- "type": "color"
+ "type": "color",
+ "description": "49.99999999999999 - 0.5"
},
"525": {
"value": "#a752ff",
- "description": "53.56721608979418 - 0.525",
- "type": "color"
+ "type": "color",
+ "description": "53.56721608979418 - 0.525"
},
"550": {
"value": "#ac63ff",
- "description": "57.11629243900867 - 0.55",
- "type": "color"
+ "type": "color",
+ "description": "57.11629243900867 - 0.55"
},
"575": {
"value": "#b273ff",
- "description": "60.62920114459644 - 0.575",
- "type": "color"
+ "type": "color",
+ "description": "60.62920114459644 - 0.575"
},
"600": {
"value": "#b780ff",
- "description": "64.08813728906053 - 0.6",
- "type": "color"
+ "type": "color",
+ "description": "64.08813728906053 - 0.6"
},
"625": {
"value": "#bd8eff",
- "description": "67.47562871369087 - 0.625",
- "type": "color"
+ "type": "color",
+ "description": "67.47562871369087 - 0.625"
},
"650": {
"value": "#c39aff",
- "description": "70.774643740233 - 0.65",
- "type": "color"
+ "type": "color",
+ "description": "70.774643740233 - 0.65"
},
"675": {
"value": "#c9a5ff",
- "description": "73.96869617684807 - 0.675",
- "type": "color"
+ "type": "color",
+ "description": "73.96869617684807 - 0.675"
},
"700": {
"value": "#cfb0ff",
- "description": "77.04194696096773 - 0.7",
- "type": "color"
+ "type": "color",
+ "description": "77.04194696096773 - 0.7"
},
"725": {
"value": "#d4bbff",
- "description": "79.97930181238189 - 0.725",
- "type": "color"
+ "type": "color",
+ "description": "79.97930181238189 - 0.725"
},
"750": {
"value": "#dac4ff",
- "description": "82.76650429449552 - 0.75",
- "type": "color"
+ "type": "color",
+ "description": "82.76650429449552 - 0.75"
},
"775": {
"value": "#dfcdff",
- "description": "85.39022371000115 - 0.775",
- "type": "color"
+ "type": "color",
+ "description": "85.39022371000115 - 0.775"
},
"800": {
"value": "#e4d6ff",
- "description": "87.83813728906054 - 0.8",
- "type": "color"
+ "type": "color",
+ "description": "87.83813728906054 - 0.8"
},
"825": {
"value": "#e9ddff",
- "description": "90.09900616327847 - 0.825",
- "type": "color"
+ "type": "color",
+ "description": "90.09900616327847 - 0.825"
},
"850": {
"value": "#eee4ff",
- "description": "92.16274465706378 - 0.85",
- "type": "color"
+ "type": "color",
+ "description": "92.16274465706378 - 0.85"
},
"875": {
"value": "#f2ebff",
- "description": "94.02048246917325 - 0.875",
- "type": "color"
+ "type": "color",
+ "description": "94.02048246917325 - 0.875"
},
"900": {
"value": "#f5f0ff",
- "description": "95.66461936106825 - 0.9",
- "type": "color"
+ "type": "color",
+ "description": "95.66461936106825 - 0.9"
},
"925": {
"value": "#f8f5ff",
- "description": "97.08887201491288 - 0.925",
- "type": "color"
+ "type": "color",
+ "description": "97.08887201491288 - 0.925"
},
"950": {
"value": "#fbf9ff",
- "description": "98.28831277231767 - 0.95",
- "type": "color"
+ "type": "color",
+ "description": "98.28831277231767 - 0.95"
},
"975": {
"value": "#fdfcff",
- "description": "99.25940001499231 - 0.975",
- "type": "color"
+ "type": "color",
+ "description": "99.25940001499231 - 0.975"
},
"1000": {
"value": "#ffffff",
- "description": "100 - 1",
- "type": "color"
+ "type": "color",
+ "description": "100 - 1"
}
},
"OpaqueGrey": {
"Default": {
"value": "#7c7c7c20",
- "description": "An opaque grey that picks up some, but not all, of the colors behind it",
+ "type": "color",
+ "description": "An opaque grey that picks up some, but not all, of the colors behind it"
+ }
+ },
+ "Gray": {
+ "25": {
+ "value": "#fcfcfd",
+ "type": "color"
+ },
+ "50": {
+ "value": "#f9fafb",
+ "type": "color"
+ },
+ "100": {
+ "value": "#f2f4f7",
+ "type": "color"
+ },
+ "200": {
+ "value": "#eaecf0",
+ "type": "color"
+ },
+ "300": {
+ "value": "#d0d5dd",
+ "type": "color"
+ },
+ "400": {
+ "value": "#98a2b3",
+ "type": "color"
+ },
+ "500": {
+ "value": "#667085",
+ "type": "color"
+ },
+ "600": {
+ "value": "#475467",
+ "type": "color"
+ },
+ "700": {
+ "value": "#344054",
+ "type": "color"
+ },
+ "800": {
+ "value": "#1d2939",
+ "type": "color"
+ },
+ "900": {
+ "value": "#101828",
+ "type": "color"
+ }
+ },
+ "White": {
+ "value": "#ffffff",
+ "type": "color"
+ },
+ "Black": {
+ "value": "#000000",
+ "type": "color"
+ },
+ "Primary": {
+ "25": {
+ "value": "#f6fcfe",
+ "type": "color"
+ },
+ "50": {
+ "value": "#dceffc",
+ "type": "color"
+ },
+ "100": {
+ "value": "#c1dcf9",
+ "type": "color"
+ },
+ "200": {
+ "value": "#a7c3f6",
+ "type": "color"
+ },
+ "300": {
+ "value": "#8da4f4",
+ "type": "color"
+ },
+ "400": {
+ "value": "#6178f4",
+ "type": "color"
+ },
+ "500": {
+ "value": "#4c4ff1",
+ "type": "color"
+ },
+ "600": {
+ "value": "#4e38ed",
+ "type": "color"
+ },
+ "700": {
+ "value": "#5724e8",
+ "type": "color"
+ },
+ "800": {
+ "value": "#441bb6",
+ "type": "color"
+ },
+ "900": {
+ "value": "#301383",
+ "type": "color"
+ },
+ "Default": {
+ "value": "#4e38ed",
+ "type": "color"
+ },
+ "Hover": {
+ "value": "#eaecf0",
+ "type": "color"
+ }
+ },
+ "Warning": {
+ "25": {
+ "value": "#fffcf5",
+ "type": "color"
+ },
+ "50": {
+ "value": "#fffaeb",
+ "type": "color"
+ },
+ "100": {
+ "value": "#fef0c7",
+ "type": "color"
+ },
+ "200": {
+ "value": "#fedf89",
+ "type": "color"
+ },
+ "300": {
+ "value": "#fec84b",
+ "type": "color"
+ },
+ "400": {
+ "value": "#fdb022",
+ "type": "color"
+ },
+ "500": {
+ "value": "#f79009",
+ "type": "color"
+ },
+ "600": {
+ "value": "#dc6803",
+ "type": "color"
+ },
+ "700": {
+ "value": "#b54708",
+ "type": "color"
+ }
+ },
+ "Error": {
+ "25": {
+ "value": "#fffbfa",
+ "type": "color"
+ },
+ "50": {
+ "value": "#fef3f2",
+ "type": "color"
+ },
+ "100": {
+ "value": "#fee4ef",
+ "type": "color"
+ },
+ "200": {
+ "value": "#fecdca",
+ "type": "color"
+ },
+ "300": {
+ "value": "#fda29b",
+ "type": "color"
+ },
+ "400": {
+ "value": "#f97066",
+ "type": "color"
+ },
+ "500": {
+ "value": "#f04438",
+ "type": "color"
+ },
+ "600": {
+ "value": "#d92d20",
+ "type": "color"
+ },
+ "700": {
+ "value": "#b42318",
+ "type": "color"
+ }
+ },
+ "Success": {
+ "25": {
+ "value": "#f6fef9",
+ "type": "color"
+ },
+ "50": {
+ "value": "#ecfdf3",
+ "type": "color"
+ },
+ "100": {
+ "value": "#d1fadf",
+ "type": "color"
+ },
+ "200": {
+ "value": "#a6f4c5",
+ "type": "color"
+ },
+ "300": {
+ "value": "#6ce9a6",
+ "type": "color"
+ },
+ "400": {
+ "value": "#32d583",
+ "type": "color"
+ },
+ "500": {
+ "value": "#12b76a",
+ "type": "color"
+ },
+ "600": {
+ "value": "#039855",
+ "type": "color"
+ },
+ "700": {
+ "value": "#027a48",
+ "type": "color"
+ }
+ },
+ "Pink": {
+ "700": {
+ "value": "#c11574",
+ "type": "color"
+ }
+ },
+ "Text": {
+ "Primary": {
+ "value": "#101828",
+ "type": "color"
+ },
+ "Secondary": {
+ "value": "#667085",
"type": "color"
}
}
@@ -1175,8 +1418,8 @@
"lineHeight": "12px",
"letterSpacing": "-0.12px"
},
- "description": "",
- "type": "typography"
+ "type": "typography",
+ "description": ""
},
"200": {
"value": {
@@ -1186,8 +1429,8 @@
"lineHeight": "16px",
"letterSpacing": "-0.15px"
},
- "description": "",
- "type": "typography"
+ "type": "typography",
+ "description": ""
}
},
"Shadow": {
@@ -1199,8 +1442,8 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
},
"200": {
"value": {
@@ -1210,8 +1453,8 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
},
"300": {
"value": {
@@ -1221,8 +1464,8 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
},
"400": {
"value": {
@@ -1232,8 +1475,8 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
},
"500": {
"value": {
@@ -1243,8 +1486,8 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
},
"600": {
"value": {
@@ -1254,8 +1497,8 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
},
"700": {
"value": {
@@ -1265,8 +1508,8 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
},
"800": {
"value": {
@@ -1276,8 +1519,8 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
},
"900": {
"value": {
@@ -1287,8 +1530,8 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
},
"1000": {
"value": {
@@ -1298,98 +1541,102 @@
"spread": "0px",
"color": "rgba(0, 0, 0, .2)"
},
- "description": "",
- "type": "boxShadow"
+ "type": "boxShadow",
+ "description": ""
}
},
"Radius": {
"0": {
"value": "0",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"100": {
"value": "2",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"200": {
"value": "6",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"300": {
"value": "14",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"400": {
"value": "30",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"500": {
"value": "62",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
}
},
"Spacing": {
"0": {
"value": "0",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"100": {
"value": "2",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"200": {
"value": "4",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"300": {
"value": "8",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"400": {
"value": "12",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"500": {
"value": "16",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"600": {
"value": "32",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"700": {
"value": "48",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"800": {
"value": "64",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"900": {
"value": "96",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
},
"1000": {
"value": "128",
- "description": "",
- "type": "dimension"
+ "type": "dimension",
+ "description": ""
}
}
+ },
+ "$themes": [],
+ "$metadata": {
+ "tokenSetOrder": ["Alias", "Global"]
}
}
diff --git a/crates/re_ui/data/icons/gear.png b/crates/re_ui/data/icons/gear.png
new file mode 100644
index 0000000000000000000000000000000000000000..24f732003b8d8b425e9d6754b22f22fbc88007c0
GIT binary patch
literal 612
zcmV-q0-ODbP)nuv*lAcCD1R)P}0QluAlizKE=JjZvQTpu$}#6`UDV|UNY+`D()
z%z4f|fG7d)z-|I+rG+Ta3jTu~upzdkwH2bkn3B~REhBC0w#m5g1DFO4pb{*D94Jc6
z&4aJt5oiQ6T3eS^fXV)Vzu+G@)8|{y+$oLa)Xh2g4OT+QXZ51c2fbi#rD|dW1|mi;fT>*N$WRSJ^1OO
zZMOPlbZEhriyo8>KFBqV^Z6X<`>Kl$fDImyO^tWhfnJH(KzB^UqxsQA`#$7J9!IBg
zbz70=oEPoH-Tk7m!+qzm@^)3`b!V%*{tGU$gHX^$=G}FBVUE_&0vZ(`(zzzm$Y^L&
zp1HBv#fC_Oq){%X{Gm&$rRCCkX~DE&T5>)yuSmt2jFwJopVrz;S^-~-s~dZ|>ZHBC
yZ8BfP7l^OPkRh8ligt0000Or?sV@}5Kw4XL
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
&LlWKe6wS2bXPP~
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
literal 12227
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
diff --git a/crates/re_ui/data/logo_light_mode.png b/crates/re_ui/data/logo_light_mode.png
index 4675fec247da1f3ab73d8b0886da2ecc18b333fb..1b951089cf2a6bb35d753d2bba96ef226cf01134 100644
GIT binary patch
literal 4402
zcmV-25zX$2P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H15Wh)8
zK~#90?VWpcT-9}lzkOz8*|PC7){KP#TN=rL3oEGuEDT8vX#$j&aT$$`F$)q*C?N#e
z6xxQh>ZF8{0*l3?1QHTjjIl<;!-a%bmK_I76CgA|u))?yKmchZWBit_$DG|iWD_CF
z8d-DCy;p|sFYC^o-`;a)`_8%N?7ffhDI__wZ4A4+XBd%6kSc*n3snXgr|5WKBuE)O
z|Ly>G0Na3VBDzD7Z9pTcZ;6%lNPa_I9?
z9-G+#yau|`!m1tY_}x?4>JE=>c+No^0P`!Gzo^FiE$BRungCqbh4O+L{gvjmF4I);
zrvQ8?$UzkVsmhHtnC{C!&IgVN+Mixnh1IA&pd%xXWY(7N2-=~&4Eq2`qLE0V^-P6t
z0beEjpJ^xPBPMTdUH*3L^`M;z`^DNX$(d_Mn2w2;qVkUj(}MPA2q^G4R)3gon(}f`
zP7J#MSb~~$iM9&_{XS3`v_IaUPzt8a|G;J4*r6#%t~*3$&N1^A1geQ|&aER(!^
zclq0~R=YdA}&<1?@|K>_+73bVKZ3R|Y~E0IBNcqfqk*a8%H~
zgaXw^t(Ja0(=>6b*V4vo!D5+T-EuK%Ug5JZ|IdibGt%|qg6XZtdMzEI08pu|Zn;@i
z?gvH%?M>(qona&TLTyd!UwbO+rPxqOq7jp5y%+dK(7p@fds(1MB5!G
z^MkN`5Mn?cNG4kTYAA2^eGHJQZv7^z_xNr1Q@~b>&dy|~tUHi5`5FMpnwH~@mFIv`
zKkXg>-M|OH7GNhzI{=1pD5F)GAi|U&9W21Q_I7*R6U`OvgMCBPr8m7vCR!#ND-RQ%
zFTYbnUqV@F)x4_F?l&ilsc8DiE7CR4n-(TEjqSFbGsKu96?-CTPDONvUrra`=+R~7
zP7Yu`#iu)fN^PR`8R<#c3Xo?}!mQaI5I&Ek*?
z)7jXvL7nN^6$r)eegh)6+I&f!iv^Y5q$)SoXrz0ws9X+=acOG+c3>m3(oK^$6gts)
z04z+rKee0aT41beTmA5c3O8y)tlp30ir$=e