@metacell/geppetto-meta-ui
Version:
React components from geppetto-meta to create neuroscience applications and visualize data.
203 lines (190 loc) • 9.15 kB
JavaScript
import * as THREE from 'three-legacy';
import { stackHelperFactory, orthographicCameraFactory, trackballControlFactory, trackballOrthoControlFactory, localizerHelperFactory } from 'ami.js';
var HelpersStack = stackHelperFactory(THREE);
var CamerasOrthographic = orthographicCameraFactory(THREE);
var ControlsTrackball = trackballControlFactory(THREE);
var ControlsOrthographic = trackballOrthoControlFactory(THREE);
var HelpersLocalizer = localizerHelperFactory(THREE);
var dicomViewerUtils = {
windowResize2D: function windowResize2D(rendererObj) {
var newWidth = rendererObj.domElement.clientWidth;
var newHeight = rendererObj.domElement.clientHeight;
rendererObj.camera.canvas = {
width: newWidth,
height: newHeight
};
rendererObj.camera.fitBox(2, 1);
rendererObj.renderer.setSize(newWidth, newHeight);
/*
* update info to draw borders properly
* TODO: Remove once we are sure to remove the dotted line doesn't have any side effect
* rendererObj.stackHelper.slice.canvasWidth = newWidth;
* rendererObj.stackHelper.slice.canvasHeight = newHeight;
*/
rendererObj.stackHelper.slice.canvasWidth = -1;
rendererObj.stackHelper.slice.canvasHeight = -1;
rendererObj.localizerHelper.canvasWidth = newWidth;
rendererObj.localizerHelper.canvasHeight = newHeight;
},
windowResize3D: function windowResize3D(rendererObj) {
var newWidth = rendererObj.domElement.clientWidth;
var newHeight = rendererObj.domElement.clientHeight;
rendererObj.camera.aspect = newWidth / newHeight;
rendererObj.camera.updateProjectionMatrix();
rendererObj.renderer.setSize(newWidth, newHeight);
},
dispose: function dispose(rendererObj) {
if (rendererObj.stackHelper) {
rendererObj.stackHelper.dispose();
if (rendererObj.stackHelper.stack) {
rendererObj.stackHelper.stack._rawData.length = 0;
rendererObj.stackHelper.stack._frame.length = 0;
rendererObj.stackHelper.stack = null;
}
}
if (rendererObj.localizerHelper) {
if (rendererObj.localizerHelper._mesh) {
rendererObj.localizerHelper.remove(rendererObj.localizerHelper._mesh);
rendererObj.localizerHelper._mesh.geometry.dispose();
rendererObj.localizerHelper._mesh.geometry = null;
rendererObj.localizerHelper._mesh.material.dispose();
rendererObj.localizerHelper._mesh = null;
}
}
},
initHelpersStack: function initHelpersStack(rendererObj, stack) {
if (rendererObj.stackHelper) {
rendererObj.stackHelper.dispose();
if (rendererObj.stackHelper.stack) {
rendererObj.stackHelper.stack._rawData.length = 0;
rendererObj.stackHelper.stack._frame.length = 0;
rendererObj.stackHelper.stack = null;
}
}
rendererObj.stackHelper = new HelpersStack(stack);
rendererObj.stackHelper.bbox.visible = false;
rendererObj.stackHelper.borderColor = rendererObj.sliceColor;
/*
* TODO: Remove once we are sure to remove the dotted line doesn't have any side effect
* rendererObj.stackHelper.slice.canvasWidth = rendererObj.domElement.clientWidth;
* rendererObj.stackHelper.slice.canvasHeight = rendererObj.domElement.clientHeight;
*/
rendererObj.stackHelper.slice.canvasWidth = -1;
rendererObj.stackHelper.slice.canvasHeight = -1;
// set camera
var worldbb = stack.worldBoundingBox();
var lpsDims = new THREE.Vector3((worldbb[1] - worldbb[0]) / 2, (worldbb[3] - worldbb[2]) / 2, (worldbb[5] - worldbb[4]) / 2);
var box = {
center: stack.worldCenter().clone(),
halfDimensions: new THREE.Vector3(lpsDims.x + 5, lpsDims.y + 5, lpsDims.z + 5)
};
// init and zoom
var canvas = {
width: rendererObj.domElement.clientWidth,
height: rendererObj.domElement.clientHeight
};
rendererObj.camera.directions = [stack.xCosine, stack.yCosine, stack.zCosine];
rendererObj.camera.box = box;
rendererObj.camera.canvas = canvas;
rendererObj.camera.orientation = rendererObj.sliceOrientation;
rendererObj.camera.update();
rendererObj.camera.fitBox(2, 1);
rendererObj.stackHelper.orientation = rendererObj.camera.stackOrientation;
rendererObj.stackHelper.index = Math.floor(rendererObj.stackHelper.orientationMaxIndex / 2);
rendererObj.scene.add(rendererObj.stackHelper);
},
initHelpersLocalizer: function initHelpersLocalizer(rendererObj, stack, referencePlane, localizers) {
if (rendererObj.localizerHelper) {
if (rendererObj.localizerHelper._mesh) {
rendererObj.localizerHelper.remove(rendererObj.localizerHelper._mesh);
rendererObj.localizerHelper._mesh.geometry.dispose();
rendererObj.localizerHelper._mesh.geometry = null;
rendererObj.localizerHelper._mesh = null;
}
}
rendererObj.localizerHelper = new HelpersLocalizer(stack, rendererObj.stackHelper.slice.geometry, referencePlane);
for (var i = 0; i < localizers.length; i++) {
rendererObj.localizerHelper['plane' + (i + 1)] = localizers[i].plane;
rendererObj.localizerHelper['color' + (i + 1)] = localizers[i].color;
}
rendererObj.localizerHelper.canvasWidth = rendererObj.domElement.clientWidth;
rendererObj.localizerHelper.canvasHeight = rendererObj.domElement.clientHeight;
rendererObj.localizerScene = new THREE.Scene();
rendererObj.localizerScene.add(rendererObj.localizerHelper);
},
updateLocalizer: function updateLocalizer(refObj, targetLocalizersHelpers) {
var refHelper = refObj.stackHelper;
var localizerHelper = refObj.localizerHelper;
var plane = refHelper.slice.cartesianEquation();
localizerHelper.referencePlane = plane;
// bit of a hack... works fine for this application
for (var i = 0; i < targetLocalizersHelpers.length; i++) {
for (var j = 0; j < 4; j++) {
var targetPlane = targetLocalizersHelpers[i]['plane' + (j + 1)];
if (targetPlane && plane.x === targetPlane.x && plane.y === targetPlane.y && plane.z === targetPlane.z) {
targetLocalizersHelpers[i]['plane' + (j + 1)] = plane;
}
}
}
// update the geometry will create a new mesh
localizerHelper.geometry = refHelper.slice.geometry;
},
initRenderer2D: function initRenderer2D(rendererObj, parentContainer) {
// renderer
rendererObj.domElement = parentContainer.getElementsByClassName(rendererObj.domClass)[0];
rendererObj.domElement.innerHTML = '';
rendererObj.renderer = new THREE.WebGLRenderer({
antialias: true
});
rendererObj.renderer.autoClear = false;
rendererObj.renderer.localClippingEnabled = true;
rendererObj.renderer.setSize(rendererObj.domElement.clientWidth, rendererObj.domElement.clientHeight);
rendererObj.renderer.setClearColor(0x121212, 1);
rendererObj.renderer.setPixelRatio(window.devicePixelRatio);
rendererObj.renderer.domElement.id = rendererObj.targetID;
rendererObj.domElement.appendChild(rendererObj.renderer.domElement);
// camera
rendererObj.camera = new CamerasOrthographic(rendererObj.domElement.clientWidth / -2, rendererObj.domElement.clientWidth / 2, rendererObj.domElement.clientHeight / 2, rendererObj.domElement.clientHeight / -2, 1, 1000);
// controls
rendererObj.controls = new ControlsOrthographic(rendererObj.camera, rendererObj.domElement);
rendererObj.controls.staticMoving = true;
rendererObj.controls.noRotate = true;
rendererObj.controls.noPan = true;
rendererObj.camera.controls = rendererObj.controls;
// scene
rendererObj.scene = new THREE.Scene();
},
initRenderer3D: function initRenderer3D(renderObj, parentContainer) {
// renderer
renderObj.domElement = parentContainer.getElementsByClassName(renderObj.domClass)[0];
renderObj.domElement.innerHTML = '';
renderObj.renderer = new THREE.WebGLRenderer({
antialias: true
});
renderObj.renderer.setSize(renderObj.domElement.clientWidth, renderObj.domElement.clientHeight);
renderObj.renderer.setClearColor(renderObj.color, 1);
renderObj.renderer.domElement.id = renderObj.targetID;
renderObj.domElement.appendChild(renderObj.renderer.domElement);
// camera
renderObj.camera = new THREE.PerspectiveCamera(45, renderObj.domElement.clientWidth / renderObj.domElement.clientHeight, 0.1, 100000);
renderObj.camera.position.x = 250;
renderObj.camera.position.y = 250;
renderObj.camera.position.z = 250;
// controls
renderObj.controls = new ControlsTrackball(renderObj.camera, renderObj.domElement);
renderObj.controls.rotateSpeed = 5.5;
renderObj.controls.zoomSpeed = 0.6;
renderObj.controls.panSpeed = 0.8;
renderObj.controls.staticMoving = true;
renderObj.controls.dynamicDampingFactor = 0.3;
renderObj.controls.minDistance = 80;
renderObj.controls.maxDistance = 500;
// scene
renderObj.scene = new THREE.Scene();
// light
renderObj.light = new THREE.DirectionalLight(0xffffff, 1);
renderObj.light.position.copy(renderObj.camera.position);
renderObj.scene.add(renderObj.light);
}
};
export default dicomViewerUtils;