@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.
@@ -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
- export type { PlayClipOptions, ToolData };
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
- if (!(viewport instanceof core_1.StackViewport)) {
26
- throw new Error('playClip: element must be a stack viewport, volume viewport playClip not yet implemented');
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: (_a = playClipOptions.frameTimeVector) !== null && _a !== void 0 ? _a : undefined,
41
- speed: (_b = playClipOptions.frameTimeVectorSpeedMultiplier) !== null && _b !== void 0 ? _b : 1,
42
- reverse: (_c = playClipOptions.reverse) !== null && _c !== void 0 ? _c : false,
43
- loop: (_d = playClipOptions.loop) !== null && _d !== void 0 ? _d : true,
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
- _stopClipWithData(playClipData);
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 === stackData.imageIds.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 stackData = {
65
- targetImageIdIndex: viewport.getTargetImageIdIndex(),
66
- imageIds: viewport.getImageIds(),
67
- };
68
- let newImageIdIndex = stackData.targetImageIdIndex;
69
- const imageCount = stackData.imageIds.length;
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 (newImageIdIndex >= imageCount) {
86
- newImageIdIndex = 0;
79
+ if (newStepIndex >= numScrollSteps) {
80
+ newStepIndex = 0;
87
81
  }
88
- if (newImageIdIndex < 0) {
89
- newImageIdIndex = imageCount - 1;
82
+ else if (newStepIndex < 0) {
83
+ newStepIndex = numScrollSteps - 1;
90
84
  }
91
- if (newImageIdIndex !== stackData.targetImageIdIndex) {
92
- const delta = newImageIdIndex - stackData.targetImageIdIndex;
93
- viewport.scroll(delta, debounced, loop);
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[stackData.targetImageIdIndex]);
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 (!cineToolData) {
122
- return;
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":"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"}
1
+ {"version":3,"file":"playClip.js","sourceRoot":"","sources":["../../../../src/utilities/cine/playClip.ts"],"names":[],"mappings":";;;;;;AAAA,yCAA2C;AAC3C,8CAM6B;AAG7B,sDAAmC;AACnC,mCAAqD;AAErD,uDAA+B;AAE/B,MAAM,EAAE,YAAY,EAAE,GAAG,gBAAO,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,CAAC;AACvB,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,MAAM,wBAAwB,GAAG,IAAI,GAAG,EAAE,CAAC;AAS3C,SAAS,QAAQ,CACf,OAAuB,EACvB,eAA0C;;IAE1C,IAAI,gBAAgB,CAAC;IACrB,IAAI,qBAAqB,CAAC;IAE1B,IAAI,OAAO,KAAK,SAAS,EAAE;QACzB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;KAC5D;IAED,MAAM,cAAc,GAAG,IAAA,wBAAiB,EAAC,OAAO,CAAC,CAAC;IAElD,IAAI,CAAC,cAAc,EAAE;QACnB,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;KACH;IAGD,eAAe,CAAC,kBAAkB;QAChC,MAAA,eAAe,CAAC,kBAAkB,mCAAI,IAAI,CAAC;IAE7C,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC;IACpC,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,sBAAsB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC1E,IAAI,YAAY,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,oBAAoB,GACxB,eAAe,CAAC,kBAAkB,KAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,EAAE,CAAA,CAAC;IAIlE,IAAI,oBAAoB,EAAE;QACxB,sBAAsB,CAAC,OAAO,CAAC,CAAC;KACjC;IAED,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG;YACb,UAAU,EAAE,SAAS;YACrB,eAAe,EAAE,EAAE;YACnB,kBAAkB,EAAE,SAAS;YAC7B,qBAAqB,EAAE,KAAK;YAC5B,oBAAoB,EAAE,KAAK;YAC3B,eAAe,EAAE,MAAA,eAAe,CAAC,eAAe,mCAAI,SAAS;YAC7D,KAAK,EAAE,MAAA,eAAe,CAAC,8BAA8B,mCAAI,CAAC;YAC1D,OAAO,EAAE,MAAA,eAAe,CAAC,OAAO,mCAAI,KAAK;YACzC,IAAI,EAAE,MAAA,eAAe,CAAC,IAAI,mCAAI,IAAI;SACnC,CAAC;QACF,IAAA,oBAAY,EAAC,OAAO,EAAE,YAAY,CAAC,CAAC;KACrC;SAAM;QAIL,SAAS,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;KAC1C;IAED,YAAY,CAAC,kBAAkB,GAAG,eAAe,CAAC,kBAAkB,CAAC;IAGrE,IACE,eAAe,CAAC,eAAe,GAAG,CAAC;QACnC,eAAe,CAAC,eAAe,GAAG,CAAC,EACnC;QACA,YAAY,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QACvE,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC,eAAe,GAAG,CAAC,CAAC;QAExD,YAAY,CAAC,qBAAqB,GAAG,IAAI,CAAC;KAC3C;IAGD,IACE,YAAY,CAAC,qBAAqB,KAAK,IAAI;QAC3C,YAAY,CAAC,eAAe;QAC5B,YAAY,CAAC,eAAe,CAAC,MAAM,KAAK,eAAe,CAAC,cAAc;QACtE,eAAe,CAAC,sBAAsB,EACtC;QACA,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,oBAAoB,CACtD,YAAY,CAAC,eAAe,EAC5B,YAAY,CAAC,KAAK,CACnB,CAAC;QAEF,gBAAgB,GAAG,QAAQ,CAAC;QAC5B,qBAAqB,GAAG,aAAa,CAAC;KACvC;IAGD,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,eAAe,CAAC;QAC7D,IAAI,YAAY,GAAG,gBAAgB,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,sBAAsB,GAC1B,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,cAAc,CAAC;QAErD,IAAI,CAAC,IAAI,IAAI,sBAAsB,EAAE;YAGnC,SAAS,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;YAEzC,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,CAAC;YAEhC,YAAY,CAAC,OAAO,EAAE,gBAAW,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAC7D,OAAO;SACR;QAGD,IAAI,YAAY,IAAI,cAAc,EAAE;YAClC,YAAY,GAAG,CAAC,CAAC;SAClB;aAAM,IAAI,YAAY,GAAG,CAAC,EAAE;YAC3B,YAAY,GAAG,cAAc,GAAG,CAAC,CAAC;SACnC;QAED,MAAM,KAAK,GAAG,YAAY,GAAG,gBAAgB,CAAC;QAE9C,IAAI,KAAK,EAAE;YACT,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC/B;IACH,CAAC,CAAC;IAEF,IAAI,oBAAoB,EAAE;QACxB,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;KACxD;IAID,IACE,gBAAgB;QAChB,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAC3B,qBAAqB,EACrB;QACA,YAAY,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACzC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CACzC,SAAS,sBAAsB;YAC7B,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CACzC,sBAAsB,EACtB,gBAAgB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CACnD,CAAC;YACF,cAAc,EAAE,CAAC;QACnB,CAAC,EACD,CAAC,CACF,CAAC;KACH;SAAM;QAEL,YAAY,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAC1C,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAC1C,cAAc,EACd,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,CAC9C,CAAC;KACH;IAED,MAAM,WAAW,GAAG;QAClB,OAAO;KACR,CAAC;IAEF,YAAY,CAAC,OAAO,EAAE,gBAAW,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAC/D,CAAC;AA4PQ,4BAAQ;AAtPjB,SAAS,QAAQ,CAAC,OAAuB;IACvC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAoPkB,4BAAQ;AAlP3B,SAAS,SAAS,CAAC,OAAuB,EAAE,eAAwB;IAClE,MAAM,cAAc,GAAG,IAAA,wBAAiB,EAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,cAAc;QAAE,OAAO;IAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC;IACpC,MAAM,YAAY,GAAG,IAAA,oBAAY,EAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,YAAY,EAAE;QAChB,iBAAiB,CAAC,YAAY,CAAC,CAAC;KACjC;IAED,IAAI,eAAe,EAAE;QACnB,sBAAsB,CAAC,OAAO,CAAC,CAAC;KACjC;AACH,CAAC;AAMD,SAAS,sBAAsB,CAAC,OAAO;IACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,wBAAiB,EAAC,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAKhD,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,EAAE,EAAE;QAC7B,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEzE,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEjD,IAAI,kBAAkB,IAAI,kBAAkB,KAAK,OAAO,EAAE;YACxD,QAAQ,CAAiB,kBAAkB,CAAC,CAAC;SAC9C;KACF;AACH,CAAC;AASD,SAAS,oBAAoB,CAAC,MAAgB,EAAE,KAAa;IAC3D,IAAI,CAAC,CAAC;IACN,IAAI,MAAM,CAAC;IACX,IAAI,KAAK,CAAC;IACV,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5B,MAAM,QAAQ,GAAG,EAAE,CAAC;IAGpB,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,CAAC,EAAE;QAC3C,KAAK,GAAG,CAAC,CAAC;KACX;IAGD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;QAE1B,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,EAAE;YAEX,MAAM,GAAG,KAAK,CAAC;SAChB;aAAM,IAAI,KAAK,KAAK,MAAM,EAAE;YAC3B,aAAa,GAAG,IAAI,CAAC;SACtB;QAED,GAAG,IAAI,KAAK,CAAC;KACd;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QACvB,IAAI,aAAa,EAAE;YAGjB,KAAK,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACrC;aAAM;YACL,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;SACrB;QAED,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACtB;IAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AACrC,CAAC;AAOD,SAAS,iBAAiB,CAAC,YAAY;IACrC,MAAM,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC;IAEnC,IAAI,OAAO,EAAE,KAAK,WAAW,EAAE;QAC7B,YAAY,CAAC,UAAU,GAAG,SAAS,CAAC;QACpC,IAAI,YAAY,CAAC,oBAAoB,EAAE;YACrC,YAAY,CAAC,EAAE,CAAC,CAAC;SAClB;aAAM;YACL,aAAa,CAAC,EAAE,CAAC,CAAC;SACnB;KACF;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAQ;IACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IAE9C,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/B,OAAO;KACR;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC;IAChC,OAAO,YAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,mCAAmC,CAC1C,QAAuB;IAEvB,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAExC,OAAO;QACL,IAAI,cAAc;YAChB,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,IAAI,gBAAgB;YAClB,OAAO,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QAC1C,CAAC;QACD,IAAI,sBAAsB;YAExB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,KAAa;YAClB,IAAA,gBAAM,EAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oCAAoC,CAC3C,QAAwB,EACxB,MAA0B;IAE1B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,MAAM,gBAAgB,GAAG;QACvB,eAAe,EAAE,gBAAI,CAAC,MAAM,EAAE;QAC9B,UAAU,EAAE,IAAI;KACjB,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,WAAW,GACf,CAAC,gBAAgB,CAAC,UAAU;YAC5B,CAAC,gBAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAKzE,IAAI,WAAW,EAAE;YACf,MAAM,UAAU,GAAG,gBAAO,CAAC,2BAA2B,CACpD,QAAQ,EACR,QAAQ,CACT,CAAC;YAEF,gBAAgB,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;YAC1D,gBAAgB,CAAC,UAAU,GAAG,UAAU,CAAC;SAC1C;QAED,OAAO,gBAAgB,CAAC,UAAU,CAAC;IACrC,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,cAAc;YAChB,OAAO,aAAa,EAAE,CAAC,cAAc,CAAC;QACxC,CAAC;QACD,IAAI,gBAAgB;YAClB,OAAO,aAAa,EAAE,CAAC,gBAAgB,CAAC;QAC1C,CAAC;QACD,IAAI,sBAAsB;YACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,qBAAqB,GAAG,MAAM,CAAC,SAAS;iBAC3C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAiB,CAAC;YAClC,MAAM,GAAG,GAAG,gBAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;YAIpE,OAAO,oBAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,CAAC,KAAa;YAClB,aAAa,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC;YAC1C,IAAA,gBAAM,EAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,2CAA2C,CAClD,MAAiC;IAEjC,OAAO;QACL,IAAI,cAAc;YAChB,OAAO,MAAM,CAAC,aAAa,CAAC;QAC9B,CAAC;QACD,IAAI,gBAAgB;YAClB,OAAO,MAAM,CAAC,cAAc,CAAC;QAC/B,CAAC;QACD,IAAI,sBAAsB;YAExB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,KAAa;YAElB,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,QAAQ,EACR,eAA0C;IAE1C,IAAI,QAAQ,YAAY,oBAAa,EAAE;QACrC,OAAO,mCAAmC,CAAC,QAAQ,CAAC,CAAC;KACtD;IAED,IAAI,QAAQ,YAAY,qBAAc,EAAE;QACtC,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,eAAe,CAAC,kBAAkB,KAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,EAAE,CAAA,EAAE;YACnE,OAAO,2CAA2C,CACrB,MAAM,CAClC,CAAC;SACH;QAED,OAAO,oCAAoC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;KAC/D;IAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;AAC3C,CAAC"}
@@ -17,19 +17,12 @@ function scroll(viewport, options) {
17
17
  }
18
18
  exports.default = scroll;
19
19
  function scrollVolume(viewport, volumeId, delta) {
20
- const camera = viewport.getCamera();
21
- const { focalPoint, viewPlaneNormal, position } = camera;
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 volumeActor = actorEntry.actor;
32
- const sliceRange = core_1.utilities.getSliceRange(volumeActor, viewPlaneNormal, focalPoint);
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,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IACpC,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACzD,MAAM,EAAE,wBAAwB,EAAE,QAAQ,EAAE,GAC1C,gBAAO,CAAC,oCAAoC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE3E,IAAI,CAAC,QAAQ,EAAE;QACb,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,kBAAkB,CAClE,CAAC;KACH;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,QAAQ,CAAC,CAAC;QAC9D,OAAO;KACR;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,KAA0B,CAAC;IAC1D,MAAM,UAAU,GAAG,gBAAO,CAAC,aAAa,CACtC,WAAW,EACX,eAAe,EACf,UAAU,CACX,CAAC;IAEF,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;AA5CD,oCA4CC"}
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
- export type { PlayClipOptions, ToolData };
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 { utilities, getEnabledElement, StackViewport, } from '@cornerstonejs/core';
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
- const { triggerEvent } = utilities;
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
- if (!(viewport instanceof StackViewport)) {
19
- throw new Error('playClip: element must be a stack viewport, volume viewport playClip not yet implemented');
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
- _stopClipWithData(playClipData);
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 === stackData.imageIds.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 stackData = {
58
- targetImageIdIndex: viewport.getTargetImageIdIndex(),
59
- imageIds: viewport.getImageIds(),
60
- };
61
- let newImageIdIndex = stackData.targetImageIdIndex;
62
- const imageCount = stackData.imageIds.length;
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 (newImageIdIndex >= imageCount) {
79
- newImageIdIndex = 0;
72
+ if (newStepIndex >= numScrollSteps) {
73
+ newStepIndex = 0;
80
74
  }
81
- if (newImageIdIndex < 0) {
82
- newImageIdIndex = imageCount - 1;
75
+ else if (newStepIndex < 0) {
76
+ newStepIndex = numScrollSteps - 1;
83
77
  }
84
- if (newImageIdIndex !== stackData.targetImageIdIndex) {
85
- const delta = newImageIdIndex - stackData.targetImageIdIndex;
86
- viewport.scroll(delta, debounced, loop);
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[stackData.targetImageIdIndex]);
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 (!cineToolData) {
114
- return;
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