@@ -6,14 +6,6 @@ import Constants from 'vtk.js/Sources/Interaction/Widgets/OrientationMarkerWidge
6
6
// vtkOrientationMarkerWidget
7
7
// ----------------------------------------------------------------------------
8
8
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
-
17
9
function vtkOrientationMarkerWidget ( publicAPI , model ) {
18
10
// Set our className
19
11
model . classHierarchy . push ( 'vtkOrientationMarkerWidget' ) ;
@@ -23,9 +15,27 @@ function vtkOrientationMarkerWidget(publicAPI, model) {
23
15
const selfRenderer = vtkRenderer . newInstance ( ) ;
24
16
let interactorUnsubscribe = null ;
25
17
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
+ } ;
27
37
28
- function updateMarkerOrientation ( ) {
38
+ publicAPI . updateMarkerOrientation = ( ) => {
29
39
const currentCamera = model . interactor
30
40
. findPokedRenderer ( )
31
41
. getActiveCamera ( ) ;
@@ -34,17 +44,10 @@ function vtkOrientationMarkerWidget(publicAPI, model) {
34
44
return ;
35
45
}
36
46
37
- // window.camera = currentCamera;
38
47
const state = currentCamera . get ( 'position' , 'focalPoint' , 'viewUp' ) ;
39
48
selfRenderer . getActiveCamera ( ) . set ( state ) ;
40
49
selfRenderer . resetCamera ( ) ;
41
- }
42
-
43
- function getViewport ( ) {
44
- return VIEWPORTS [ model . viewportCorner ] ( model . viewportSize ) ;
45
- }
46
-
47
- // public methods
50
+ } ;
48
51
49
52
/**
50
53
* Enables/Disables the orientation marker.
@@ -81,20 +84,25 @@ function vtkOrientationMarkerWidget(publicAPI, model) {
81
84
selfRenderer . addViewProp ( model . actor ) ;
82
85
model . actor . setVisibility ( true ) ;
83
86
84
- selfRenderer . setViewport ( ...getViewport ( ) ) ;
85
-
86
87
const { unsubscribe } = model . interactor . onAnimation (
87
- updateMarkerOrientation
88
+ publicAPI . updateMarkerOrientation
88
89
) ;
89
90
interactorUnsubscribe = unsubscribe ;
90
91
92
+ window . addEventListener ( 'resize' , publicAPI . updateViewport ) ;
93
+
94
+ publicAPI . updateViewport ( ) ;
95
+ publicAPI . updateMarkerOrientation ( ) ;
96
+
91
97
model . enabled = true ;
92
98
} else {
93
99
if ( ! model . enabled ) {
94
100
return ;
95
101
}
96
102
model . enabled = false ;
97
103
104
+ window . removeEventListener ( 'resize' , publicAPI . updateViewport ) ;
105
+
98
106
interactorUnsubscribe ( ) ;
99
107
interactorUnsubscribe = null ;
100
108
@@ -114,19 +122,28 @@ function vtkOrientationMarkerWidget(publicAPI, model) {
114
122
* Sets the viewport corner.
115
123
*/
116
124
publicAPI . setViewportCorner = ( corner ) => {
125
+ if ( corner === model . viewportCorner ) {
126
+ return ;
127
+ }
128
+
117
129
model . viewportCorner = corner ;
118
130
if ( model . enabled ) {
119
- selfRenderer . setViewport ( ... getViewport ( ) ) ;
131
+ publicAPI . updateViewport ( ) ;
120
132
}
121
133
} ;
122
134
123
135
/**
124
136
* Sets the viewport size.
125
137
*/
126
138
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 ;
128
145
if ( model . enabled ) {
129
- selfRenderer . setViewport ( ... getViewport ( ) ) ;
146
+ publicAPI . updateViewport ( ) ;
130
147
}
131
148
} ;
132
149
}
@@ -140,6 +157,8 @@ export const DEFAULT_VALUES = {
140
157
// interactor: null,
141
158
viewportCorner : Constants . Corners . BOTTOM_LEFT ,
142
159
viewportSize : 0.2 ,
160
+ minPixelSize : 50 ,
161
+ maxPixelSize : 200 ,
143
162
} ;
144
163
145
164
// ----------------------------------------------------------------------------
@@ -154,7 +173,12 @@ export function extend(publicAPI, model, initialValues = {}) {
154
173
155
174
// NOTE: setting these while the widget is enabled will
156
175
// 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
+ ] ) ;
158
182
159
183
// Object methods
160
184
vtkOrientationMarkerWidget ( publicAPI , model ) ;
0 commit comments