|
| 1 | +--- |
| 2 | +title: Open any file |
| 3 | +order: -10 |
| 4 | +--- |
| 5 | + |
| 6 | +The Rerun Viewer has built-in support for opening many kinds of files, and can be extended to open any other file type without needing to modify the Rerun codebase itself. |
| 7 | + |
| 8 | +The viewer can load files in 3 different ways: |
| 9 | +- via CLI arguments (e.g. `rerun myfile.jpeg`), |
| 10 | +- using drag-and-drop, |
| 11 | +- using the open dialog in the Rerun Viewer. |
| 12 | + |
| 13 | +All these file loading methods support loading a single file, many files at once (e.g. `rerun myfiles/*`), or even folders. |
| 14 | + |
| 15 | +⚠ Drag-and-drop of folders does [not yet work](https://github.com/rerun-io/rerun/issues/4528) on the web version of the Rerun Viewer ⚠ |
| 16 | + |
| 17 | +The following file types have built-in support in the Rerun Viewer: |
| 18 | +- Native Rerun files: `rrd` |
| 19 | +- 3D models: `gltf`, `glb`, `obj` |
| 20 | +- Images: `avif`, `bmp`, `dds`, `exr`, `farbfeld`, `ff`, `gif`, `hdr`, `ico`, `jpeg`, `jpg`, `pam`, `pbm`, `pgm`, `png`, `ppm`, `tga`, `tif`, `tiff`, `webp`. |
| 21 | +- Point clouds: `ply`. |
| 22 | +- Text files: `md`, `txt`. |
| 23 | + |
| 24 | +With the exception of `rrd` files that can be streamed from an HTTP URL (e.g. `rerun https://demo.rerun.io/version/latest/examples/dna/data.rrd`), we only support loading files from the local filesystem for now, with [plans to make this generic over any URI and protocol in the future](https://github.com/rerun-io/rerun/issues/4525). |
| 25 | + |
| 26 | +## Adding support for arbitrary filetypes |
| 27 | + |
| 28 | +Internally, the [`DataLoader`](https://docs.rs/re_data_source/latest/re_data_source/trait.DataLoader.html?speculative-link) trait takes care of loading files into the Viewer. |
| 29 | + |
| 30 | +There are 3 broad kinds of `DataLoader`s: _builtin_, _external_ and _custom_. |
| 31 | +_External_ and _custom_ are the two ways of extending the file loading system that we'll describe below. |
| 32 | + |
| 33 | +When a user attempts to open a file in the Viewer, **all** known `DataLoader`s are notified of the path to be opened, unconditionally. |
| 34 | +This gives `DataLoader`s maximum flexibility to decide what files they are interested in, as opposed to e.g. only being able to look at a file's extension. |
| 35 | + |
| 36 | +Once notified, a `DataLoader` can return a [`DataLoaderError::Incompatible`](https://docs.rs/re_data_source/latest/re_data_source/enum.DataLoaderError.html?speculative-link#variant.Incompatible) error to indicate that it doesn't support a given file type. |
| 37 | +If, and only if, all loaders known to the Viewer return an `Incompatible` error code, then an error message is shown to the user indicating that this file type is not (_yet_) supported. |
| 38 | + |
| 39 | +In these instances of unsupported files, we expose two ways of implementing and registering your `DataLoader`s, explained below. |
| 40 | + |
| 41 | +### External data-loaders |
| 42 | + |
| 43 | +The easiest way to create your own `DataLoader` is by implementing what we call an "external loader": a stand alone executable written in any language that the Rerun SDK ships for. Any executable on your `$PATH` with a name that starts with `rerun-loader-` will be treated as a `DataLoader`. |
| 44 | + |
| 45 | +This executable takes a file path as input on `stdin` and outputs Rerun logs on `stdout`. |
| 46 | +It will be called by the Rerun Viewer when the user opens a file, and be passed the path to that file. |
| 47 | +From there, it can log data as usual, using the [`stdout` logging sink](../reference/sdk-operating-modes?speculative-link#standard-inputoutput). |
| 48 | + |
| 49 | +The Rerun Viewer will then automatically load the data streamed to the external loader's standard output. |
| 50 | + |
| 51 | +Like any other `DataLoader`, an external loader will be notified of all file openings, unconditionally. |
| 52 | +To indicate that it does not support a given file, the loader has to exit with a [dedicated status code](https://docs.rs/rerun/latest/rerun/constant.EXTERNAL_DATA_LOADER_INCOMPATIBLE_EXIT_CODE.html?speculative-link). |
| 53 | + |
| 54 | +Check out our examples for [C++](https://github.com/rerun-io/rerun/tree/main/examples/cpp/external_data_loader), [Python](https://github.com/rerun-io/rerun/tree/main/examples/python/external_data_loader) and [Rust](https://github.com/rerun-io/rerun/tree/main/examples/rust/external_data_loader) that cover every steps in details. |
| 55 | + |
| 56 | +### Custom data-loaders |
| 57 | + |
| 58 | +Another Rust-specific approach is to implement the `DataLoader` trait yourself and register it in the Rerun Viewer. |
| 59 | + |
| 60 | +To do so, you'll need to import `rerun` as a library, register your `DataLoader` and then start the viewer from code. |
| 61 | + |
| 62 | +Check out our [example](https://github.com/rerun-io/rerun/tree/main/examples/rust/custom_data_loader) that cover all these steps in details. |
0 commit comments