Change Log
threeBrain 1.2.0
- Fixed shiny callback when electrode contacts are double-clicked
- Fixed contact-switching and highlight box
- Added PMTelectrodes
- 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_valuesfor continuous atlases such as
binary or probabilisticROI
- The radius refers to maximum RASdistance instead ofvoxelindexing distance, hence more accurate when the atlas
volume has imbalanced slice count
- Renamed active-voxeltocolumn-row-slicebut still keep the naming for backward compatibility
- Voxelfilter 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 voxelmode
- Added direction arrow helper to DBS(or electrodes with
non-zero model up vectors)
- Support WebAssembly
- Avoid using pandocto 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 -500so
it does not hide behind the transparent surfaces
- Plotting electrodes on slices now takes numerical
adjust_brightnessinterpreted as quantile
- Changed default color palette for discrete values, removed colors
that are too dark or gray
- Change CTthreshold back to positive (3000) when
switching fromDBSleads back tosEEGleads.
- 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 Abbottsegmented electrodes6170-6173, with segmented electrodes clockwise viewing fromproximalend
- Fixed a bug that may change electrode coordinate hand
- All the DBSelectrode prototype maker uses naturalcosforxandsinfory. However, this will cause electrodes to rely on rendering
on back side (material)
- Added missing prototype
- Fixed BSCandMedtronicelectrode
orientation (now is counter-clockwise when viewing fromproximalend)
- Added more spacing for DBSsegmented contacts
- added prototypes for Medtronicsegmented
electrodes
- Added BSC-DBelectrodes for22022201
- Added internal test code for depth mapping
- Surface mapping has been implemented for depth electrodes, with
dynamic offset threshold
- surface_offsethas been added to electrode field
- cvs_avg35_inMNI152has the correct- talXFM(scanner to- MNI305) now
- Added load_meshto surface object so users can load
surface mesh for computation inR
- Added internal calculate_distancesto compute the
distances from a point to its projection to a list of mesh
- DistanceShiftedin 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
upvector 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 DBSelectrode prototypeBSC-DB-2202
- Prototype set_transform_from_pointsnow tries to set
rotation from transformEulerangle when the prototype
guided marker is 1-ranked (electrode strip,DBSelectrodes)
- 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 GLTFnot showing inner-most contact
issue
- Removed develversion ofravetoolsfrom
check
- Update Githubaction check script
- Added rhubcheck
- Plotting slices have correct margins with partial plot
- Allow users to drag and drop value tables
- Allow users to hide cross-hairs
- Allow shinyapp to change current color map via
proxy
- Allows drag-drop electrode color files
- Added set_electrode_datato brain proxy class, allowingshinyapplications to change the electrode data, set color
palettes, and set value ranges in the same call
- Allow masks to be added to T1
- Added D99v2for monkey brain
- Export GLTFfordatacube2
- Fixed fix_electrode_colorbug
- Supported ISOsurface generation from volume
- Added white-matter segmentation as default atlas if user has this
file
- Exporting GLTFis wrapped with try-catch
- fix_electrode_coloris exclusive by default
- fixed color fixing issue for naive sphere electrodes
- Changed logo message
- Using better RAVElogo and fixed style issues
- Changed shortcut pto toggling the visibility andshift+pto switching surface types
- Added logo to control panel to advertise the project
- Added export GLTFbinary format
- Separate 3Dand2Dcanvas;
- Converts *h.pial.giitoFreeSurferformat
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
- threejsengine is upgraded to- v160; added
support for- NIfTIand- GIfTIimages
- 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)
ROIsurfaces
- 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
followingBIDSconvention. 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-electrodeandline-of-sightmode in addition to canonical anatomical slices.
- Under line-of-sightmode, 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 theMRI
 
