@cornerstonejs/tools 0.50.2 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/types/CINETypes.d.ts +9 -1
- package/dist/cjs/utilities/cine/playClip.js +150 -44
- package/dist/cjs/utilities/cine/playClip.js.map +1 -1
- package/dist/cjs/utilities/scroll.js +4 -11
- package/dist/cjs/utilities/scroll.js.map +1 -1
- package/dist/esm/types/CINETypes.d.ts +9 -1
- package/dist/esm/utilities/cine/playClip.js +146 -40
- package/dist/esm/utilities/cine/playClip.js.map +1 -1
- package/dist/esm/utilities/scroll.js +4 -11
- package/dist/esm/utilities/scroll.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -3,6 +3,7 @@ declare type PlayClipOptions = {
|
|
|
3
3
|
frameTimeVector?: number[];
|
|
4
4
|
reverse?: boolean;
|
|
5
5
|
loop?: boolean;
|
|
6
|
+
dynamicCineEnabled?: boolean;
|
|
6
7
|
frameTimeVectorSpeedMultiplier?: number;
|
|
7
8
|
};
|
|
8
9
|
interface ToolData {
|
|
@@ -15,5 +16,12 @@ interface ToolData {
|
|
|
15
16
|
speed: number;
|
|
16
17
|
reverse: boolean;
|
|
17
18
|
loop: boolean;
|
|
19
|
+
dynamicCineEnabled?: boolean;
|
|
18
20
|
}
|
|
19
|
-
|
|
21
|
+
declare type CinePlayContext = {
|
|
22
|
+
get numScrollSteps(): number;
|
|
23
|
+
get currentStepIndex(): number;
|
|
24
|
+
get frameTimeVectorEnabled(): boolean;
|
|
25
|
+
scroll(delta: number): void;
|
|
26
|
+
};
|
|
27
|
+
export type { PlayClipOptions, ToolData, CinePlayContext };
|
|
@@ -4,14 +4,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.stopClip = exports.playClip = void 0;
|
|
7
|
+
const gl_matrix_1 = require("gl-matrix");
|
|
7
8
|
const core_1 = require("@cornerstonejs/core");
|
|
8
9
|
const events_1 = __importDefault(require("./events"));
|
|
9
10
|
const state_1 = require("./state");
|
|
11
|
+
const scroll_1 = __importDefault(require("../scroll"));
|
|
10
12
|
const { triggerEvent } = core_1.utilities;
|
|
11
13
|
const debounced = true;
|
|
12
14
|
const loop = true;
|
|
15
|
+
const dynamicVolumesPlayingMap = new Map();
|
|
13
16
|
function playClip(element, playClipOptions) {
|
|
14
|
-
var _a, _b, _c, _d;
|
|
17
|
+
var _a, _b, _c, _d, _e;
|
|
15
18
|
let playClipTimeouts;
|
|
16
19
|
let playClipIsTimeVarying;
|
|
17
20
|
if (element === undefined) {
|
|
@@ -21,15 +24,16 @@ function playClip(element, playClipOptions) {
|
|
|
21
24
|
if (!enabledElement) {
|
|
22
25
|
throw new Error('playClip: element must be a valid Cornerstone enabled element');
|
|
23
26
|
}
|
|
27
|
+
playClipOptions.dynamicCineEnabled =
|
|
28
|
+
(_a = playClipOptions.dynamicCineEnabled) !== null && _a !== void 0 ? _a : true;
|
|
24
29
|
const { viewport } = enabledElement;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
const stackData = {
|
|
29
|
-
targetImageIdIndex: viewport.getTargetImageIdIndex(),
|
|
30
|
-
imageIds: viewport.getImageIds(),
|
|
31
|
-
};
|
|
30
|
+
const volume = _getVolumeFromViewport(viewport);
|
|
31
|
+
const playClipContext = _createCinePlayContext(viewport, playClipOptions);
|
|
32
32
|
let playClipData = (0, state_1.getToolState)(element);
|
|
33
|
+
const isDynamicCinePlaying = playClipOptions.dynamicCineEnabled && (volume === null || volume === void 0 ? void 0 : volume.isDynamicVolume());
|
|
34
|
+
if (isDynamicCinePlaying) {
|
|
35
|
+
_stopDynamicVolumeCine(element);
|
|
36
|
+
}
|
|
33
37
|
if (!playClipData) {
|
|
34
38
|
playClipData = {
|
|
35
39
|
intervalId: undefined,
|
|
@@ -37,16 +41,17 @@ function playClip(element, playClipOptions) {
|
|
|
37
41
|
lastFrameTimeStamp: undefined,
|
|
38
42
|
ignoreFrameTimeVector: false,
|
|
39
43
|
usingFrameTimeVector: false,
|
|
40
|
-
frameTimeVector: (
|
|
41
|
-
speed: (
|
|
42
|
-
reverse: (
|
|
43
|
-
loop: (
|
|
44
|
+
frameTimeVector: (_b = playClipOptions.frameTimeVector) !== null && _b !== void 0 ? _b : undefined,
|
|
45
|
+
speed: (_c = playClipOptions.frameTimeVectorSpeedMultiplier) !== null && _c !== void 0 ? _c : 1,
|
|
46
|
+
reverse: (_d = playClipOptions.reverse) !== null && _d !== void 0 ? _d : false,
|
|
47
|
+
loop: (_e = playClipOptions.loop) !== null && _e !== void 0 ? _e : true,
|
|
44
48
|
};
|
|
45
49
|
(0, state_1.addToolState)(element, playClipData);
|
|
46
50
|
}
|
|
47
51
|
else {
|
|
48
|
-
|
|
52
|
+
_stopClip(element, isDynamicCinePlaying);
|
|
49
53
|
}
|
|
54
|
+
playClipData.dynamicCineEnabled = playClipOptions.dynamicCineEnabled;
|
|
50
55
|
if (playClipOptions.framesPerSecond < 0 ||
|
|
51
56
|
playClipOptions.framesPerSecond > 0) {
|
|
52
57
|
playClipData.framesPerSecond = Number(playClipOptions.framesPerSecond);
|
|
@@ -55,50 +60,42 @@ function playClip(element, playClipOptions) {
|
|
|
55
60
|
}
|
|
56
61
|
if (playClipData.ignoreFrameTimeVector !== true &&
|
|
57
62
|
playClipData.frameTimeVector &&
|
|
58
|
-
playClipData.frameTimeVector.length ===
|
|
63
|
+
playClipData.frameTimeVector.length === playClipContext.numScrollSteps &&
|
|
64
|
+
playClipContext.frameTimeVectorEnabled) {
|
|
59
65
|
const { timeouts, isTimeVarying } = _getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);
|
|
60
66
|
playClipTimeouts = timeouts;
|
|
61
67
|
playClipIsTimeVarying = isTimeVarying;
|
|
62
68
|
}
|
|
63
69
|
const playClipAction = () => {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (playClipData.reverse) {
|
|
71
|
-
newImageIdIndex--;
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
newImageIdIndex++;
|
|
75
|
-
}
|
|
76
|
-
if (!playClipData.loop &&
|
|
77
|
-
(newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {
|
|
78
|
-
_stopClipWithData(playClipData);
|
|
79
|
-
const eventDetail = {
|
|
80
|
-
element,
|
|
81
|
-
};
|
|
70
|
+
const { numScrollSteps, currentStepIndex } = playClipContext;
|
|
71
|
+
let newStepIndex = currentStepIndex + (playClipData.reverse ? -1 : 1);
|
|
72
|
+
const newStepIndexOutOfRange = newStepIndex < 0 || newStepIndex >= numScrollSteps;
|
|
73
|
+
if (!loop && newStepIndexOutOfRange) {
|
|
74
|
+
_stopClip(element, isDynamicCinePlaying);
|
|
75
|
+
const eventDetail = { element };
|
|
82
76
|
triggerEvent(element, events_1.default.CLIP_STOPPED, eventDetail);
|
|
83
77
|
return;
|
|
84
78
|
}
|
|
85
|
-
if (
|
|
86
|
-
|
|
79
|
+
if (newStepIndex >= numScrollSteps) {
|
|
80
|
+
newStepIndex = 0;
|
|
87
81
|
}
|
|
88
|
-
if (
|
|
89
|
-
|
|
82
|
+
else if (newStepIndex < 0) {
|
|
83
|
+
newStepIndex = numScrollSteps - 1;
|
|
90
84
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
85
|
+
const delta = newStepIndex - currentStepIndex;
|
|
86
|
+
if (delta) {
|
|
87
|
+
playClipContext.scroll(delta);
|
|
94
88
|
}
|
|
95
89
|
};
|
|
90
|
+
if (isDynamicCinePlaying) {
|
|
91
|
+
dynamicVolumesPlayingMap.set(volume.volumeId, element);
|
|
92
|
+
}
|
|
96
93
|
if (playClipTimeouts &&
|
|
97
94
|
playClipTimeouts.length > 0 &&
|
|
98
95
|
playClipIsTimeVarying) {
|
|
99
96
|
playClipData.usingFrameTimeVector = true;
|
|
100
97
|
playClipData.intervalId = window.setTimeout(function playClipTimeoutHandler() {
|
|
101
|
-
playClipData.intervalId = window.setTimeout(playClipTimeoutHandler, playClipTimeouts[
|
|
98
|
+
playClipData.intervalId = window.setTimeout(playClipTimeoutHandler, playClipTimeouts[playClipContext.currentStepIndex]);
|
|
102
99
|
playClipAction();
|
|
103
100
|
}, 0);
|
|
104
101
|
}
|
|
@@ -113,17 +110,33 @@ function playClip(element, playClipOptions) {
|
|
|
113
110
|
}
|
|
114
111
|
exports.playClip = playClip;
|
|
115
112
|
function stopClip(element) {
|
|
113
|
+
_stopClip(element, true);
|
|
114
|
+
}
|
|
115
|
+
exports.stopClip = stopClip;
|
|
116
|
+
function _stopClip(element, stopDynamicCine) {
|
|
116
117
|
const enabledElement = (0, core_1.getEnabledElement)(element);
|
|
117
118
|
if (!enabledElement)
|
|
118
119
|
return;
|
|
119
120
|
const { viewport } = enabledElement;
|
|
120
121
|
const cineToolData = (0, state_1.getToolState)(viewport.element);
|
|
121
|
-
if (
|
|
122
|
-
|
|
122
|
+
if (cineToolData) {
|
|
123
|
+
_stopClipWithData(cineToolData);
|
|
124
|
+
}
|
|
125
|
+
if (stopDynamicCine) {
|
|
126
|
+
_stopDynamicVolumeCine(element);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function _stopDynamicVolumeCine(element) {
|
|
130
|
+
const { viewport } = (0, core_1.getEnabledElement)(element);
|
|
131
|
+
const volume = _getVolumeFromViewport(viewport);
|
|
132
|
+
if (volume === null || volume === void 0 ? void 0 : volume.isDynamicVolume()) {
|
|
133
|
+
const dynamicCineElement = dynamicVolumesPlayingMap.get(volume.volumeId);
|
|
134
|
+
dynamicVolumesPlayingMap.delete(volume.volumeId);
|
|
135
|
+
if (dynamicCineElement && dynamicCineElement !== element) {
|
|
136
|
+
stopClip(dynamicCineElement);
|
|
137
|
+
}
|
|
123
138
|
}
|
|
124
|
-
_stopClipWithData(cineToolData);
|
|
125
139
|
}
|
|
126
|
-
exports.stopClip = stopClip;
|
|
127
140
|
function _getPlayClipTimeouts(vector, speed) {
|
|
128
141
|
let i;
|
|
129
142
|
let sample;
|
|
@@ -169,4 +182,97 @@ function _stopClipWithData(playClipData) {
|
|
|
169
182
|
}
|
|
170
183
|
}
|
|
171
184
|
}
|
|
185
|
+
function _getVolumeFromViewport(viewport) {
|
|
186
|
+
const actorEntry = viewport.getDefaultActor();
|
|
187
|
+
if (!actorEntry) {
|
|
188
|
+
console.warn('No actor found');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const volumeId = actorEntry.uid;
|
|
192
|
+
return core_1.cache.getVolume(volumeId);
|
|
193
|
+
}
|
|
194
|
+
function _createStackViewportCinePlayContext(viewport) {
|
|
195
|
+
const imageIds = viewport.getImageIds();
|
|
196
|
+
return {
|
|
197
|
+
get numScrollSteps() {
|
|
198
|
+
return imageIds.length;
|
|
199
|
+
},
|
|
200
|
+
get currentStepIndex() {
|
|
201
|
+
return viewport.getTargetImageIdIndex();
|
|
202
|
+
},
|
|
203
|
+
get frameTimeVectorEnabled() {
|
|
204
|
+
return true;
|
|
205
|
+
},
|
|
206
|
+
scroll(delta) {
|
|
207
|
+
(0, scroll_1.default)(viewport, { delta, debounceLoading: debounced });
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function _createVolumeViewportCinePlayContext(viewport, volume) {
|
|
212
|
+
const { volumeId } = volume;
|
|
213
|
+
const cachedScrollInfo = {
|
|
214
|
+
viewPlaneNormal: gl_matrix_1.vec3.create(),
|
|
215
|
+
scrollInfo: null,
|
|
216
|
+
};
|
|
217
|
+
const getScrollInfo = () => {
|
|
218
|
+
const camera = viewport.getCamera();
|
|
219
|
+
const updateCache = !cachedScrollInfo.scrollInfo ||
|
|
220
|
+
!gl_matrix_1.vec3.equals(camera.viewPlaneNormal, cachedScrollInfo.viewPlaneNormal);
|
|
221
|
+
if (updateCache) {
|
|
222
|
+
const scrollInfo = core_1.utilities.getVolumeViewportScrollInfo(viewport, volumeId);
|
|
223
|
+
cachedScrollInfo.viewPlaneNormal = camera.viewPlaneNormal;
|
|
224
|
+
cachedScrollInfo.scrollInfo = scrollInfo;
|
|
225
|
+
}
|
|
226
|
+
return cachedScrollInfo.scrollInfo;
|
|
227
|
+
};
|
|
228
|
+
return {
|
|
229
|
+
get numScrollSteps() {
|
|
230
|
+
return getScrollInfo().numScrollSteps;
|
|
231
|
+
},
|
|
232
|
+
get currentStepIndex() {
|
|
233
|
+
return getScrollInfo().currentStepIndex;
|
|
234
|
+
},
|
|
235
|
+
get frameTimeVectorEnabled() {
|
|
236
|
+
const camera = viewport.getCamera();
|
|
237
|
+
const volumeViewPlaneNormal = volume.direction
|
|
238
|
+
.slice(6, 9)
|
|
239
|
+
.map((x) => -x);
|
|
240
|
+
const dot = gl_matrix_1.vec3.dot(volumeViewPlaneNormal, camera.viewPlaneNormal);
|
|
241
|
+
return gl_matrix_1.glMatrix.equals(dot, 1);
|
|
242
|
+
},
|
|
243
|
+
scroll(delta) {
|
|
244
|
+
getScrollInfo().currentStepIndex += delta;
|
|
245
|
+
(0, scroll_1.default)(viewport, { delta });
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function _createDynamicVolumeViewportCinePlayContext(volume) {
|
|
250
|
+
return {
|
|
251
|
+
get numScrollSteps() {
|
|
252
|
+
return volume.numTimePoints;
|
|
253
|
+
},
|
|
254
|
+
get currentStepIndex() {
|
|
255
|
+
return volume.timePointIndex;
|
|
256
|
+
},
|
|
257
|
+
get frameTimeVectorEnabled() {
|
|
258
|
+
return false;
|
|
259
|
+
},
|
|
260
|
+
scroll(delta) {
|
|
261
|
+
volume.timePointIndex += delta;
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function _createCinePlayContext(viewport, playClipOptions) {
|
|
266
|
+
if (viewport instanceof core_1.StackViewport) {
|
|
267
|
+
return _createStackViewportCinePlayContext(viewport);
|
|
268
|
+
}
|
|
269
|
+
if (viewport instanceof core_1.VolumeViewport) {
|
|
270
|
+
const volume = _getVolumeFromViewport(viewport);
|
|
271
|
+
if (playClipOptions.dynamicCineEnabled && (volume === null || volume === void 0 ? void 0 : volume.isDynamicVolume())) {
|
|
272
|
+
return _createDynamicVolumeViewportCinePlayContext(volume);
|
|
273
|
+
}
|
|
274
|
+
return _createVolumeViewportCinePlayContext(viewport, volume);
|
|
275
|
+
}
|
|
276
|
+
throw new Error('Unknown viewport type');
|
|
277
|
+
}
|
|
172
278
|
//# sourceMappingURL=playClip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playClip.js","sourceRoot":"","sources":["../../../../src/utilities/cine/playClip.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"playClip.js","sourceRoot":"","sources":["../../../../src/utilities/cine/playClip.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,19 +17,12 @@ function scroll(viewport, options) {
|
|
|
17
17
|
}
|
|
18
18
|
exports.default = scroll;
|
|
19
19
|
function scrollVolume(viewport, volumeId, delta) {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
const { spacingInNormalDirection, actorUID } = core_1.utilities.getTargetVolumeAndSpacingInNormalDir(viewport, camera, volumeId);
|
|
23
|
-
if (!actorUID) {
|
|
24
|
-
throw new Error(`Could not find image volume with id ${volumeId} in the viewport`);
|
|
25
|
-
}
|
|
26
|
-
const actorEntry = viewport.getActor(actorUID);
|
|
27
|
-
if (!actorEntry) {
|
|
28
|
-
console.warn('No actor found for with actorUID of', actorUID);
|
|
20
|
+
const sliceRangeInfo = core_1.utilities.getVolumeSliceRangeInfo(viewport, volumeId);
|
|
21
|
+
if (!sliceRangeInfo) {
|
|
29
22
|
return;
|
|
30
23
|
}
|
|
31
|
-
const
|
|
32
|
-
const
|
|
24
|
+
const { sliceRange, spacingInNormalDirection, camera } = sliceRangeInfo;
|
|
25
|
+
const { focalPoint, viewPlaneNormal, position } = camera;
|
|
33
26
|
const { newFocalPoint, newPosition } = core_1.utilities.snapFocalPointToSlice(focalPoint, position, sliceRange, viewPlaneNormal, spacingInNormalDirection, delta);
|
|
34
27
|
viewport.setCamera({
|
|
35
28
|
focalPoint: newFocalPoint,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll.js","sourceRoot":"","sources":["../../../src/utilities/scroll.ts"],"names":[],"mappings":";;;AAAA,8CAK6B;AAY7B,SAAwB,MAAM,CAC5B,QAAsD,EACtD,OAAsB;IAEtB,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEpC,IAAI,QAAQ,YAAY,oBAAa,EAAE;QACrC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;KACjD;SAAM,IAAI,QAAQ,YAAY,qBAAc,EAAE;QAC7C,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;KACzC;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;KACvE;AACH,CAAC;AAdD,yBAcC;AAED,SAAgB,YAAY,CAC1B,QAAwB,EACxB,QAAgB,EAChB,KAAa;IAEb,MAAM,
|
|
1
|
+
{"version":3,"file":"scroll.js","sourceRoot":"","sources":["../../../src/utilities/scroll.ts"],"names":[],"mappings":";;;AAAA,8CAK6B;AAY7B,SAAwB,MAAM,CAC5B,QAAsD,EACtD,OAAsB;IAEtB,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEpC,IAAI,QAAQ,YAAY,oBAAa,EAAE;QACrC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;KACjD;SAAM,IAAI,QAAQ,YAAY,qBAAc,EAAE;QAC7C,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;KACzC;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;KACvE;AACH,CAAC;AAdD,yBAcC;AAED,SAAgB,YAAY,CAC1B,QAAwB,EACxB,QAAgB,EAChB,KAAa;IAEb,MAAM,cAAc,GAAG,gBAAO,CAAC,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE3E,IAAI,CAAC,cAAc,EAAE;QACnB,OAAO;KACR;IAED,MAAM,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;IACxE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAEzD,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,gBAAO,CAAC,qBAAqB,CAClE,UAAU,EACV,QAAQ,EACR,UAAU,EACV,eAAe,EACf,wBAAwB,EACxB,KAAK,CACN,CAAC;IAEF,QAAQ,CAAC,SAAS,CAAC;QACjB,UAAU,EAAE,aAAa;QACzB,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAC;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC;AACpB,CAAC;AA5BD,oCA4BC"}
|
|
@@ -3,6 +3,7 @@ declare type PlayClipOptions = {
|
|
|
3
3
|
frameTimeVector?: number[];
|
|
4
4
|
reverse?: boolean;
|
|
5
5
|
loop?: boolean;
|
|
6
|
+
dynamicCineEnabled?: boolean;
|
|
6
7
|
frameTimeVectorSpeedMultiplier?: number;
|
|
7
8
|
};
|
|
8
9
|
interface ToolData {
|
|
@@ -15,5 +16,12 @@ interface ToolData {
|
|
|
15
16
|
speed: number;
|
|
16
17
|
reverse: boolean;
|
|
17
18
|
loop: boolean;
|
|
19
|
+
dynamicCineEnabled?: boolean;
|
|
18
20
|
}
|
|
19
|
-
|
|
21
|
+
declare type CinePlayContext = {
|
|
22
|
+
get numScrollSteps(): number;
|
|
23
|
+
get currentStepIndex(): number;
|
|
24
|
+
get frameTimeVectorEnabled(): boolean;
|
|
25
|
+
scroll(delta: number): void;
|
|
26
|
+
};
|
|
27
|
+
export type { PlayClipOptions, ToolData, CinePlayContext };
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { glMatrix, vec3 } from 'gl-matrix';
|
|
2
|
+
import { utilities as csUtils, getEnabledElement, StackViewport, VolumeViewport, cache, } from '@cornerstonejs/core';
|
|
2
3
|
import CINE_EVENTS from './events';
|
|
3
4
|
import { addToolState, getToolState } from './state';
|
|
4
|
-
|
|
5
|
+
import scroll from '../scroll';
|
|
6
|
+
const { triggerEvent } = csUtils;
|
|
5
7
|
const debounced = true;
|
|
6
8
|
const loop = true;
|
|
9
|
+
const dynamicVolumesPlayingMap = new Map();
|
|
7
10
|
function playClip(element, playClipOptions) {
|
|
8
11
|
let playClipTimeouts;
|
|
9
12
|
let playClipIsTimeVarying;
|
|
@@ -14,15 +17,16 @@ function playClip(element, playClipOptions) {
|
|
|
14
17
|
if (!enabledElement) {
|
|
15
18
|
throw new Error('playClip: element must be a valid Cornerstone enabled element');
|
|
16
19
|
}
|
|
20
|
+
playClipOptions.dynamicCineEnabled =
|
|
21
|
+
playClipOptions.dynamicCineEnabled ?? true;
|
|
17
22
|
const { viewport } = enabledElement;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
const stackData = {
|
|
22
|
-
targetImageIdIndex: viewport.getTargetImageIdIndex(),
|
|
23
|
-
imageIds: viewport.getImageIds(),
|
|
24
|
-
};
|
|
23
|
+
const volume = _getVolumeFromViewport(viewport);
|
|
24
|
+
const playClipContext = _createCinePlayContext(viewport, playClipOptions);
|
|
25
25
|
let playClipData = getToolState(element);
|
|
26
|
+
const isDynamicCinePlaying = playClipOptions.dynamicCineEnabled && volume?.isDynamicVolume();
|
|
27
|
+
if (isDynamicCinePlaying) {
|
|
28
|
+
_stopDynamicVolumeCine(element);
|
|
29
|
+
}
|
|
26
30
|
if (!playClipData) {
|
|
27
31
|
playClipData = {
|
|
28
32
|
intervalId: undefined,
|
|
@@ -38,8 +42,9 @@ function playClip(element, playClipOptions) {
|
|
|
38
42
|
addToolState(element, playClipData);
|
|
39
43
|
}
|
|
40
44
|
else {
|
|
41
|
-
|
|
45
|
+
_stopClip(element, isDynamicCinePlaying);
|
|
42
46
|
}
|
|
47
|
+
playClipData.dynamicCineEnabled = playClipOptions.dynamicCineEnabled;
|
|
43
48
|
if (playClipOptions.framesPerSecond < 0 ||
|
|
44
49
|
playClipOptions.framesPerSecond > 0) {
|
|
45
50
|
playClipData.framesPerSecond = Number(playClipOptions.framesPerSecond);
|
|
@@ -48,50 +53,42 @@ function playClip(element, playClipOptions) {
|
|
|
48
53
|
}
|
|
49
54
|
if (playClipData.ignoreFrameTimeVector !== true &&
|
|
50
55
|
playClipData.frameTimeVector &&
|
|
51
|
-
playClipData.frameTimeVector.length ===
|
|
56
|
+
playClipData.frameTimeVector.length === playClipContext.numScrollSteps &&
|
|
57
|
+
playClipContext.frameTimeVectorEnabled) {
|
|
52
58
|
const { timeouts, isTimeVarying } = _getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);
|
|
53
59
|
playClipTimeouts = timeouts;
|
|
54
60
|
playClipIsTimeVarying = isTimeVarying;
|
|
55
61
|
}
|
|
56
62
|
const playClipAction = () => {
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (playClipData.reverse) {
|
|
64
|
-
newImageIdIndex--;
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
newImageIdIndex++;
|
|
68
|
-
}
|
|
69
|
-
if (!playClipData.loop &&
|
|
70
|
-
(newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {
|
|
71
|
-
_stopClipWithData(playClipData);
|
|
72
|
-
const eventDetail = {
|
|
73
|
-
element,
|
|
74
|
-
};
|
|
63
|
+
const { numScrollSteps, currentStepIndex } = playClipContext;
|
|
64
|
+
let newStepIndex = currentStepIndex + (playClipData.reverse ? -1 : 1);
|
|
65
|
+
const newStepIndexOutOfRange = newStepIndex < 0 || newStepIndex >= numScrollSteps;
|
|
66
|
+
if (!loop && newStepIndexOutOfRange) {
|
|
67
|
+
_stopClip(element, isDynamicCinePlaying);
|
|
68
|
+
const eventDetail = { element };
|
|
75
69
|
triggerEvent(element, CINE_EVENTS.CLIP_STOPPED, eventDetail);
|
|
76
70
|
return;
|
|
77
71
|
}
|
|
78
|
-
if (
|
|
79
|
-
|
|
72
|
+
if (newStepIndex >= numScrollSteps) {
|
|
73
|
+
newStepIndex = 0;
|
|
80
74
|
}
|
|
81
|
-
if (
|
|
82
|
-
|
|
75
|
+
else if (newStepIndex < 0) {
|
|
76
|
+
newStepIndex = numScrollSteps - 1;
|
|
83
77
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
78
|
+
const delta = newStepIndex - currentStepIndex;
|
|
79
|
+
if (delta) {
|
|
80
|
+
playClipContext.scroll(delta);
|
|
87
81
|
}
|
|
88
82
|
};
|
|
83
|
+
if (isDynamicCinePlaying) {
|
|
84
|
+
dynamicVolumesPlayingMap.set(volume.volumeId, element);
|
|
85
|
+
}
|
|
89
86
|
if (playClipTimeouts &&
|
|
90
87
|
playClipTimeouts.length > 0 &&
|
|
91
88
|
playClipIsTimeVarying) {
|
|
92
89
|
playClipData.usingFrameTimeVector = true;
|
|
93
90
|
playClipData.intervalId = window.setTimeout(function playClipTimeoutHandler() {
|
|
94
|
-
playClipData.intervalId = window.setTimeout(playClipTimeoutHandler, playClipTimeouts[
|
|
91
|
+
playClipData.intervalId = window.setTimeout(playClipTimeoutHandler, playClipTimeouts[playClipContext.currentStepIndex]);
|
|
95
92
|
playClipAction();
|
|
96
93
|
}, 0);
|
|
97
94
|
}
|
|
@@ -105,15 +102,31 @@ function playClip(element, playClipOptions) {
|
|
|
105
102
|
triggerEvent(element, CINE_EVENTS.CLIP_STARTED, eventDetail);
|
|
106
103
|
}
|
|
107
104
|
function stopClip(element) {
|
|
105
|
+
_stopClip(element, true);
|
|
106
|
+
}
|
|
107
|
+
function _stopClip(element, stopDynamicCine) {
|
|
108
108
|
const enabledElement = getEnabledElement(element);
|
|
109
109
|
if (!enabledElement)
|
|
110
110
|
return;
|
|
111
111
|
const { viewport } = enabledElement;
|
|
112
112
|
const cineToolData = getToolState(viewport.element);
|
|
113
|
-
if (
|
|
114
|
-
|
|
113
|
+
if (cineToolData) {
|
|
114
|
+
_stopClipWithData(cineToolData);
|
|
115
|
+
}
|
|
116
|
+
if (stopDynamicCine) {
|
|
117
|
+
_stopDynamicVolumeCine(element);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function _stopDynamicVolumeCine(element) {
|
|
121
|
+
const { viewport } = getEnabledElement(element);
|
|
122
|
+
const volume = _getVolumeFromViewport(viewport);
|
|
123
|
+
if (volume?.isDynamicVolume()) {
|
|
124
|
+
const dynamicCineElement = dynamicVolumesPlayingMap.get(volume.volumeId);
|
|
125
|
+
dynamicVolumesPlayingMap.delete(volume.volumeId);
|
|
126
|
+
if (dynamicCineElement && dynamicCineElement !== element) {
|
|
127
|
+
stopClip(dynamicCineElement);
|
|
128
|
+
}
|
|
115
129
|
}
|
|
116
|
-
_stopClipWithData(cineToolData);
|
|
117
130
|
}
|
|
118
131
|
function _getPlayClipTimeouts(vector, speed) {
|
|
119
132
|
let i;
|
|
@@ -160,5 +173,98 @@ function _stopClipWithData(playClipData) {
|
|
|
160
173
|
}
|
|
161
174
|
}
|
|
162
175
|
}
|
|
176
|
+
function _getVolumeFromViewport(viewport) {
|
|
177
|
+
const actorEntry = viewport.getDefaultActor();
|
|
178
|
+
if (!actorEntry) {
|
|
179
|
+
console.warn('No actor found');
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const volumeId = actorEntry.uid;
|
|
183
|
+
return cache.getVolume(volumeId);
|
|
184
|
+
}
|
|
185
|
+
function _createStackViewportCinePlayContext(viewport) {
|
|
186
|
+
const imageIds = viewport.getImageIds();
|
|
187
|
+
return {
|
|
188
|
+
get numScrollSteps() {
|
|
189
|
+
return imageIds.length;
|
|
190
|
+
},
|
|
191
|
+
get currentStepIndex() {
|
|
192
|
+
return viewport.getTargetImageIdIndex();
|
|
193
|
+
},
|
|
194
|
+
get frameTimeVectorEnabled() {
|
|
195
|
+
return true;
|
|
196
|
+
},
|
|
197
|
+
scroll(delta) {
|
|
198
|
+
scroll(viewport, { delta, debounceLoading: debounced });
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
function _createVolumeViewportCinePlayContext(viewport, volume) {
|
|
203
|
+
const { volumeId } = volume;
|
|
204
|
+
const cachedScrollInfo = {
|
|
205
|
+
viewPlaneNormal: vec3.create(),
|
|
206
|
+
scrollInfo: null,
|
|
207
|
+
};
|
|
208
|
+
const getScrollInfo = () => {
|
|
209
|
+
const camera = viewport.getCamera();
|
|
210
|
+
const updateCache = !cachedScrollInfo.scrollInfo ||
|
|
211
|
+
!vec3.equals(camera.viewPlaneNormal, cachedScrollInfo.viewPlaneNormal);
|
|
212
|
+
if (updateCache) {
|
|
213
|
+
const scrollInfo = csUtils.getVolumeViewportScrollInfo(viewport, volumeId);
|
|
214
|
+
cachedScrollInfo.viewPlaneNormal = camera.viewPlaneNormal;
|
|
215
|
+
cachedScrollInfo.scrollInfo = scrollInfo;
|
|
216
|
+
}
|
|
217
|
+
return cachedScrollInfo.scrollInfo;
|
|
218
|
+
};
|
|
219
|
+
return {
|
|
220
|
+
get numScrollSteps() {
|
|
221
|
+
return getScrollInfo().numScrollSteps;
|
|
222
|
+
},
|
|
223
|
+
get currentStepIndex() {
|
|
224
|
+
return getScrollInfo().currentStepIndex;
|
|
225
|
+
},
|
|
226
|
+
get frameTimeVectorEnabled() {
|
|
227
|
+
const camera = viewport.getCamera();
|
|
228
|
+
const volumeViewPlaneNormal = volume.direction
|
|
229
|
+
.slice(6, 9)
|
|
230
|
+
.map((x) => -x);
|
|
231
|
+
const dot = vec3.dot(volumeViewPlaneNormal, camera.viewPlaneNormal);
|
|
232
|
+
return glMatrix.equals(dot, 1);
|
|
233
|
+
},
|
|
234
|
+
scroll(delta) {
|
|
235
|
+
getScrollInfo().currentStepIndex += delta;
|
|
236
|
+
scroll(viewport, { delta });
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function _createDynamicVolumeViewportCinePlayContext(volume) {
|
|
241
|
+
return {
|
|
242
|
+
get numScrollSteps() {
|
|
243
|
+
return volume.numTimePoints;
|
|
244
|
+
},
|
|
245
|
+
get currentStepIndex() {
|
|
246
|
+
return volume.timePointIndex;
|
|
247
|
+
},
|
|
248
|
+
get frameTimeVectorEnabled() {
|
|
249
|
+
return false;
|
|
250
|
+
},
|
|
251
|
+
scroll(delta) {
|
|
252
|
+
volume.timePointIndex += delta;
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function _createCinePlayContext(viewport, playClipOptions) {
|
|
257
|
+
if (viewport instanceof StackViewport) {
|
|
258
|
+
return _createStackViewportCinePlayContext(viewport);
|
|
259
|
+
}
|
|
260
|
+
if (viewport instanceof VolumeViewport) {
|
|
261
|
+
const volume = _getVolumeFromViewport(viewport);
|
|
262
|
+
if (playClipOptions.dynamicCineEnabled && volume?.isDynamicVolume()) {
|
|
263
|
+
return _createDynamicVolumeViewportCinePlayContext(volume);
|
|
264
|
+
}
|
|
265
|
+
return _createVolumeViewportCinePlayContext(viewport, volume);
|
|
266
|
+
}
|
|
267
|
+
throw new Error('Unknown viewport type');
|
|
268
|
+
}
|
|
163
269
|
export { playClip, stopClip };
|
|
164
270
|
//# sourceMappingURL=playClip.js.map
|