Skip to content

Commit 72684c5

Browse files
committed
fix(OrientationMarkerWidget): Use bounded square viewport
1 parent 71bd163 commit 72684c5

File tree

3 files changed

+76
-25
lines changed

3 files changed

+76
-25
lines changed

Sources/Interaction/Widgets/OrientationMarkerWidget/api.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
### updateMarkerOrientation()
2+
3+
Manually updates the marker's orientation.
4+
5+
### computeViewport()
6+
7+
Returns the computed viewport size. The format is `[left bottom right top]`.
8+
9+
### updateViewport()
10+
11+
Updates the orientation widget viewport size.
12+
113
### setEnabled(enabling)
214

315
Sets the widget enabled status, i.e. to show the widget or not.
@@ -11,3 +23,14 @@ BOTTOM_LEFT.
1123

1224
Sets the viewport size. The sizeFactor should be between 0.0 and 1.0.
1325
It says how much of the main render window to color. Defaults to 0.2.
26+
27+
### setMinPixelSize(pixelSize)
28+
29+
Sets the minimum side length, in pixels, for the orientation marker widget
30+
viewport. Defaults to 50.
31+
32+
### setMaxPixelSize(pixelSize)
33+
34+
Sets the maximum side length, in pixels, for the orientation marker widget
35+
viewport. Defaults to 200.
36+

Sources/Interaction/Widgets/OrientationMarkerWidget/example/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ orientationWidget.setViewportCorner(
7373
vtkOrientationMarkerWidget.Corners.BOTTOM_RIGHT
7474
);
7575
orientationWidget.setViewportSize(0.15);
76+
orientationWidget.setMinPixelSize(100);
77+
orientationWidget.setMaxPixelSize(300);
7678

7779
renderer.resetCamera();
7880
renderWindow.render();
81+
82+
global.renderWindow = renderWindow;

Sources/Interaction/Widgets/OrientationMarkerWidget/index.js

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,6 @@ import Constants from 'vtk.js/Sources/Interaction/Widgets/OrientationMarkerWidge
66
// vtkOrientationMarkerWidget
77
// ----------------------------------------------------------------------------
88

9-
// depends on Constants.Corners
10-
const VIEWPORTS = {
11-
TOP_LEFT: (size) => [0, 1 - size, size, 1],
12-
TOP_RIGHT: (size) => [1 - size, 1 - size, 1, 1],
13-
BOTTOM_LEFT: (size) => [0, 0, size, size],
14-
BOTTOM_RIGHT: (size) => [1 - size, 0, 1, size],
15-
};
16-
179
function vtkOrientationMarkerWidget(publicAPI, model) {
1810
// Set our className
1911
model.classHierarchy.push('vtkOrientationMarkerWidget');
@@ -23,9 +15,27 @@ function vtkOrientationMarkerWidget(publicAPI, model) {
2315
const selfRenderer = vtkRenderer.newInstance();
2416
let interactorUnsubscribe = null;
2517

26-
// private methods
18+
publicAPI.computeViewport = () => {
19+
const [viewXSize, viewYSize] = model.interactor.getView().getSize();
20+
let pixelSize = model.viewportSize * Math.min(viewXSize, viewYSize);
21+
// clamp pixel size
22+
pixelSize = Math.max(
23+
model.minPixelSize,
24+
Math.min(model.maxPixelSize, pixelSize)
25+
);
26+
27+
const xFrac = pixelSize / viewXSize;
28+
const yFrac = pixelSize / viewYSize;
29+
// [left bottom right top]
30+
return [0, 1 - yFrac, xFrac, 1];
31+
};
32+
33+
publicAPI.updateViewport = () => {
34+
selfRenderer.setViewport(...publicAPI.computeViewport());
35+
model.interactor.render();
36+
};
2737

28-
function updateMarkerOrientation() {
38+
publicAPI.updateMarkerOrientation = () => {
2939
const currentCamera = model.interactor
3040
.findPokedRenderer()
3141
.getActiveCamera();
@@ -34,17 +44,10 @@ function vtkOrientationMarkerWidget(publicAPI, model) {
3444
return;
3545
}
3646

37-
// window.camera = currentCamera;
3847
const state = currentCamera.get('position', 'focalPoint', 'viewUp');
3948
selfRenderer.getActiveCamera().set(state);
4049
selfRenderer.resetCamera();
41-
}
42-
43-
function getViewport() {
44-
return VIEWPORTS[model.viewportCorner](model.viewportSize);
45-
}
46-
47-
// public methods
50+
};
4851

4952
/**
5053
* Enables/Disables the orientation marker.
@@ -81,20 +84,25 @@ function vtkOrientationMarkerWidget(publicAPI, model) {
8184
selfRenderer.addViewProp(model.actor);
8285
model.actor.setVisibility(true);
8386

84-
selfRenderer.setViewport(...getViewport());
85-
8687
const { unsubscribe } = model.interactor.onAnimation(
87-
updateMarkerOrientation
88+
publicAPI.updateMarkerOrientation
8889
);
8990
interactorUnsubscribe = unsubscribe;
9091

92+
window.addEventListener('resize', publicAPI.updateViewport);
93+
94+
publicAPI.updateViewport();
95+
publicAPI.updateMarkerOrientation();
96+
9197
model.enabled = true;
9298
} else {
9399
if (!model.enabled) {
94100
return;
95101
}
96102
model.enabled = false;
97103

104+
window.removeEventListener('resize', publicAPI.updateViewport);
105+
98106
interactorUnsubscribe();
99107
interactorUnsubscribe = null;
100108

@@ -114,19 +122,28 @@ function vtkOrientationMarkerWidget(publicAPI, model) {
114122
* Sets the viewport corner.
115123
*/
116124
publicAPI.setViewportCorner = (corner) => {
125+
if (corner === model.viewportCorner) {
126+
return;
127+
}
128+
117129
model.viewportCorner = corner;
118130
if (model.enabled) {
119-
selfRenderer.setViewport(...getViewport());
131+
publicAPI.updateViewport();
120132
}
121133
};
122134

123135
/**
124136
* Sets the viewport size.
125137
*/
126138
publicAPI.setViewportSize = (sizeFactor) => {
127-
model.viewportSize = Math.min(1, Math.max(0, sizeFactor));
139+
const viewportSize = Math.min(1, Math.max(0, sizeFactor));
140+
if (viewportSize === model.viewportSize) {
141+
return;
142+
}
143+
144+
model.viewportSize = viewportSize;
128145
if (model.enabled) {
129-
selfRenderer.setViewport(...getViewport());
146+
publicAPI.updateViewport();
130147
}
131148
};
132149
}
@@ -140,6 +157,8 @@ export const DEFAULT_VALUES = {
140157
// interactor: null,
141158
viewportCorner: Constants.Corners.BOTTOM_LEFT,
142159
viewportSize: 0.2,
160+
minPixelSize: 50,
161+
maxPixelSize: 200,
143162
};
144163

145164
// ----------------------------------------------------------------------------
@@ -154,7 +173,12 @@ export function extend(publicAPI, model, initialValues = {}) {
154173

155174
// NOTE: setting these while the widget is enabled will
156175
// not update the widget.
157-
macro.setGet(publicAPI, model, ['actor', 'interactor']);
176+
macro.setGet(publicAPI, model, [
177+
'actor',
178+
'interactor',
179+
'minPixelSize',
180+
'maxPixelSize',
181+
]);
158182

159183
// Object methods
160184
vtkOrientationMarkerWidget(publicAPI, model);

0 commit comments

Comments
 (0)