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);