From 442f99d5eb2ceece7def20e14da59af1dd7d8442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20H=2E=20K=C3=B6hler?= Date: Wed, 8 Nov 2023 18:00:18 -0300 Subject: [PATCH] feat: add VolumeViewport rotation (#3776) --- extensions/cornerstone/src/commandsModule.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 29d244919..526459381 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -3,6 +3,8 @@ import { StackViewport, VolumeViewport, utilities as csUtils, + Types as CoreTypes, + BaseVolumeViewport, } from '@cornerstonejs/core'; import { ToolGroupManager, @@ -11,6 +13,7 @@ import { ReferenceLinesTool, } from '@cornerstonejs/tools'; import { Types as OhifTypes } from '@ohif/core'; +import { vec3, mat4 } from 'gl-matrix'; import CornerstoneViewportDownloadForm from './utils/CornerstoneViewportDownloadForm'; import callInputDialog from './utils/callInputDialog'; @@ -391,8 +394,16 @@ function commandsModule({ const { viewport } = enabledElement; - if (viewport instanceof StackViewport) { - const { rotation: currentRotation } = viewport.getProperties(); + if (viewport instanceof BaseVolumeViewport) { + const camera = viewport.getCamera(); + const rotAngle = (rotation * Math.PI) / 180; + const rotMat = mat4.identity(new Float32Array(16)); + mat4.rotate(rotMat, rotMat, rotAngle, camera.viewPlaneNormal); + const rotatedViewUp = vec3.transformMat4(vec3.create(), camera.viewUp, rotMat); + viewport.setCamera({ viewUp: rotatedViewUp as CoreTypes.Point3 }); + viewport.render(); + } else if (viewport.getRotation !== undefined) { + const currentRotation = viewport.getRotation(); const newRotation = (currentRotation + rotation) % 360; viewport.setProperties({ rotation: newRotation }); viewport.render();