-
Notifications
You must be signed in to change notification settings - Fork 333
Feature/voxel annotation #858
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
|
Can you complete the CLA? |
|
The brush hover outline (circle where the mouse pointer is) seems to go away in some cases when changing the zoom level. |
2d5359d to
9d15526
Compare
|
|
- Introduced a new dummy `MultiscaleVolumeChunkSource`. - Added `VoxelAnnotationRenderLayer` for voxel annotation rendering. - Implemented `VoxUserLayer` with dummy data source and rendering. - Added tools and logs for voxel layer interactions and debugging. - Documented voxel annotation specification and implementation details.
- Added a backend `VoxDummyChunkSource` that generates a checkerboard pattern for voxel annotations. - Implemented frontend `VoxDummyChunkSource` with RPC pairing to the backend. - Updated documentation with details on chunk source architecture and implementation.
…t seems there is some fighting.
…s to corruped the chunk after the usage of the tool. Added a front end buffer which is the only drawing storage for now. Added user settings to set the voxel_annotation layer scale and bounds. Added a second empty source to DummyMultiscaleVolumeChunkSource to prevent crashs when zoomed out too much
…lobal one (there where a missing convertion) ; add a primitive brush tool
…umeChunkSource and update related imports
…panded brush settings
…ation, and improved backend edit handling
…map options and UI settings
…r remote workflows, label creation, and new drawing tools
…ependency for coverage ; fix out-of-bounds check in applyEdits
…tie break to mode selection logic in downsampling
…xelEditController`
|
I currently see two paths to solve this security flaw:
I think option 2 is better as it reduces dependency on specific external systems, but we can still search for other alternatives. |
Yes, I think only prompting when there is actually a write action is a good idea. I'm not sure that "do not ask again for this datasource" is a good idea because users will be tempted to use it for convenience but that effectively means: "allow anyone to trick me into corrupting this datasource". In particular, just because I have edited one datasource in Neuroglancer doesn't mean I want some random link sent to me to also accidentally edit it. One possibility would be to key any persistent allowlist on the entire Neuroglancer state, i.e. a set of Potentially we could improve on this by having some mechanism to say: "allow writing to this datasource for any link created by this user". That would require some way to sign the Neuroglancer state with a per-user private key. The private key could just be generated by Neuroglancer and stored in browser local storage, though it might be better if it was tied to some signin mechanism so that it could be shared across browser profiles and machines. In any case these strategies add a lot of complexity so as a starting point we can just always prompt on first write to a datasource.
|
… setVoxelPaintValue and transformGlobalToVoxelNormal
…BrushWithShape in VoxelEditController
…s and refactor controller access
…ne... NixOS is *sometimes* a *bit* annoying
…s for Zarr pipelines
…cking mechanism for the preview renderlayer instead of recreating it in the VoxelEditContext
| }, | ||
| ); | ||
|
|
||
| export async function proxyWrite( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this function is currently unused. It was required for the dataset creation feature, which has been removed from this PR.
…ucture, and enforce controller checks
…odFillPlane2D and related methods, update tests accordingly
…oss codebase to enhance clarity and consistency
This Draft Pull Request introduces an interactive voxel annotation feature, allowing users to perform manual segmentation by painting directly onto volumetric layers. This implementation is based on the proposal in Issue #851 and incorporates the feedback from @jbms.
Key Changes & Architectural Overview
Following the discussion, this implementation has been significantly revised from the initial prototype:
voxlayer type, the voxel editing functionality is now integrated directly intoImageUserLayerandSegmentationUserLayervia aUserLayerWithVoxelEditingMixin. This mixin adds a new "Draw" tab in the UI.New Tool System: The Brush and Flood Fill tools are implemented as toggleable LayerTools, while the Picker tool is a one-shot tool. All integrate with Neuroglancer's new tool system. The drawing action is bound to Ctrl + Left Click.
Optimistic Preview for Compressed Chunks: To provide immediate visual feedback and solve the performance problem with compressed chunks, edits are now rendered through an optimistic preview layer.
InMemoryVolumeChunkSource.RenderLayer(e.g.,ImageRenderLayerorSegmentationRenderLayer). This ensures the preview perfectly matches the user's existing shader and display settings.Data-flow
sequenceDiagram participant User participant Tool as VoxelBrushTool participant ControllerFE as VoxelEditController (FE) participant EditSourceFE as OverlayChunkSource (FE) participant BaseSourceFE as VolumeChunkSource (FE) participant ControllerBE as VoxelEditController (BE) participant BaseSourceBE as VolumeChunkSource (BE) User->>Tool: Mouse Down/Drag Tool->>ControllerFE: paintBrushWithShape(mouse, ...) ControllerFE->>ControllerFE: Calculates affected voxels and chunks ControllerFE->>EditSourceFE: applyLocalEdits(chunkKeys, ...) activate EditSourceFE EditSourceFE->>EditSourceFE: Modifies its own in-memory chunk data note over EditSourceFE: This chunk's texture is re-uploaded to the GPU deactivate EditSourceFE ControllerFE->>ControllerBE: commitEdits(edits, ...) [RPC] activate ControllerBE ControllerBE->>ControllerBE: Debounces and batches edits ControllerBE->>BaseSourceBE: applyEdits(chunkKeys, ...) activate BaseSourceBE BaseSourceBE-->>ControllerBE: Returns VoxelChange (for undo stack) deactivate BaseSourceBE ControllerBE->>ControllerFE: callChunkReload(chunkKeys) [RPC] activate ControllerFE ControllerFE->>BaseSourceFE: invalidateChunks(chunkKeys) note over BaseSourceFE: BaseSourceFE re-fetches chunk with the now-permanent edit. ControllerFE->>EditSourceFE: clearOptimisticChunk(chunkKeys) deactivate ControllerFE ControllerBE->>ControllerBE: Pushes change to Undo Stack & enqueues for downsampling deactivate ControllerBE loop Downsampling & Reload Cascade ControllerBE->>ControllerBE: downsampleStep(chunkKeys) ControllerBE->>ControllerFE: callChunkReload(chunkKeys) [RPC] activate ControllerFE ControllerFE->>BaseSourceFE: invalidateChunks(chunkKeys) note over BaseSourceFE: BaseSourceFE re-fetches chunk with the now-permanent edit. ControllerFE->>EditSourceFE: clearOptimisticChunk(chunkKeys) deactivate ControllerFE end5. Dataset creation To complete Neuroglancer's writing capabilities, a dataset metadata creation/initialization feature was introduced.The workflow is triggered when a user provides a URL to a data source that does not resolve:Neuroglancer recognizes the potential intent to create a new dataset and prompts the user:Finally, the user is able to access dataset creation form:Data sources & Kvstores
Currently, there is a very limited set of supported data sources and kvstores, which are:
opfs: in-browser storage, also used for local development at some point, the relevancy can be discussed.ssa+https: a kvstore linked to an in development project, which is a stateless (thanks to OAuth 2.0) worker providing signed urls to read/write in s3 storesThis lack of support is the first limitation of the current implementation.
Open Questions & Future Work
This PR focuses on establishing the core architecture. Several larger topics from the original discussion are noted here as future work:
Checklist
[ ] Added support to more (every?) datasources and kvstoresEdits