@@ -199,7 +199,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) {
199199 camera . position . set ( 0 , 0 , default_camera_distance ) ;
200200 light . position . set ( 0 , 0 , default_camera_distance ) ;
201201
202- var offset = model . userData . offset || new THREE . Vector3 ( 0 , 0 , 0 ) ;
202+ var offset = model . userData . model_center_offset || new THREE . Vector3 ( 0 , 0 , 0 ) ;
203203 model . children . forEach ( function ( shape ) {
204204 var centroid = shape . userData . centroid ;
205205 var recentered = shape . userData . recentered ;
@@ -274,7 +274,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) {
274274 sphere . position . set ( x , y , z ) ;
275275
276276 if ( viewer . model ) {
277- var offset = viewer . model . userData . offset ;
277+ var offset = viewer . model . userData . model_center_offset ;
278278 if ( offset !== undefined ) {
279279 sphere . translateX ( offset . x ) ;
280280 sphere . translateY ( offset . y ) ;
@@ -630,6 +630,78 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) {
630630 return vertex_data ;
631631 } ;
632632
633+ viewer . model_centric = function ( model_centric ) {
634+ var model = viewer . model ;
635+
636+ // Calculate bounding box only if needed
637+ if ( model . userData . model_center_offset === undefined ) {
638+ // Calculate bounding box for all children given by the user
639+ // ignore other children
640+ var min_x , max_x , min_y , max_y , min_z , max_z ;
641+ min_x = min_y = min_z = Number . POSITIVE_INFINITY ;
642+ max_x = max_y = max_z = Number . NEGATIVE_INFINITY ;
643+
644+ model . children . forEach ( function ( children ) {
645+ var model_name = children . userData . model_name ;
646+ var model_data = viewer . model_data . get ( model_name ) ;
647+
648+ var current_shape = undefined ;
649+ var children_name = children . name ;
650+ model_data . shapes . forEach ( function ( shape ) {
651+ if ( shape . name !== children_name ) { return } ;
652+ if ( children . material . opacity === 0 ) { return } ;
653+ current_shape = shape ;
654+ var bounding_box = shape . bounding_box ;
655+
656+ // min
657+ min_x = Math . min ( min_x , bounding_box . min_x ) ;
658+ min_y = Math . min ( min_y , bounding_box . min_y ) ;
659+ min_z = Math . min ( min_z , bounding_box . min_z ) ;
660+ // max
661+ max_x = Math . max ( max_x , bounding_box . max_x ) ;
662+ max_y = Math . max ( max_y , bounding_box . max_y ) ;
663+ max_z = Math . max ( max_z , bounding_box . max_z ) ;
664+ } ) ;
665+ } ) ;
666+
667+ // centroid of all the model
668+ var centroid = new THREE . Vector3 ( )
669+ centroid . x = min_x + ( max_x - min_x ) / 2 ;
670+ centroid . y = min_y + ( max_y - min_y ) / 2 ;
671+ centroid . z = min_z + ( max_z - min_z ) / 2 ;
672+
673+ model . userData . model_centric = true ;
674+ model . userData . model_center_offset = new THREE . Vector3 ( - centroid . x , - centroid . y , - centroid . z )
675+ }
676+
677+
678+ if ( model_centric === true ) {
679+ // Calculate bounding only if needed
680+ // Translate each children
681+ centroid = model . userData . model_center_offset ;
682+ model . children . forEach ( function ( children ) {
683+ // Return if children is not given by the user
684+ if ( Object . keys ( children . userData ) . length === 0 && children . userData . constructor === Object ) { return } ;
685+ console . log ( children . name )
686+ children . translateX ( centroid . x ) ;
687+ children . translateY ( centroid . y ) ;
688+ children . translateZ ( centroid . z ) ;
689+ } ) ;
690+ } else {
691+ // Revert the translation for each children
692+ if ( model . userData . model_centric !== true ) { return } ;
693+ var centroid = model . userData . model_center_offset ;
694+ model . children . forEach ( function ( children ) {
695+ // Return if children is not given by the user
696+ if ( Object . keys ( children . userData ) . length === 0 && children . userData . constructor === Object ) { return } ;
697+ children . translateX ( - centroid . x ) ;
698+ children . translateY ( - centroid . y ) ;
699+ children . translateZ ( - centroid . z ) ;
700+ } ) ;
701+ }
702+ viewer . updated = true ;
703+ } ;
704+
633705 ////////////////////////////////////
634706 // PRIVATE FUNCTIONS
635707 ////////////////////////////////////
@@ -640,7 +712,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) {
640712 var delta ;
641713 var rotation ;
642714 var position = camera . position ;
643- var new_z = default_camera_distance / viewer . zoom ;
715+ var new_z = default_camera_distance / viewer . zoom ;
644716
645717 window . requestAnimationFrame ( renderFrame ) ;
646718
0 commit comments