
CORE
Jonathan Lurie - MCIN - June 2018
Jonathan Lurie - MCIN - June 2018
What is QVC ?

- a toolkit to display brain volumes
- an API, not a web app
- client side
- easy to integrate (only a few lines of JS)
- a Javascript bundle, MIT licensed
- a Github repo
- a npm package
Jonathan Lurie - MCIN - June 2018
What is it made of ?






more code
(~1800 lines)
QVC
+
+
=
Jonathan Lurie - MCIN - June 2018
Features

Jonathan Lurie - MCIN - June 2018
Features world coordinates

Jonathan Lurie - MCIN - June 2018
Features rotation/translation

Jonathan Lurie - MCIN - June 2018
Features colormaps

Jonathan Lurie - MCIN - June 2018
Features dual volume & blending

Jonathan Lurie - MCIN - June 2018
Features time series

Jonathan Lurie - MCIN - June 2018
Features multi-camera

Jonathan Lurie - MCIN - June 2018
Architecture

Jonathan Lurie - MCIN - June 2018
Architecture global


Jonathan Lurie - MCIN - June 2018
Architecture QuickvoxelCore

let canvas = document.getElementById("renderCanvas")
let qvc = new quickvoxelcore.QuickvoxelCore( canvas )- Entry point
- Just needs to know
in what canvas to display
Internally:
- Initializes the other objects
- Creates some events to sync data and view
Jonathan Lurie - MCIN - June 2018
Architecture VolumeCollection

// ...
let qvc = new quickvoxelcore.QuickvoxelCore( canvas )
let volumeCollection = qvc.getVolumeCollection()- Created by the QuickvoxelCore instance
- In charge of loading new volumes
- from URL
- from local files
- Provides events to deal with volume lifecycle
Internally:
- Leverages Pixpipe to decode volume files
- Adds volume to a collection with unique ID
Jonathan Lurie - MCIN - June 2018
Architecture Volume

- Created by the VolumeCollection
- Not supposed to be accessible
Internally:
- Creates a WebGL2 3D texture
- Computes the world-to-shader matrix
Jonathan Lurie - MCIN - June 2018
Architecture CameraCrew

- Created by the QuickvoxelCore instance
- Provides functions to:
- change the camera
- modify the zoom
- tilt (change up vector)
- translate
// ...
let qvc = new quickvoxelcore.QuickvoxelCore( canvas )
let camcrew = qvc.getCameraCrew()Internally:
- sync with the ortho planes rotation
Jonathan Lurie - MCIN - June 2018
Architecture RenderEngine

- Created by the QuickvoxelCore instance
- Provides functions to:
- display a volume from the collection
- modify volume brightness/contrast/colormap
- translate/rotate ortho planes
// ...
let qvc = new quickvoxelcore.QuickvoxelCore( canvas )
let renderEngine = qvc.getRenderEngine()Internally:
- implements the volume slot logic
- dispatches events
Jonathan Lurie - MCIN - June 2018
Volume slots

TECH POINT
Jonathan Lurie - MCIN - June 2018
Volume slots

Implemented by the RenderEngine,
in sync with GPU

←sync
sync→
Jonathan Lurie - MCIN - June 2018
Volume slots

- The volume is never modified by the CPU (would be very slow!)
- The GPU does the rendering job
- With the info given by the CPU (uniforms)
- Only when we need
- Only the part to display (texels laying on the ortho-planes)
- Applies brightness/contrast/color on the fly, 60 times/sec
In addition to perform the voxel lookup for world coordinates
Jonathan Lurie - MCIN - June 2018
Minimal code

TECH POINT
Jonathan Lurie - MCIN - June 2018
Minimal code

Here is the shortest bit of code necessary for Quickvoxel Core integration
let canvas = document.getElementById("renderCanvas")
// the QuickvoxelCore instance is the entry point
let qvc = new quickvoxelcore.QuickvoxelCore( canvas );
// for future access to the volume collection
let volumeCollection = qvc.getVolumeCollection();
// for future access the render engine
let renderEngine = qvc.getRenderEngine();
// we want to load a NIfTI file using its local URL
volumeCollection.addVolumeFromUrl( "../data/structural.nii.gz" );
// mount the volume when it's loaded and ready!
volumeCollection.on("volumeReady", function(volume){
let couldMount = renderEngine.mountVolumeOnFirstEmptySlot( volume )
if( !couldMount ){
console.log("All volume slots are already taken on the render engine.");
}
})Jonathan Lurie - MCIN - June 2018
Minimal code

Jonathan Lurie - MCIN - June 2018
Larger project

DEMO
Jonathan Lurie - MCIN - June 2018
TODO

- Add split view (almost done)
- Add raycasting to get volume values (in progress)
- Add a third volume slot dedicated to masking
- Add mesh display and mesh collection
- Add point clouds display and point cloud collection
Thanks!

Jonathan Lurie - MCIN - June 2018
I usually give feature updates on twitter @jonathanlurie
Quickvoxel Core
By jonathanlurie
Quickvoxel Core
General introduction to Quickvoxel Core
- 752