From 564dc395416435f3e316f1acbeaf7d8b721c96ee Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Thu, 12 May 2016 13:00:44 -0400 Subject: [PATCH 01/12] Add model_centric positionning for model --- .../surface-viewer/modules/loading.js | 97 +++++++++++-------- 1 file changed, 57 insertions(+), 40 deletions(-) diff --git a/src/brainbrowser/surface-viewer/modules/loading.js b/src/brainbrowser/surface-viewer/modules/loading.js index 733edef3..fdf4a4df 100644 --- a/src/brainbrowser/surface-viewer/modules/loading.js +++ b/src/brainbrowser/surface-viewer/modules/loading.js @@ -164,7 +164,7 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { * function. The function will receive the model description and the model name * as arguments. * ```js - * viewer.model_data.forEach(function(mode_data, model_name) { + * viewer.model_data.forEach(function(model_data, model_name) { * console.log(model_name, model_data.vertices.length); * }); * ``` @@ -188,6 +188,7 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { * * **pick_ignore** Ignore this object when picking. * * **recenter** Shift object vertex positions to be relative to the centroid (can * help with transparency). + * * **model_centric** the origin of the model will be the center of the model. * * **parse** Parsing options to pass to the worker that will be used to parse the * input file. * @@ -217,6 +218,7 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { * * **pick_ignore** Ignore this object when picking. * * **recenter** Shift object vertex positions to be relative to the centroid (can * help with transparency). + * * **model_centric** the origin of the model will be the center of the model. * * **parse** Parsing options to pass to the worker that will be used to parse the * input file. * @@ -363,9 +365,9 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { //////////////////////////////////// function loadModel(data, filename, options) { - options = options || {}; - var type = options.format || "mniobj"; - var parse_options = options.parse || {}; + options = options || {}; + var type = options.format || "mniobj"; + var parse_options = options.parse || {}; // Parse model info based on the given file type. parseModel(data, type, parse_options, function(model_data) { @@ -376,12 +378,12 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { } function loadIntensityData(text, filename, options) { - options = options || {}; - var name = options.name || filename; - var type = options.format || "text"; - var blend = options.blend; - var model_name = options.model_name; - var model_data = viewer.model_data.get(model_name); + options = options || {}; + var name = options.name || filename; + var type = options.format || "text"; + var blend = options.blend; + var model_name = options.model_name; + var model_data = viewer.model_data.get(model_name); var intensity_data = model_data.intensity_data[0]; var old_range = {}; @@ -564,18 +566,18 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { /////////////////////////////////////////// // Creates three.js objects based on the - // description in **model_data** and + // description in **model_data** and // displays in on the viewer. function displayModel(model_data, filename, options) { - options = options || {}; + options = options || {}; var complete = options.complete; var new_shapes = createModel(model_data, filename, options); viewer.triggerEvent("displaymodel", { - model: viewer.model, + model: viewer.model, model_data: model_data, - new_shapes: new_shapes + new_shapes: new_shapes, }); if (complete) complete(); @@ -586,13 +588,14 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { // object, though they may share attributes and // buffers. function createModel(model_data, filename, options){ - var model = viewer.model; - var shapes = model_data.shapes; - var is_line = model_data.type === "line"; - var render_depth = options.render_depth; - var pick_ignore = options.pick_ignore; - var recenter = options.recenter || model_data.split; - var new_shapes = []; + var model = viewer.model; + var shapes = model_data.shapes; + var is_line = model_data.type === "line"; + var render_depth = options.render_depth; + var pick_ignore = options.pick_ignore; + var recenter = options.recenter || model_data.split; + var model_centric = options.model_centric; + var new_shapes = []; var shape, shape_data; var i, count; var object_description = {is_line: is_line}; @@ -628,9 +631,9 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { object_description = { position: position_buffer, - normal: normal_buffer, - color: color_buffer, - index: new THREE.BufferAttribute(new Uint32Array(shape_data.indices), 1), + normal: normal_buffer, + color: color_buffer, + index: new THREE.BufferAttribute(new Uint32Array(shape_data.indices), 1), }; } else { @@ -649,26 +652,27 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { object_description = { position: position_buffer, - normal: normal_buffer, - color: color_buffer + normal: normal_buffer, + color: color_buffer }; } - object_description.is_line = is_line; + object_description.is_line = is_line; object_description.centroid = shape_data.centroid; object_description.recenter = recenter; - shape = createShape(object_description); + shape = createShape(object_description); shape.name = shape_data.name || filename + "_" + (i + 1); shape.userData.model_name = model_data.name; shape.userData.original_data = { vertices: model_data.vertices, - indices: shape_data.indices, - normals: model_data.normals, - colors: model_data.colors + indices: shape_data.indices, + normals: model_data.normals, + colors: model_data.colors, + model_centric: options.model_centric, }; shape.userData.pick_ignore = pick_ignore; @@ -687,6 +691,19 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { } } + if (options.model_centric === true) { + var bounding_box = new THREE.BoundingBoxHelper(model); + bounding_box.update(); + + model.userData.model_centric = true + + model.children.forEach(function(children) { + children.translateX(-bounding_box.position.x); + children.translateY(-bounding_box.position.y); + children.translateZ(-bounding_box.position.z); + }); + } + return new_shapes; } @@ -694,14 +711,14 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { // a shape from the model data 'shapes' // array. function createShape(object_description) { - var position = object_description.position; + var position = object_description.position; var position_array = position.array; - var normal = object_description.normal; - var color = object_description.color; - var index = object_description.index; - var centroid = object_description.centroid; - var is_line = object_description.is_line; - var recenter = object_description.recenter; + var normal = object_description.normal; + var color = object_description.color; + var index = object_description.index; + var centroid = object_description.centroid; + var is_line = object_description.is_line; + var recenter = object_description.recenter; var geometry = new THREE.BufferGeometry(); var index_array, tmp_position_array, position_index; @@ -748,10 +765,10 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { if (is_line) { material = new THREE.LineBasicMaterial({vertexColors: THREE.VertexColors}); - shape = new THREE.Line(geometry, material, THREE.LinePieces); + shape = new THREE.Line(geometry, material, THREE.LinePieces); } else { material = new THREE.MeshPhongMaterial({color: 0xFFFFFF, ambient: 0xFFFFFF, specular: 0x101010, shininess: 150, vertexColors: THREE.VertexColors}); - shape = new THREE.Mesh(geometry, material); + shape = new THREE.Mesh(geometry, material); shape.userData.has_wireframe = true; } From a6d227142d472dc1f3940f2ba4e126b366124a80 Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Thu, 12 May 2016 14:33:29 -0400 Subject: [PATCH 02/12] Adjust annotation if model_centric is true --- .../surface-viewer/modules/loading.js | 3 ++- .../surface-viewer/modules/rendering.js | 25 +++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/brainbrowser/surface-viewer/modules/loading.js b/src/brainbrowser/surface-viewer/modules/loading.js index fdf4a4df..b1c1ea26 100644 --- a/src/brainbrowser/surface-viewer/modules/loading.js +++ b/src/brainbrowser/surface-viewer/modules/loading.js @@ -695,7 +695,8 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { var bounding_box = new THREE.BoundingBoxHelper(model); bounding_box.update(); - model.userData.model_centric = true + model.userData.model_centric = true; + model.userData.offset = new THREE.Vector3(-bounding_box.position.x, -bounding_box.position.y, -bounding_box.position.z) model.children.forEach(function(children) { children.translateX(-bounding_box.position.x); diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index 4b31927d..359120f1 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -269,10 +269,16 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { var geometry = new THREE.SphereGeometry(radius); var material = new THREE.MeshBasicMaterial({color: color}); - var sphere = new THREE.Mesh(geometry, material); + var sphere = new THREE.Mesh(geometry, material); sphere.position.set(x, y, z); if (viewer.model) { + var offset = viewer.model.userData.offset; + if (offset !== undefined) { + sphere.translateX(offset.x); + sphere.translateY(offset.y); + sphere.translateZ(offset.z); + } viewer.model.add(sphere); } else { scene.add(sphere); @@ -488,8 +494,8 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { y = (-y / viewer.dom_element.offsetHeight) * 2 + 1; var model = viewer.model; - var raycaster = new THREE.Raycaster(); - var vector = new THREE.Vector3(x, y, camera.near); + var raycaster = new THREE.Raycaster(); + var vector = new THREE.Vector3(x, y, camera.near); var intersection = null; var intersects, vertex_data; var intersect_object, intersect_point, intersect_indices, intersect_face; @@ -689,8 +695,8 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { function drag(pointer, multiplier) { var inverse = new THREE.Matrix4(); - var x = pointer.x; - var y = pointer.y; + var x = pointer.x; + var y = pointer.y; var dx, dy; @@ -700,8 +706,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { if (movement === "rotate") { - // Want to always be rotating around - // world axes. + // Want to always be rotating around world axes. inverse.getInverse(model.matrix); var axis = new THREE.Vector3(1, 0, 0).applyMatrix4(inverse).normalize(); model.rotateOnAxis(axis, dy / 150); @@ -710,13 +715,13 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { axis = new THREE.Vector3(0, 1, 0).applyMatrix4(inverse).normalize(); model.rotateOnAxis(axis, dx / 150); } else { - multiplier = multiplier || 1.0; + multiplier = multiplier || 1.0; multiplier *= camera.position.z / default_camera_distance; camera.position.x -= dx * multiplier * 0.25; - light.position.x -= dx * multiplier * 0.25; + light.position.x -= dx * multiplier * 0.25; camera.position.y += dy * multiplier * 0.25; - light.position.y += dy * multiplier * 0.25; + light.position.y += dy * multiplier * 0.25; } } From 29140df59dbb10142522ab9218ebfc281d401520 Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Thu, 12 May 2016 15:59:35 -0400 Subject: [PATCH 03/12] Fix position when reset view if model_centric --- src/brainbrowser/surface-viewer/modules/rendering.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index 359120f1..b6932b47 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -199,6 +199,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { camera.position.set(0, 0, default_camera_distance); light.position.set(0, 0, default_camera_distance); + var offset = model.userData.offset || new THREE.Vector3(0,0,0); model.children.forEach(function(shape) { var centroid = shape.userData.centroid; var recentered = shape.userData.recentered; @@ -209,12 +210,12 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { if (shape.userData.original_data) { if (centroid && recentered) { shape.position.set( - centroid.x, - centroid.y, - centroid.z + centroid.x + offset.x, + centroid.y + offset.y, + centroid.z + offset.z ); } else { - shape.position.set(0, 0, 0); + shape.position.set(0 + offset.x, 0 + offset.y, 0 + offset.z); } shape.rotation.set(0, 0, 0); shape.material.opacity = 1; From 2792f3ffee6503d8714e86ea8188393fa4053582 Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Wed, 25 May 2016 15:58:00 -0400 Subject: [PATCH 04/12] Fix original center when model is loaded. --- examples/surface-viewer-demo.html | 5 ++ examples/surface-viewer-demo.js | 28 ++++--- .../surface-viewer/modules/loading.js | 14 ---- .../surface-viewer/modules/rendering.js | 78 ++++++++++++++++++- 4 files changed, 99 insertions(+), 26 deletions(-) diff --git a/examples/surface-viewer-demo.html b/examples/surface-viewer-demo.html index 6d392dd2..033499f0 100644 --- a/examples/surface-viewer-demo.html +++ b/examples/surface-viewer-demo.html @@ -191,6 +191,11 @@

Views:

Display axes

+

+

+ +
+

Reset View diff --git a/examples/surface-viewer-demo.js b/examples/surface-viewer-demo.js index f5fa7368..5c67fb09 100644 --- a/examples/surface-viewer-demo.js +++ b/examples/surface-viewer-demo.js @@ -494,6 +494,11 @@ $(function() { }); + // Origin position + $("#model_centric").change(function() { + viewer.model_centric($(this).is(":checked")); + }); + // Color map URLs are read from the config file and added to the // color map select box. var color_map_select = $('').change(function() { @@ -532,8 +537,8 @@ $(function() { $("#pick-index").html(pick_info.index); $("#annotation-wrapper").show(); - picked_object = pick_info.object; - model_data = viewer.model_data.get(picked_object.userData.model_name); + picked_object = pick_info.object; + model_data = viewer.model_data.get(picked_object.userData.model_name); intensity_data = model_data.intensity_data[0]; if (intensity_data) { @@ -634,9 +639,9 @@ $(function() { }); $("#annotation-save").click(function() { - var vertex_num = parseInt($("#pick-index").html(), 10); + var vertex_num = parseInt($("#pick-index").html(), 10); var annotation_display = $("#annotation-display"); - var media = $("#annotation-media"); + var media = $("#annotation-media"); var annotation, annotation_data; var vertex; @@ -658,15 +663,15 @@ $(function() { vertex = viewer.getVertex(vertex_num); annotation_data.image = $("#annotation-image").val(); - annotation_data.url = $("#annotation-url").val(); - annotation_data.text = $("#annotation-text").val(); + annotation_data.url = $("#annotation-url").val(); + annotation_data.text = $("#annotation-text").val(); media.html(""); if (annotation_data.image) { - var image = new Image(); + var image = new Image(); image.width = 200; - image.src = annotation_data.image; + image.src = annotation_data.image; annotation_display.show(); media.append(image); } @@ -914,7 +919,12 @@ $(function() { showLoading(); viewer.loadModelFromFile(document.getElementById("objfile"), { format: format, - complete: hideLoading + complete: function() { + if ($("#model_centric").is(":checked")) { + viewer.model_centric(true); + } + hideLoading(); + } }); return false; diff --git a/src/brainbrowser/surface-viewer/modules/loading.js b/src/brainbrowser/surface-viewer/modules/loading.js index b1c1ea26..758ee0b3 100644 --- a/src/brainbrowser/surface-viewer/modules/loading.js +++ b/src/brainbrowser/surface-viewer/modules/loading.js @@ -691,20 +691,6 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { } } - if (options.model_centric === true) { - var bounding_box = new THREE.BoundingBoxHelper(model); - bounding_box.update(); - - model.userData.model_centric = true; - model.userData.offset = new THREE.Vector3(-bounding_box.position.x, -bounding_box.position.y, -bounding_box.position.z) - - model.children.forEach(function(children) { - children.translateX(-bounding_box.position.x); - children.translateY(-bounding_box.position.y); - children.translateZ(-bounding_box.position.z); - }); - } - return new_shapes; } diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index b6932b47..4ac3cc9c 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -199,7 +199,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { camera.position.set(0, 0, default_camera_distance); light.position.set(0, 0, default_camera_distance); - var offset = model.userData.offset || new THREE.Vector3(0,0,0); + var offset = model.userData.model_center_offset || new THREE.Vector3(0,0,0); model.children.forEach(function(shape) { var centroid = shape.userData.centroid; var recentered = shape.userData.recentered; @@ -274,7 +274,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { sphere.position.set(x, y, z); if (viewer.model) { - var offset = viewer.model.userData.offset; + var offset = viewer.model.userData.model_center_offset; if (offset !== undefined) { sphere.translateX(offset.x); sphere.translateY(offset.y); @@ -630,6 +630,78 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { return vertex_data; }; + viewer.model_centric = function(model_centric) { + var model = viewer.model; + + // Calculate bounding box only if needed + if (model.userData.model_center_offset === undefined) { + // Calculate bounding box for all children given by the user + // ignore other children + var min_x, max_x, min_y, max_y, min_z, max_z; + min_x = min_y = min_z = Number.POSITIVE_INFINITY; + max_x = max_y = max_z = Number.NEGATIVE_INFINITY; + + model.children.forEach(function(children){ + var model_name = children.userData.model_name; + var model_data = viewer.model_data.get(model_name); + + var current_shape = undefined; + var children_name = children.name; + model_data.shapes.forEach(function(shape){ + if (shape.name !== children_name) { return }; + if (children.material.opacity === 0) { return }; + current_shape = shape; + var bounding_box = shape.bounding_box; + + // min + min_x = Math.min(min_x, bounding_box.min_x); + min_y = Math.min(min_y, bounding_box.min_y); + min_z = Math.min(min_z, bounding_box.min_z); + // max + max_x = Math.max(max_x, bounding_box.max_x); + max_y = Math.max(max_y, bounding_box.max_y); + max_z = Math.max(max_z, bounding_box.max_z); + }); + }); + + // centroid of all the model + var centroid = new THREE.Vector3() + centroid.x = min_x + (max_x - min_x) / 2; + centroid.y = min_y + (max_y - min_y) / 2; + centroid.z = min_z + (max_z - min_z) / 2; + + model.userData.model_centric = true; + model.userData.model_center_offset = new THREE.Vector3(-centroid.x, -centroid.y, -centroid.z) + } + + + if (model_centric === true) { + // Calculate bounding only if needed + // Translate each children + centroid = model.userData.model_center_offset; + model.children.forEach(function(children) { + // Return if children is not given by the user + if (Object.keys(children.userData).length === 0 && children.userData.constructor === Object) {return}; + console.log(children.name) + children.translateX(centroid.x); + children.translateY(centroid.y); + children.translateZ(centroid.z); + }); + } else { + // Revert the translation for each children + if (model.userData.model_centric !== true) {return}; + var centroid = model.userData.model_center_offset; + model.children.forEach(function(children) { + // Return if children is not given by the user + if (Object.keys(children.userData).length === 0 && children.userData.constructor === Object) {return}; + children.translateX(-centroid.x); + children.translateY(-centroid.y); + children.translateZ(-centroid.z); + }); + } + viewer.updated = true; + }; + //////////////////////////////////// // PRIVATE FUNCTIONS //////////////////////////////////// @@ -640,7 +712,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { var delta; var rotation; var position = camera.position; - var new_z = default_camera_distance / viewer.zoom; + var new_z = default_camera_distance / viewer.zoom; window.requestAnimationFrame(renderFrame); From f9fc1382d8e48766cd854fc49ab5d3bc6ad5945e Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Thu, 26 May 2016 11:56:32 -0400 Subject: [PATCH 05/12] Refactor the code --- examples/surface-viewer-demo.html | 2 +- examples/surface-viewer-demo.js | 14 +- .../surface-viewer/modules/rendering.js | 141 ++++++++++-------- 3 files changed, 89 insertions(+), 68 deletions(-) diff --git a/examples/surface-viewer-demo.html b/examples/surface-viewer-demo.html index 033499f0..0ed3770a 100644 --- a/examples/surface-viewer-demo.html +++ b/examples/surface-viewer-demo.html @@ -193,7 +193,7 @@

Views:

- +

diff --git a/examples/surface-viewer-demo.js b/examples/surface-viewer-demo.js index 5c67fb09..a1a61407 100644 --- a/examples/surface-viewer-demo.js +++ b/examples/surface-viewer-demo.js @@ -496,7 +496,7 @@ $(function() { // Origin position $("#model_centric").change(function() { - viewer.model_centric($(this).is(":checked")); + viewer.modelCentric($(this).is(":checked")); }); // Color map URLs are read from the config file and added to the @@ -516,6 +516,7 @@ $(function() { viewer.clearScreen(); current_request = 0; current_request_name = ""; + document.getElementById("model_centric").checked = false; loading_div.hide(); }); @@ -524,8 +525,8 @@ $(function() { if (viewer.model.children.length === 0) return; var annotation_display = $("#annotation-display"); - var media = $("#annotation-media"); - var pick_info = viewer.pick(); + var media = $("#annotation-media"); + var pick_info = viewer.pick(); var model_data, intensity_data; var annotation_info; var value, label, text; @@ -920,10 +921,9 @@ $(function() { viewer.loadModelFromFile(document.getElementById("objfile"), { format: format, complete: function() { - if ($("#model_centric").is(":checked")) { - viewer.model_centric(true); - } - hideLoading(); + document.getElementById("model_centric").checked = true; + viewer.modelCentric(true); + hideLoading(); } }); diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index 4ac3cc9c..a609d046 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -630,38 +630,87 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { return vertex_data; }; - viewer.model_centric = function(model_centric) { + + /** + * @doc function + * @name viewer.rendering:model_centric + * @param {boolean} if true, recenter all userData shape on origin. Otherwise + * return to the original userData. + * + * @description + * Use to recenter data when userData input is shifted in space. + * + * + * ```js + * viewer.modelCentric(true); + * ``` + */ + viewer.modelCentric = function(model_centric=false) { var model = viewer.model; - // Calculate bounding box only if needed - if (model.userData.model_center_offset === undefined) { - // Calculate bounding box for all children given by the user - // ignore other children - var min_x, max_x, min_y, max_y, min_z, max_z; - min_x = min_y = min_z = Number.POSITIVE_INFINITY; - max_x = max_y = max_z = Number.NEGATIVE_INFINITY; - - model.children.forEach(function(children){ - var model_name = children.userData.model_name; - var model_data = viewer.model_data.get(model_name); - - var current_shape = undefined; - var children_name = children.name; - model_data.shapes.forEach(function(shape){ - if (shape.name !== children_name) { return }; - if (children.material.opacity === 0) { return }; - current_shape = shape; - var bounding_box = shape.bounding_box; - - // min - min_x = Math.min(min_x, bounding_box.min_x); - min_y = Math.min(min_y, bounding_box.min_y); - min_z = Math.min(min_z, bounding_box.min_z); - // max - max_x = Math.max(max_x, bounding_box.max_x); - max_y = Math.max(max_y, bounding_box.max_y); - max_z = Math.max(max_z, bounding_box.max_z); - }); + viewer.findUserDataCentroid(model); + + if (model_centric === model.userData.model_centric) {return}; + + // Caculate the offset + var offset_centroid = new THREE.Vector3(); + offset_centroid.copy(model.userData.model_center_offset); + if (model_centric === false) { offset_centroid.negate()}; + + model.children.forEach(function(children) { + // Return if children is not given by the user + if (Object.keys(children.userData).length === 0 && children.userData.constructor === Object) {return}; + children.translateX(offset_centroid.x); + children.translateY(offset_centroid.y); + children.translateZ(offset_centroid.z); + model.userData.model_centric = model_centric; + }); + viewer.updated = true; + }; + + /** + * @doc function + * @name viewer.rendering:findUserDataCentroid + * @param {object} a model. + * + * @description + * Find centroid of the model (only take in account userData). + * + * @returns {object} The initial information with additionnal model_center_offset argument. + * + * ```js + * viewer.findUserDataCentroid(true); + * ``` + */ + viewer.findUserDataCentroid = function(model) { + // Calculate only if needed + if (model.userData.model_center_offset !== undefined) {return}; + + // Calculate bounding box for all children given by the user + // ignore other children + var min_x, max_x, min_y, max_y, min_z, max_z; + min_x = min_y = min_z = Number.POSITIVE_INFINITY; + max_x = max_y = max_z = Number.NEGATIVE_INFINITY; + + model.children.forEach(function(children){ + var model_name = children.userData.model_name; + var model_data = viewer.model_data.get(model_name); + + var current_shape = undefined; + var children_name = children.name; + model_data.shapes.forEach(function(shape){ + if (shape.name !== children_name) { return }; + current_shape = shape; + var bounding_box = shape.bounding_box; + + // min + min_x = Math.min(min_x, bounding_box.min_x); + min_y = Math.min(min_y, bounding_box.min_y); + min_z = Math.min(min_z, bounding_box.min_z); + // max + max_x = Math.max(max_x, bounding_box.max_x); + max_y = Math.max(max_y, bounding_box.max_y); + max_z = Math.max(max_z, bounding_box.max_z); }); // centroid of all the model @@ -670,36 +719,8 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { centroid.y = min_y + (max_y - min_y) / 2; centroid.z = min_z + (max_z - min_z) / 2; - model.userData.model_centric = true; - model.userData.model_center_offset = new THREE.Vector3(-centroid.x, -centroid.y, -centroid.z) - } - - - if (model_centric === true) { - // Calculate bounding only if needed - // Translate each children - centroid = model.userData.model_center_offset; - model.children.forEach(function(children) { - // Return if children is not given by the user - if (Object.keys(children.userData).length === 0 && children.userData.constructor === Object) {return}; - console.log(children.name) - children.translateX(centroid.x); - children.translateY(centroid.y); - children.translateZ(centroid.z); - }); - } else { - // Revert the translation for each children - if (model.userData.model_centric !== true) {return}; - var centroid = model.userData.model_center_offset; - model.children.forEach(function(children) { - // Return if children is not given by the user - if (Object.keys(children.userData).length === 0 && children.userData.constructor === Object) {return}; - children.translateX(-centroid.x); - children.translateY(-centroid.y); - children.translateZ(-centroid.z); - }); - } - viewer.updated = true; + model.userData.model_center_offset = new THREE.Vector3(-centroid.x, -centroid.y, -centroid.z) + }); }; //////////////////////////////////// From 3eaeffde433d3d56995347d5f371e063c86665af Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Thu, 26 May 2016 12:08:40 -0400 Subject: [PATCH 06/12] Make jshint happy --- examples/surface-viewer-demo.js | 2 +- .../surface-viewer/modules/loading.js | 1 - .../surface-viewer/modules/rendering.js | 49 +++++++++---------- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/examples/surface-viewer-demo.js b/examples/surface-viewer-demo.js index a1a61407..8a12a3a2 100644 --- a/examples/surface-viewer-demo.js +++ b/examples/surface-viewer-demo.js @@ -924,7 +924,7 @@ $(function() { document.getElementById("model_centric").checked = true; viewer.modelCentric(true); hideLoading(); - } + } }); return false; diff --git a/src/brainbrowser/surface-viewer/modules/loading.js b/src/brainbrowser/surface-viewer/modules/loading.js index 758ee0b3..9eb7bce1 100644 --- a/src/brainbrowser/surface-viewer/modules/loading.js +++ b/src/brainbrowser/surface-viewer/modules/loading.js @@ -594,7 +594,6 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { var render_depth = options.render_depth; var pick_ignore = options.pick_ignore; var recenter = options.recenter || model_data.split; - var model_centric = options.model_centric; var new_shapes = []; var shape, shape_data; var i, count; diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index a609d046..8e555c2a 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -645,25 +645,26 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { * viewer.modelCentric(true); * ``` */ - viewer.modelCentric = function(model_centric=false) { - var model = viewer.model; + viewer.modelCentric = function(model_centric) { + model_centric = model_centric === undefined ? false : true; + var model = viewer.model; viewer.findUserDataCentroid(model); - if (model_centric === model.userData.model_centric) {return}; + if (model_centric === model.userData.model_centric) {return;} // Caculate the offset var offset_centroid = new THREE.Vector3(); offset_centroid.copy(model.userData.model_center_offset); - if (model_centric === false) { offset_centroid.negate()}; + if (model_centric === false) { offset_centroid.negate();} model.children.forEach(function(children) { // Return if children is not given by the user - if (Object.keys(children.userData).length === 0 && children.userData.constructor === Object) {return}; - children.translateX(offset_centroid.x); - children.translateY(offset_centroid.y); - children.translateZ(offset_centroid.z); - model.userData.model_centric = model_centric; + if (Object.keys(children.userData).length === 0 && children.userData.constructor === Object) {return;} + children.translateX(offset_centroid.x); + children.translateY(offset_centroid.y); + children.translateZ(offset_centroid.z); + model.userData.model_centric = model_centric; }); viewer.updated = true; }; @@ -684,7 +685,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { */ viewer.findUserDataCentroid = function(model) { // Calculate only if needed - if (model.userData.model_center_offset !== undefined) {return}; + if (model.userData.model_center_offset !== undefined) {return;} // Calculate bounding box for all children given by the user // ignore other children @@ -696,30 +697,28 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { var model_name = children.userData.model_name; var model_data = viewer.model_data.get(model_name); - var current_shape = undefined; var children_name = children.name; model_data.shapes.forEach(function(shape){ - if (shape.name !== children_name) { return }; - current_shape = shape; - var bounding_box = shape.bounding_box; - - // min - min_x = Math.min(min_x, bounding_box.min_x); - min_y = Math.min(min_y, bounding_box.min_y); - min_z = Math.min(min_z, bounding_box.min_z); - // max - max_x = Math.max(max_x, bounding_box.max_x); - max_y = Math.max(max_y, bounding_box.max_y); - max_z = Math.max(max_z, bounding_box.max_z); + if (shape.name !== children_name) {return;} + var bounding_box = shape.bounding_box; + + // min + min_x = Math.min(min_x, bounding_box.min_x); + min_y = Math.min(min_y, bounding_box.min_y); + min_z = Math.min(min_z, bounding_box.min_z); + // max + max_x = Math.max(max_x, bounding_box.max_x); + max_y = Math.max(max_y, bounding_box.max_y); + max_z = Math.max(max_z, bounding_box.max_z); }); // centroid of all the model - var centroid = new THREE.Vector3() + var centroid = new THREE.Vector3(); centroid.x = min_x + (max_x - min_x) / 2; centroid.y = min_y + (max_y - min_y) / 2; centroid.z = min_z + (max_z - min_z) / 2; - model.userData.model_center_offset = new THREE.Vector3(-centroid.x, -centroid.y, -centroid.z) + model.userData.model_center_offset = new THREE.Vector3(-centroid.x, -centroid.y, -centroid.z); }); }; From 44a6a357b6325b1fdd2ad0f49a938a1eff482257 Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Thu, 26 May 2016 12:14:01 -0400 Subject: [PATCH 07/12] Remove some spurious code --- src/brainbrowser/surface-viewer/modules/loading.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/brainbrowser/surface-viewer/modules/loading.js b/src/brainbrowser/surface-viewer/modules/loading.js index 9eb7bce1..084d9c14 100644 --- a/src/brainbrowser/surface-viewer/modules/loading.js +++ b/src/brainbrowser/surface-viewer/modules/loading.js @@ -188,7 +188,6 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { * * **pick_ignore** Ignore this object when picking. * * **recenter** Shift object vertex positions to be relative to the centroid (can * help with transparency). - * * **model_centric** the origin of the model will be the center of the model. * * **parse** Parsing options to pass to the worker that will be used to parse the * input file. * @@ -218,7 +217,6 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { * * **pick_ignore** Ignore this object when picking. * * **recenter** Shift object vertex positions to be relative to the centroid (can * help with transparency). - * * **model_centric** the origin of the model will be the center of the model. * * **parse** Parsing options to pass to the worker that will be used to parse the * input file. * @@ -671,7 +669,6 @@ BrainBrowser.SurfaceViewer.modules.loading = function(viewer) { indices: shape_data.indices, normals: model_data.normals, colors: model_data.colors, - model_centric: options.model_centric, }; shape.userData.pick_ignore = pick_ignore; From c70aebceb29cf777fe1b0f94f8478f0b637a80e9 Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Thu, 26 May 2016 12:16:27 -0400 Subject: [PATCH 08/12] Fix typo --- src/brainbrowser/surface-viewer/modules/rendering.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index 8e555c2a..1a1d5c12 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -633,7 +633,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { /** * @doc function - * @name viewer.rendering:model_centric + * @name viewer.rendering:modelCentric * @param {boolean} if true, recenter all userData shape on origin. Otherwise * return to the original userData. * From d0752813163fe4f11c8a20d8bf98b1138bc67c30 Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Thu, 26 May 2016 14:01:55 -0400 Subject: [PATCH 09/12] Bug fix according to Pierre's comments --- examples/surface-viewer-demo.html | 2 +- examples/surface-viewer-demo.js | 3 +++ src/brainbrowser/surface-viewer/modules/rendering.js | 12 +++++++----- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/examples/surface-viewer-demo.html b/examples/surface-viewer-demo.html index 0ed3770a..63046542 100644 --- a/examples/surface-viewer-demo.html +++ b/examples/surface-viewer-demo.html @@ -193,7 +193,7 @@

Views:

- +

diff --git a/examples/surface-viewer-demo.js b/examples/surface-viewer-demo.js index 8a12a3a2..1ee50665 100644 --- a/examples/surface-viewer-demo.js +++ b/examples/surface-viewer-demo.js @@ -923,6 +923,9 @@ $(function() { complete: function() { document.getElementById("model_centric").checked = true; viewer.modelCentric(true); + $("#vertex-data-wrapper").show(); + $("#pick-value-wrapper").show(); + $("#pick-label-wrapper").show(); hideLoading(); } }); diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index 1a1d5c12..22d4a26e 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -215,7 +215,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { centroid.z + offset.z ); } else { - shape.position.set(0 + offset.x, 0 + offset.y, 0 + offset.z); + shape.position.set(offset.x, offset.y, offset.z); } shape.rotation.set(0, 0, 0); shape.material.opacity = 1; @@ -274,8 +274,9 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { sphere.position.set(x, y, z); if (viewer.model) { - var offset = viewer.model.userData.model_center_offset; - if (offset !== undefined) { + var offset = viewer.model.userData.model_center_offset; + var is_centric = viewer.model.userData.model_centric; + if (offset !== undefined && is_centric === true) { sphere.translateX(offset.x); sphere.translateY(offset.y); sphere.translateZ(offset.z); @@ -646,7 +647,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { * ``` */ viewer.modelCentric = function(model_centric) { - model_centric = model_centric === undefined ? false : true; + if (model_centric === undefined) {model_centric = false} var model = viewer.model; viewer.findUserDataCentroid(model); @@ -664,8 +665,9 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { children.translateX(offset_centroid.x); children.translateY(offset_centroid.y); children.translateZ(offset_centroid.z); - model.userData.model_centric = model_centric; }); + model.userData.model_centric = model_centric; + viewer.updated = true; }; From 9f327ea1d1c668e790d88e14f5546fcf95f41124 Mon Sep 17 00:00:00 2001 From: natacha-beck Date: Fri, 27 May 2016 10:23:10 -0400 Subject: [PATCH 10/12] Add missing semicolon. --- src/brainbrowser/surface-viewer/modules/rendering.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index 22d4a26e..2232659b 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -647,7 +647,7 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { * ``` */ viewer.modelCentric = function(model_centric) { - if (model_centric === undefined) {model_centric = false} + if (model_centric === undefined) {model_centric = false;} var model = viewer.model; viewer.findUserDataCentroid(model); From f539d10949ae8677cd912a3c6b419950d72ebf29 Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Fri, 27 May 2016 14:35:41 -0400 Subject: [PATCH 11/12] Fix style --- .../surface-viewer/modules/rendering.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index 22d4a26e..138d858d 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -647,12 +647,16 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { * ``` */ viewer.modelCentric = function(model_centric) { - if (model_centric === undefined) {model_centric = false} + if (model_centric === undefined) { + model_centric = false; + } var model = viewer.model; viewer.findUserDataCentroid(model); - if (model_centric === model.userData.model_centric) {return;} + if (model_centric === model.userData.model_centric) { + return; + } // Caculate the offset var offset_centroid = new THREE.Vector3(); @@ -687,7 +691,9 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { */ viewer.findUserDataCentroid = function(model) { // Calculate only if needed - if (model.userData.model_center_offset !== undefined) {return;} + if (model.userData.model_center_offset !== undefined) { + return; + } // Calculate bounding box for all children given by the user // ignore other children @@ -701,7 +707,9 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { var children_name = children.name; model_data.shapes.forEach(function(shape){ - if (shape.name !== children_name) {return;} + if (shape.name !== children_name) { + return; + } var bounding_box = shape.bounding_box; // min From 9f06f534aaf759bd8a5431f276f80a67bda112ad Mon Sep 17 00:00:00 2001 From: Natacha Beck Date: Fri, 27 May 2016 15:18:09 -0400 Subject: [PATCH 12/12] Fix style --- src/brainbrowser/surface-viewer/modules/rendering.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/brainbrowser/surface-viewer/modules/rendering.js b/src/brainbrowser/surface-viewer/modules/rendering.js index 138d858d..e9959969 100644 --- a/src/brainbrowser/surface-viewer/modules/rendering.js +++ b/src/brainbrowser/surface-viewer/modules/rendering.js @@ -661,11 +661,15 @@ BrainBrowser.SurfaceViewer.modules.rendering = function(viewer) { // Caculate the offset var offset_centroid = new THREE.Vector3(); offset_centroid.copy(model.userData.model_center_offset); - if (model_centric === false) { offset_centroid.negate();} + if (model_centric === false) { + offset_centroid.negate(); + } model.children.forEach(function(children) { // Return if children is not given by the user - if (Object.keys(children.userData).length === 0 && children.userData.constructor === Object) {return;} + if (Object.keys(children.userData).length === 0 && children.userData.constructor === Object) { + return; + } children.translateX(offset_centroid.x); children.translateY(offset_centroid.y); children.translateZ(offset_centroid.z);