- Users can localize an electrode probe by clicking on the target
location, then entry location
- Added an option to add QRcode to the viewer, allowing
people to link to the publication
- Loading progress is more informative now
- Implemented plot_slicesto allow plottingMRIslices 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 themri/inFreeSurferfolder
- File/Data loaders use JavaScriptworkers now (can be
disabled withenable_cache=TRUE)
- Added mesh clipping to see depth electrodes without compromising
color
- Implemented volume clipping
- Added new mode for ACPCalignment
- Added targetflag so objects can be rendered
differently on main canvas versus side canvas
Minor changes
- Electrode prototype names follow
type-company-version.jsonformat
- Added compass object to side cameras when slice mode is not
canonical
- Remove UVmapping 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 sEEGelectrodes
- 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 instancedMeshto render actual electrode spheres
when prototype is used and users choose to see the actual contact
locations
- Implemented mapToTemplatefor electrode prototypes
- Pialsurface 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
arcballradius
- Removed composer effects, using shadersto render
electrode outline
- Trackball uses longer side of the canvas instead of shorter side as
radius
- Added electrode visibility mode: use threshold-onlyto
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
RAVEcolor
- Allow adding additional geometries in brain$plot
- Improved spacing for interpolation and extrapolation (electrode
localization); removed old interpolation logic; added
distanceRatioto prevent large shift (auto adjust)
- Electrodes are opaque on main but transparent on side canvas
- Using pialsurface center as trackball center
- Dithering the datacube2to make rendering more natural
on main canvas
- By default set MRIslices visible when surfaces are
missing
- Drag & drop file names is sanitized to avoid displaying
issues
- Electrode contacts (instancedMesh) are now
click-able
- disposeis cleaner now, it also fires events
- Added makeClickableandremoveClickableto
replace previousadd_clickablefunction
- Renamed register_objecttoregisterToMap
- Better ways to sanitize datacube
- Improved datacubeoverlay texture, including usingclamp-to-borderinsteadclamp-to-edge
- Ray-casting electrode prototypes with instancedMeshnow
works undercontact-onlymode
- Show electrode prototype with contacts by default
- Added color modes for uploaded images
- removed normalizemethod (replaced bygetNormalizedImage) fromNiftiImageandMGHImage
- 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 addColorCoatand usingElectrodeMaterial, 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 NamedLutcolor error when a value range is
zero
- Prototype electrode click information displays the channel
number
- Fixed RShinyDriverissue when object does not have
construction parameters (usinggetThreeBrainInstanceinstead)
- 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
- JavaScriptmap 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 shadercrash issue onWindows
- WebGL2is 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.loadto handle invalid set controller
request
- Fixed textspritedepth issues
- Fixed light under new engine
- Fixed visualization of volume cubes when using NIfTIfiles
- Fixed volume transforms when sformandqformare inconsistent inNIfTI
- Fixed a bug in interpolation with spacing
- fixed incorrect ROIlabel
- as_subcortical_labelgenerates correct white-matter
labels
- Fixed freesurfer_lut
- Fixed auto-adjustfeature (electrode localization)
- Fixed UVmapping issue in sphere electrode
geometry
- Fixed shaderissue when transparency is set to negative
(treated as 1)
- Using NIfTIheaders to get calculated color intensities
before applying heuristic approach
threeBrain 1.0.2
- Removed a shaderloop that accidentally used dynamic
variable for looping, which may crash onWindowsin 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-indexbase 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
- Trackballuses width instead of height of the viewer as
the- Arcballradius; mouse positions is calculated whenever
mouse-down event is triggered (allowing more accurate track-ball
calculation in- Shinyapplications)
- Made col2hexstrinternal function
- Added a new electrode visibility mode, allowing to show contacts
with no values but passing the threshold
- Added brain$electrodes$fix_electrode_colorto fix the
electrode colors under given data names (to displayDBSelectrodes, for example)
- Made controller.loadmore 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.jstov160with light model
improved
- Added rave_slices.niito allowedMRIprefix inFreeSurferfolder with highest priority, such
that this image will be treated as default volume to load in side canvas
(default is stillbrain.finalsurfs.mgz)
- Allow MRIto change brightness dynamically in
viewer
- Ensure that voxelsindex from zeros
- Added brain$get_atlas_labelsto 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
withRStudio)
- Changed mechanism on animation color map generator (so the color is
more accurate for discrete variables)
- Added pngto dependence
- Added support for AC-PCalignment, available inRAVE-YAELmodule
- Allow brainto plot with additional customized
geometries
- Added plot_slidesto plotMRIcentered 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 toshift+M)
- Fixed CTinJavaScriptwhen thesformandqformare different (have different
code)
- Allowed to specify the spacing for interpolation and extrapolation
for unequally spaced electrodes
- Added electrode outlines
- YAELpaper 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_ijk2rasto getNorigandTorigmatrix
threeBrain 1.0.1
- Updated controller library to have reasonable input focus
- Allow MRIslices to beNIfTIformat
- Set slices to be visible by default when the surface is not
available
- Fixed transform for datacube2
- Fixed qformwhen readingNIfTIfiles
- Fixed auto-refinefunctions 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::threeBrainas the formal way to
create brain objects
- Updated JavaScriptengine tov150
- Allow getting HTMLtags from saved widget so the widget
can be used fromJupyternotebook
- Added $rendermethod 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 CTinstead of re-sampled ones
- Completely isolate JavaScriptengine fromRcode. TheJavaScriptcode is available asnpmpackage 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 threejsis required: standardnpmdistribution is used
- New controller GUIis implemented
- The viewer can be driven via JavaScriptdirectly via
event dispatchers
- Anatomical segmentation map is visible from the side panels; the
voxelvalues are displayed when settingcrosshair
Detailed Changes
- Added step size in datacube2material uniforms
- Upgraded threejstor148, and usenpmdistribution “three”
- Massive code re-factory (variable names, trackball controls, legacy
classes…)
- Removed data-GUIand uselil-GUI
- Fixed compass (finally…)
- Added title to the viewer
- Reworked the whole message signal system, added
ThrottledEventDispatcher.js
- Added MouseKeyboardclass to track mouse and keyboard
events, greatly reduced canvas burden
- Added animParameterobject to canvas to keep track of
the animation parameters
- reworked shiny drivers
- fixed one-voxel shift issues
- Added format support for nii,mgh/mgz,FreeSurfersurface,FreeSurfernode value
binary formats
- Added function threeBrainto allow 3D viewer to run
without cache (with fs only)
- Fixed memory leak issues in JavaScriptcode
- Geometry groups can now change its storage path
- JS is completely independent now (available on npmnow)
- Peel event dispatcher from the canvas class so the events can be
managed separately
- Hide time-stamps when there is no data/animation available
- Added experimental support to show labels on regular electrodes;
currently no depth-test is turned on
- Added GUIsupport to change electrode label visibility
and size
- Electrode label size adjusts along with electrode radius
- handle_resizenow put off resizing function when
detecting widget size is too small
Bug fixes
- Fixing xfmnot parsed correctly when the line starts
with blank spaces
- Stopped rendering canvas when canvas is too small (less than 10
pixels)
threeBrain 0.2.7
Changes
- Rewired events, allowing to drive the viewer via
JavaScriptevents
- Allowed to set animation playback status
- Remove modal by default if raveioorravedashis loaded
- Edited launch script to always use Python3
Bug fixes
- Fixed installation issues (template brain) on Windows,
avoid backslashes
threeBrain 0.2.6
Changes
- Allowed users to pan the camera when localizing electrodes
- Added line segment geometry type that can either display static line
segments (such as DTI), or connect two electrodes
dynamically
- Printing brain now uses more accurate terms
- Allowed CTto be either path or the actual data when
calling localizing function
Bug fixes
- Fixed NifTiorientation issues and usesform
- Fixed localization issue when NifTitransform matrix
has determinant not equally to 1
- Fixed volume shader, resolved shift issues when panning the
camera
threeBrain 0.2.5
Changes
- Surface sync from voxelsnow clamp the surface
nodes
- Added Voxel Displaycontroller to toggle volume display
modes
- Changed shortcut lfromVoxel TypetoVoxel Display
- Volume fragmentShaderuses non-linear function to
calculate fragment colors combined with face normal; this will create
smoother results
- DataCube2geometry uses- ConvexHullinstead
of box/sphere to improve the performance
- DataCube2are no longer hidden when- sync from voxelsis on: users can use shortcuts- land- kto easily control the visibility.
- download_template_subjectcan download other templates
such as- fsaverage,- cvs_avg35,- bert.
Bug fixes
- Fixed a volume rendering issue where ray-marching directions are not
calculated correctly
- Fixed color not set correctly when changing
Voxel Labelswhile surface colors aresync from voxels
threeBrain 0.2.4
This version mainly works on the electrode localization. Most changes
occur in the JavaScript engine.
Changes
- Allows electrodes to be reset
- Displays electrode labels along with the electrodes
- Allows resizing electrode size on the fly
- Allows resizing the electrode labels
- Localization module has been integrated into RAVE
- Added line mesh to mark the distance of the electrode deviating from
its original position. The line color changes with the distance
value.
Improvements
- Improved localization precision
- Auto-adjusting electrodes now respects the topology
- Electrodes in the localization mode now have
LocElectrodeclass
- Volume rendering and ray-casters now respects the transform
matrices
threeBrain 0.2.3
Changes
- Electrode localization now has a shinyapplication
Improvements
threeBrain 0.2.2
Changes
- Supported video content to display auditory visual stimuli along the
response
- Default to closing the defaultandvolumeside folders
Improvements
- Fixed electrode localization interpolation issue
- Proper dispose the localized electrodes
- Fixed screenshot and video recording functions
- Renamed recording button to Chrome-specific
threeBrain 0.2.1
Changes
- Finally, electrode localization is added!
- Added TextTexturein the internal code to display textSpriteeasily
- Can download electrodes as csv
threeBrain 0.2.0
Changes
- More efficient volume rendering with transparency
- Added shader functions to surface instances, allowing color
rendering from volume, electrodes, or vertices (major change)
- Added color-map generator for surface and volume data
- Added method to generate data cube (volume) from MNI305coordinates
- Optimized loading procedure
- Removed crayon,base64enc,htmltools,pryrfrom dependence
Improvements
- Bumped threejsversion tov131dev
- Fixed surface transparency losing fragments issue
- Added loaders to shiny applications to avoid performance issues on
old computers
- Fixed electrodes not selected on mouse click-down (on
Firefox)
threeBrain 0.1.9
Changes
- Added backend engine for volume rendering to show atlas files
- Standalone viewers now use native system tools for MacandLinux(OnWindows, it still needsRto be installed)
Improvements
- Allows super slow play speed to show animations in millisecond
level
- Bumped threejsto a newer version and fixed
compatibility issues
- Animation time range is more reasonable
threeBrain 0.1.8
Changes
- Screenshot now downloads pdfformat
Improvements
- Fixed freesurferformatsface index starting from 1
instead of 0
threeBrain 0.1.7
Changes
- Now displays MNI305coordinates instead oftkRAScoordinates
- Removed reticulateand related functions to support
native R functions
Improvements
- Fixed MNI305calculation issues
- Internally calculates anterior commissure
threeBrain 0.1.6
Changes
- Implemented view_ct_t1to viewCTaligned
toT1images
- Updated document on how to generate FreeSurferbrain
- Removed dependency to nibabeland use native R
packages
- Re-designed legends, added options to show, hide display
information
- Added screenshot to download as image
Improvements
- Added hints for keyboard shortcuts
threeBrain 0.1.5
Changes
- Import FreeSurferandSUMAfilessulc
- Control element update
- Added brain_proxyto control in shiny element
- Separated display and threshold data
- FreeMeshmaterial can be switched between- MeshPhongMaterialand- MeshLambertMaterial
Improvements
- UI will blur focus when clicking on canvas
- Allow customizing widgets background,cex(font magnification),timestamp(display time)
- Allow controllers(list) to override control UI
- 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 .niifiles,nibabelis now optional
- Customized color palettes and value range for better visualizations
with outliers
- Only requires T1.mgzorbrainmaskofbrain.finalsurfis not found. This allows users only runFreeSurferto the first stage, which only takes around 8 to
10 minutes instead of 6 hours.
- Fully compatible with htmlwidgetsinshinymode. When callingthreejsBrainOutputundershiny::renderUI, theDOMelement might get
reset byshiny, 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 threejsnot garbage
collecting geometries and textures
threeBrain 0.1.3
Changes
- File structure change: now directly read in from
FreeSurferfolder
- Added readers for .mgz,.m3zfiles
- 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
Improvements
- Shortcuts available at here
- Optimized electrode value settings
threeBrain 0.1.2
Changes
- Re-draw canvas on a 2D context to make customized overlay directly
on canvas.
- Implemented continuous and discrete legends to replace D3.
- Added support to set main camera position and initial zoom
level.
- Added 3D scatter plot and examples.
- Use hybrid render mode when animation not required to save battery
usage.
- Improved color palette calculation.
- Support customized title.
Improvements
- Support customized datapath when saving widgets.
- Added instructions on how to embed widgets into websites without
R.
threeBrain 0.1.1
- Implemented three types of geometries: plane, sphere and free. A
free geometry takes arbitrary geometry vertices and faces to form a 3D
mesh object.
- Added animation to sphere object.
- Replaced old JavaScript with npx driven modules.
- Implemented D3 side-widget
threeBrain 0.1.0
- Initial private beta release!