Fixed shiny callback when electrode contacts are double-clicked
Fixed contact-switching and highlight box
Added PMT electrodes
Fixed non-integer search radius issue
Adjust electrode position can be done under volume-mode to improve
user experience
Electrodes with prototype geometries will use the prototype to infer
the locations rather than spacial calculation
Added keyboard shortcut for registering from cross-hair
Added get_atlas_values for continuous atlases such as
binary or probabilistic ROI
The radius refers to maximum RAS distance instead of
voxel indexing distance, hence more accurate when the atlas
volume has imbalanced slice count
Renamed active-voxel to column-row-slice
but still keep the naming for backward compatibility
Voxel filter is linear now when displayed at side
slices only and when the slice mode is not
active-voxel
Fixed drifting issue when visualizing via active voxel
mode
Added direction arrow helper to DBS (or electrodes with
non-zero model up vectors)
Support WebAssembly
Avoid using pandoc to save the whole page
self-contained
Fixed the depth issue in electrode material shader
Set maximum render length cut-off for electrode prototypes
Added model tangent (usually the direction) to electrode shader so
outlines are correctly visualized
Fixed electrode prototype rendering issue (color) on Windows
Fixed the color map for discrete values
Setting electrode prototype render order to be -500 so
it does not hide behind the transparent surfaces
Plotting electrodes on slices now takes numerical
adjust_brightness interpreted as quantile
Changed default color palette for discrete values, removed colors
that are too dark or gray
Change CT threshold back to positive (3000) when
switching from DBS leads back to sEEG
leads.
Support drag and drop annotation files
Changed electrode material to display front-side only instead of
double side to avoid overlapping contacts visually when spacing is
small
Added Abbott segmented electrodes
6170-6173, with segmented electrodes clockwise viewing from
proximal end
Fixed a bug that may change electrode coordinate hand
All the DBS electrode prototype maker uses natural
cos for x and sin for
y. However, this will cause electrodes to rely on rendering
on back side (material)
Added missing prototype
Fixed BSC and Medtronic electrode
orientation (now is counter-clockwise when viewing from
proximal end)
Added more spacing for DBS segmented contacts
added prototypes for Medtronic segmented
electrodes
Added BSC-DB electrodes for 22022201
Added internal test code for depth mapping
Surface mapping has been implemented for depth electrodes, with
dynamic offset threshold
surface_offset has been added to electrode field
cvs_avg35_inMNI152 has the correct talXFM
(scanner to MNI305) now
Added load_mesh to surface object so users can load
surface mesh for computation in R
Added internal calculate_distances to compute the
distances from a point to its projection to a list of mesh
DistanceShifted in electrode table is taken into
account and will be passed to electrode instances
Inflated surfaces have offset by default
Fixed a singular matrix bug when the electrode prototype
up vector is zero or is parallel with the model
direction
Allowed the surface mapped electrodes to be snapped to the surface
if the surface world matrix is not identity
Force the inflated brain to have offset positions
Added DBS electrode prototype
BSC-DB-2202
Prototype set_transform_from_points now tries to set
rotation from transform Euler angle when the prototype
guided marker is 1-ranked (electrode strip, DBS
electrodes)
Allowed electrode prototype to display markers; added viewer options
for localization
Changed electrode direction helper to be displayed inside of
cross-hair group
Allowed side panel to be displayed with atlas column-row-slice
Added controller to display symmetric continuous color map for
volumes
Fixed the GLTF not showing inner-most contact
issue
Removed devel version of ravetools from
check
Update Github action check script
Added rhub check
Plotting slices have correct margins with partial plot
Allow users to drag and drop value tables
Allow users to hide cross-hairs
Allow shiny app to change current color map via
proxy
Allows drag-drop electrode color files
Added set_electrode_data to brain proxy class, allowing
shiny applications to change the electrode data, set color
palettes, and set value ranges in the same call
Allow masks to be added to T1
Added D99v2 for monkey brain
Export GLTF for datacube2
Fixed fix_electrode_color bug
Supported ISO surface generation from volume
Added white-matter segmentation as default atlas if user has this
file
Exporting GLTF is wrapped with try-catch
fix_electrode_color is exclusive by default
fixed color fixing issue for naive sphere electrodes
Changed logo message
Using better RAVE logo and fixed style issues
Changed shortcut p to toggling the visibility and
shift+p to switching surface types
Added logo to control panel to advertise the project
Added export GLTF binary format
Separate 3D and 2D canvas;
Converts *h.pial.gii to FreeSurfer format
when the files are missing
Allow electrode depth test to be disabled (always-depth) on contact
and/or outlines
Fixing the vertex shader output not read by fragment shader
issue
Drop-in feature support color-map for volume and surfaces
Added contact order to display when electrode is clicked
Added DIXI (AM, BM,
CM) electrode specifications
threeBrain 1.1.0
Major Changes
threejs engine is upgraded to v160; added
support for NIfTI and GIfTI images
Allowed data to be embedded with viewer as dataURI.
This results in a truly standalone viewer: no extra engine required,
only web-browser is needed.
Added electrode geometry prototype, allowing users to see the
electrode rather than using spheres, useful for electrodes with super
micro contacts or electrodes with segmented contact like
DBS
Added support for showing (cortical or sub-cortical)
ROI surfaces
Implemented drag-and-drop feature to drop arbitrary volume
(nii,mgz) or surface (fs,gii) files to the
viewer. The surface coordinate system is inferred from file name
following BIDS convention. The surface color can be set via
a color-map (csv) or in the file name
Implemented slice (in side viewer) overlay
Users can control side camera frustums (near and far)
separately
Implemented worker system so the viewer can run truly parallel code
in the background
Added snap-to-electrode and line-of-sight
mode in addition to canonical anatomical slices.
Under line-of-sight mode, the underlay image will be
sliced dynamically with a plane orthogonal to the line of sight; two
other (orthogonal) planes parallel to the line of sight
Under snap-to-electrode, the volume slices will be
snapped to electrode direction (only available when electrode prototype
is used and electrode direction defined). The other two planes will
dynamically slice the MRI
Users can localize an electrode probe by clicking on the target
location, then entry location
Added an option to add QR code to the viewer, allowing
people to link to the publication
Loading progress is more informative now
Implemented plot_slices to allow plotting
MRI slices for each contact in canonical order
Users can set default colors to electrodes via
brain$electrodes$fix_electrode_color
Users can override underlay images by placing
rave_slices.nii[.gz] under the mri/ in
FreeSurfer folder
File/Data loaders use JavaScript workers now (can be
disabled with enable_cache=TRUE)
Added mesh clipping to see depth electrodes without compromising
color
Implemented volume clipping
Added new mode for ACPC alignment
Added target flag so objects can be rendered
differently on main canvas versus side canvas
Minor changes
Electrode prototype names follow
type-company-version.json format
Added compass object to side cameras when slice mode is not
canonical
Remove UV mapping on sphere electrodes
Added model up direction to electrodes to assist calculating Euler
axis and angles
Volume, atlas threshold is asynchronous now
Changed default values of some controller
Added broadcast() to more controllers;
Atlas key number is displayed so users no longer need to search for
look-up table
Added debug flag with keyboard shortcuts
Viewer finally compiles with quarto/rmarkdown
Implemented functions to create sEEG electrodes
Slices does not write to depth buffer when rendered in side canvas,
so electrode contacts are not blocked
Allowed anchor to be fixed when localizing with electrode
prototype
Using instancedMesh to render actual electrode spheres
when prototype is used and users choose to see the actual contact
locations
Implemented mapToTemplate for electrode prototypes
Pial surface does not write to depth buffer when it’s
super transparent
Added drivers to set object transform matrix
Adjust the implementation of background color and
arcball radius
Removed composer effects, using shaders to render
electrode outline
Trackball uses longer side of the canvas instead of shorter side as
radius
Added electrode visibility mode: use threshold-only to
show contacts that pass threshold even no display value is given
Overlay brightness can be adjusted via controller
Adjusted title position
Updated CITATION
New color map is used for electrodes to be consistent with
RAVE color
Allow adding additional geometries in brain$plot
Improved spacing for interpolation and extrapolation (electrode
localization); removed old interpolation logic; added
distanceRatio to prevent large shift (auto adjust)
Electrodes are opaque on main but transparent on side canvas
Using pial surface center as trackball center
Dithering the datacube2 to make rendering more natural
on main canvas
By default set MRI slices visible when surfaces are
missing
Drag & drop file names is sanitized to avoid displaying
issues
Electrode contacts (instancedMesh) are now
click-able
dispose is cleaner now, it also fires events
Added makeClickable and removeClickable to
replace previous add_clickable function
Renamed register_object to
registerToMap
Better ways to sanitize datacube
Improved datacube overlay texture, including using
clamp-to-border instead clamp-to-edge
Ray-casting electrode prototypes with instancedMesh now
works under contact-only mode
Show electrode prototype with contacts by default
Added color modes for uploaded images
removed normalize method (replaced by
getNormalizedImage) from NiftiImage and
MGHImage
Using script to generate change log automatically from Git
commits
Scrolling on side canvas is faster now
Allowed prototype contact colors to be fixed
Prototype control points displays channel information (provided
control points are channels) Added color (randomColor,
testColorString) and file-name utility functions
Soft removed addColorCoat and using
ElectrodeMaterial, this results in massive code improvement
in electrode instance
Allow to set default electrode colors if a contact is not rendered
with values nor fixed color
Scrolling on side canvas is faster now
Color look-up table can be set with arbitrary single color (in
HexString, indicating that all values should be rendered
with such color; Drag & Drop volumes can change to single
colors
Remembers the state when switching volumes
(datacube2)
Bug fixes
Fixed NamedLut color error when a value range is
zero
Prototype electrode click information displays the channel
number
Fixed RShinyDriver issue when object does not have
construction parameters (using getThreeBrainInstance
instead)
Avoid rendering volume data to sub-cortical ROI
Fixed UV issues in electrode geometry prototypes
Fixed a bug when slice instance is missing but controller tries to
set overlay
JavaScript map is hidden when compiled so browsers will
not complain about missing maps
Significantly reduced the chances of viewer crash under R shiny
applications
Fixed a shader crash issue on Windows
WebGL2 is the hard requirement now; users will be
notified if this requirement is not met
Mouse position in the canvas is calculated every mouse down instead
of every resizing to fix the control issues when page is scrolled in
shiny app
Fixed controller.load to handle invalid set controller
request
Fixed textsprite depth issues
Fixed light under new engine
Fixed visualization of volume cubes when using NIfTI
files
Fixed volume transforms when sform and
qform are inconsistent in NIfTI
Fixed UV mapping issue in sphere electrode
geometry
Fixed shader issue when transparency is set to negative
(treated as 1)
Using NIfTI headers to get calculated color intensities
before applying heuristic approach
threeBrain 1.0.2
Removed a shader loop that accidentally used dynamic
variable for looping, which may crash on Windows in certain
situations
Updated README.md
Composer effects are removed
Added default color to electrodes (JavaScript) to fix the
localization electrode color not set correctly issues
Added z-index base to the side canvas layer
(div)
Removed additional unused parameters from material call
Used new material type to make brain more realistic
New background color is implemented
Trackball uses width instead of height of the viewer as
the Arcball radius; mouse positions is calculated whenever
mouse-down event is triggered (allowing more accurate track-ball
calculation in Shiny applications)
Made col2hexstr internal function
Added a new electrode visibility mode, allowing to show contacts
with no values but passing the threshold
Added brain$electrodes$fix_electrode_color to fix the
electrode colors under given data names (to display DBS
electrodes, for example)
Made controller.load more robust against errors
Fixed the depth issue in TextSprite
Some default controller values have changed to make more sense
Outline render effect is removed; electrode outlines are implemented
directly in the shader
Updated three.js to v160 with light model
improved
Added rave_slices.nii to allowed MRI
prefix in FreeSurfer folder with highest priority, such
that this image will be treated as default volume to load in side canvas
(default is still brain.finalsurfs.mgz)
Allow MRI to change brightness dynamically in
viewer
Ensure that voxels index from zeros
Added brain$get_atlas_labels to guess the atlas labels
from given masks or atlas files
Allowed to spatially transform electrodes to desired coordinate
system
Updated citation
The standalone viewer does not require static server anymore:
everything is self-contained (require pandoc, which comes
with RStudio)
Changed mechanism on animation color map generator (so the color is
more accurate for discrete variables)
Added png to dependence
Added support for AC-PC alignment, available in
RAVE - YAEL module
Allow brain to plot with additional customized
geometries
Added plot_slides to plot MRI centered at
each electrode contact for slide-to-slide visualization
Added Line-of-Sight view mode for side canvas; can be enabled using
shortcut m (previous shortcut to change the material type
is changed to shift+M)
Fixed CT in JavaScript when the
sform and qform are different (have different
code)
Allowed to specify the spacing for interpolation and extrapolation
for unequally spaced electrodes
Added electrode outlines
YAEL paper is finally out
Fixed incorrect sub-cortical labels
Deprecated old format (no cache is needed anymore)
Made electrodes opaque on main but transparent in side canvas
Let controllers check if the variable is valid before set to avoid
invalid viewer state during initialization
Added get_ijk2ras to get Norig and
Torig matrix
threeBrain 1.0.1
Updated controller library to have reasonable input focus
Allow MRI slices to be NIfTI format
Set slices to be visible by default when the surface is not
available
Fixed transform for datacube2
Fixed qform when reading NIfTI files
Fixed auto-refine functions in electrode
localization
Removed clipboard auto-copy and auto-paste functions since they
conflict with other viewers; instead users can use controllers to copy
and paste state
threeBrain 1.0.0 - Egypt
This version is a major update.
Created threeBrain::threeBrain as the formal way to
create brain objects
Updated JavaScript engine to v150
Allow getting HTML tags from saved widget so the widget
can be used from Jupyter notebook
Added $render method to remember viewer states
Allowing set title via proxy driver
Added citation information
Fixed hemisphere issue in localization when electrodes are closer to
opposite hemispheres
Added electrode registration from anatomical slice cross-hair
threeBrain 0.2.9
This version plans for a major update. Here are some highlights:
Electrode localization can be done from original CT
instead of re-sampled ones
Completely isolate JavaScript engine from
R code. The JavaScript code is available as
npm package and is used via sub-module
Implemented file readers directly from JavaScript, this
allows reading files directly in viewer, and no cache is needed
No home-brew version of threejs is required: standard
npm distribution is used
New controller GUI is implemented
The viewer can be driven via JavaScript directly via
event dispatchers
Anatomical segmentation map is visible from the side panels; the
voxel values are displayed when setting
crosshair
Detailed Changes
Added step size in datacube2 material uniforms
Upgraded threejs to r148, and use
npm distribution “three”
Added preset syncviewers
(threejs_brain(control_presets = ...)) to synchronize
multiple viewers in shiny environment
threeBrain 0.1.4
Changes
Implemented a new mesh type - volume rendering using ray
marching
Added alternative methods to read .nii files,
nibabel is now optional
Customized color palettes and value range for better visualizations
with outliers
Only requires T1.mgz or brainmask of
brain.finalsurf is not found. This allows users only run
FreeSurfer to the first stage, which only takes around 8 to
10 minutes instead of 6 hours.
Fully compatible with htmlwidgets in shiny
mode. When calling threejsBrainOutput under
shiny::renderUI, the DOM element might get
reset by shiny, causing a new 3D viewer created. This might
consume more resource, causing memory leaks and even conflict context
renderings. Also event listeners couldn’t reset correctly. A cache is
created and now is reusing the canvas.
Improvements
More flexible directory requirement
Added dispose function to canvas so that memory gets cleared
correctly
Renderer optimization and memory optimization
Bug Fixes
Fixed keyboard listeners locking the keys
Fixed huge memory leaks due to threejs not garbage
collecting geometries and textures
threeBrain 0.1.3
Changes
File structure change: now directly read in from
FreeSurfer folder
Added readers for .mgz, .m3z files
Added coordinate system to align volume with surface data
Implemented side-viewers, added three side cameras at XYZ axis
Can now read, export electrodes as csv file
Re-write brain generating function
Can display/switch multiple value types
Added transparency to surfaces
Implemented experimental electrode localization
Automatically determine color type (continuous or discrete) and
value range