@kitware/vtk.js 26.7.0 → 26.8.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.
@@ -47,7 +47,9 @@ function vtkRenderWindowInteractor(publicAPI, model) {
47
47
 
48
48
  var animationRequesters = new Set(); // map from pointerId to { pointerId: number, position: [x, y] }
49
49
 
50
- var pointerCache = new Map(); // Public API methods
50
+ var pointerCache = new Map(); // Factor to apply on wheel spin.
51
+
52
+ var wheelCoefficient = 1; // Public API methods
51
53
  //----------------------------------------------------------------------
52
54
 
53
55
  publicAPI.start = function () {
@@ -622,7 +624,27 @@ function vtkRenderWindowInteractor(publicAPI, model) {
622
624
  var callData = _objectSpread(_objectSpread(_objectSpread({}, normalizeWheel(event)), getModifierKeysFor(event)), {}, {
623
625
  position: getScreenEventPositionFor(event),
624
626
  deviceType: getDeviceTypeFor(event)
625
- });
627
+ }); // Wheel events are thought to scroll pages (i.e. multiple lines at once).
628
+ // See normalizeWheel() documentation for more context.
629
+ // While trackpad wheel events are many small (<1) wheel spins,
630
+ // mouse wheel events have absolute spin values higher than 1.
631
+ // Here the first spin value is "recorded", and used to normalize
632
+ // all the following mouse wheel events.
633
+
634
+
635
+ if (model.wheelTimeoutID === 0) {
636
+ // 0.4 is roughly half-way between a large trackpad first event and small
637
+ // mouse wheel first event.
638
+ if (Math.abs(callData.spinY) > 0.4) {
639
+ // Event is coming from mouse wheel
640
+ wheelCoefficient = Math.abs(callData.spinY);
641
+ } else {
642
+ // Event is coming from trackpad
643
+ wheelCoefficient = 1;
644
+ }
645
+ }
646
+
647
+ callData.spinY /= wheelCoefficient;
626
648
 
627
649
  if (model.wheelTimeoutID === 0) {
628
650
  publicAPI.startMouseWheelEvent(callData);
@@ -0,0 +1,10 @@
1
+ export declare enum XrSessionTypes {
2
+ HmdVR = 0,
3
+ MobileAR = 1,
4
+ LookingGlassVR = 2
5
+ }
6
+
7
+ declare const _default: {
8
+ XrSessionTypes: typeof XrSessionTypes;
9
+ };
10
+ export default _default;
@@ -0,0 +1,13 @@
1
+ var XrSessionTypes = {
2
+ HmdVR: 0,
3
+ // Head-mounted display (HMD), two-camera virtual reality session
4
+ MobileAR: 1,
5
+ // Mobile device, single-camera augmented reality session
6
+ LookingGlassVR: 2 // Looking Glass hologram display, N-camera virtual reality session
7
+
8
+ };
9
+ var Constants = {
10
+ XrSessionTypes: XrSessionTypes
11
+ };
12
+
13
+ export { XrSessionTypes, Constants as default };
@@ -232,19 +232,34 @@ export interface vtkOpenGLRenderWindow extends vtkOpenGLRenderWindowBase {
232
232
  get3DContext(options: I3DContextOptions): Nullable<WebGLRenderingContext>;
233
233
 
234
234
  /**
235
- *
235
+ * Request an XR session on the user device with WebXR,
236
+ * typically in response to a user request such as a button press.
236
237
  */
237
- startVR(): void;
238
+ startXR(): void;
239
+
240
+ /**
241
+ * When an XR session is available, set up the XRWebGLLayer
242
+ * and request the first animation frame for the device
243
+ */
244
+ enterXR(): void,
245
+
246
+ /**
247
+ * Adjust world-to-physical parameters for different viewing modalities
248
+ *
249
+ * @param {Number} inputRescaleFactor
250
+ * @param {Number} inputTranslateZ
251
+ */
252
+ resetXRScene(inputRescaleFactor: number, inputTranslateZ: number): void,
238
253
 
239
254
  /**
240
- *
255
+ * Request to stop the current XR session
241
256
  */
242
- stopVR(): void;
257
+ stopXR(): void;
243
258
 
244
259
  /**
245
260
  *
246
261
  */
247
- vrRender(): void;
262
+ xrRender(): void;
248
263
 
249
264
  /**
250
265
  *
@@ -12,10 +12,12 @@ import vtkTextureUnitManager from './TextureUnitManager.js';
12
12
  import vtkViewNodeFactory from './ViewNodeFactory.js';
13
13
  import vtkRenderPass from '../SceneGraph/RenderPass.js';
14
14
  import vtkRenderWindowViewNode from '../SceneGraph/RenderWindowViewNode.js';
15
+ import Constants from './RenderWindow/Constants.js';
15
16
  import { createContextProxyHandler, GET_UNDERLYING_CONTEXT } from './RenderWindow/ContextProxy.js';
16
17
 
17
18
  var vtkDebugMacro = macro.vtkDebugMacro,
18
19
  vtkErrorMacro = macro.vtkErrorMacro;
20
+ var XrSessionTypes = Constants.XrSessionTypes;
19
21
  var SCREENSHOT_PLACEHOLDER = {
20
22
  position: 'absolute',
21
23
  top: 0,
@@ -266,12 +268,13 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
266
268
  // typically in response to a user request such as a button press
267
269
 
268
270
 
269
- publicAPI.startXR = function (isAR) {
271
+ publicAPI.startXR = function (xrSessionType) {
270
272
  if (navigator.xr === undefined) {
271
273
  throw new Error('WebXR is not available');
272
274
  }
273
275
 
274
- model.xrSessionIsAR = isAR;
276
+ model.xrSessionType = xrSessionType !== undefined ? xrSessionType : XrSessionTypes.HmdVR;
277
+ var isAR = xrSessionType === XrSessionTypes.MobileAR;
275
278
  var sessionType = isAR ? 'immersive-ar' : 'immersive-vr';
276
279
 
277
280
  if (!navigator.xr.isSessionSupported(sessionType)) {
@@ -348,16 +351,17 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
348
351
  var inputRescaleFactor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_RESET_FACTORS.vr.rescaleFactor;
349
352
  var inputTranslateZ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_RESET_FACTORS.vr.translateZ;
350
353
  // Adjust world-to-physical parameters for different modalities
351
- // Default parameter values are for VR (model.xrSessionIsAR == false)
354
+ // Default parameter values are for HMD VR
352
355
  var rescaleFactor = inputRescaleFactor;
353
356
  var translateZ = inputTranslateZ;
357
+ var isXrSessionAR = model.xrSessionType === XrSessionTypes.MobileAR;
354
358
 
355
- if (model.xrSessionIsAR && rescaleFactor === DEFAULT_RESET_FACTORS.vr.rescaleFactor) {
359
+ if (isXrSessionAR && rescaleFactor === DEFAULT_RESET_FACTORS.vr.rescaleFactor) {
356
360
  // Scale down by default in AR
357
361
  rescaleFactor = DEFAULT_RESET_FACTORS.ar.rescaleFactor;
358
362
  }
359
363
 
360
- if (model.xrSessionIsAR && translateZ === DEFAULT_RESET_FACTORS.vr.translateZ) {
364
+ if (isXrSessionAR && translateZ === DEFAULT_RESET_FACTORS.vr.translateZ) {
361
365
  // Default closer to the camera in AR
362
366
  translateZ = DEFAULT_RESET_FACTORS.ar.translateZ;
363
367
  }
@@ -444,7 +448,7 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
444
448
  if (xrPose) {
445
449
  gl = publicAPI.get3DContext();
446
450
 
447
- if (model.xrSessionIsAR && model.oldCanvasSize !== undefined) {
451
+ if (model.xrSessionType === XrSessionTypes.MobileAR && model.oldCanvasSize !== undefined) {
448
452
  gl.canvas.width = model.oldCanvasSize[0];
449
453
  gl.canvas.height = model.oldCanvasSize[1];
450
454
  }
@@ -452,16 +456,16 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
452
456
  glLayer = xrSession.renderState.baseLayer;
453
457
  gl.bindFramebuffer(gl.FRAMEBUFFER, glLayer.framebuffer);
454
458
  gl.clear(gl.COLOR_BUFFER_BIT);
455
- gl.clear(gl.DEPTH_BUFFER_BIT); // get the first renderer
459
+ gl.clear(gl.DEPTH_BUFFER_BIT);
460
+ publicAPI.setSize(glLayer.framebufferWidth, glLayer.framebufferHeight); // get the first renderer
456
461
 
457
462
  ren = model.renderable.getRenderers()[0]; // Do a render pass for each eye
458
463
 
459
- xrPose.views.forEach(function (view) {
460
- var viewport = glLayer.getViewport(view);
461
- gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); // TODO: Appropriate handling for AR passthrough on HMDs
464
+ xrPose.views.forEach(function (view, index) {
465
+ var viewport = glLayer.getViewport(view); // TODO: Appropriate handling for AR passthrough on HMDs
462
466
  // with two eyes will require further investigation.
463
467
 
464
- if (!model.xrSessionIsAR) {
468
+ if (model.xrSessionType === XrSessionTypes.HmdVR) {
465
469
  if (view.eye === 'left') {
466
470
  ren.setViewport(0, 0, 0.5, 1.0);
467
471
  } else if (view.eye === 'right') {
@@ -470,12 +474,24 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
470
474
  // No handling for non-eye viewport
471
475
  return;
472
476
  }
477
+ } else if (model.xrSessionType === XrSessionTypes.LookingGlassVR) {
478
+ var startX = viewport.x / glLayer.framebufferWidth;
479
+ var startY = viewport.y / glLayer.framebufferHeight;
480
+ var endX = (viewport.x + viewport.width) / glLayer.framebufferWidth;
481
+ var endY = (viewport.y + viewport.height) / glLayer.framebufferHeight;
482
+ ren.setViewport(startX, startY, endX, endY);
483
+ } else {
484
+ ren.setViewport(0, 0, 1, 1);
473
485
  }
474
486
 
475
487
  ren.getActiveCamera().computeViewParametersFromPhysicalMatrix(view.transform.inverse.matrix);
476
488
  ren.getActiveCamera().setProjectionMatrix(view.projectionMatrix);
477
489
  publicAPI.traverseAllPasses();
478
- });
490
+ }); // Reset scissorbox before any subsequent rendering to external displays
491
+ // on frame end, such as rendering to a Looking Glass display.
492
+
493
+ gl.scissor(0, 0, glLayer.framebufferWidth, glLayer.framebufferHeight);
494
+ gl.disable(gl.SCISSOR_TEST);
479
495
  }
480
496
 
481
497
  case 5:
@@ -919,7 +935,6 @@ var DEFAULT_VALUES = {
919
935
  // attempt webgl2 on by default
920
936
  activeFramebuffer: null,
921
937
  xrSession: null,
922
- xrSessionIsAR: false,
923
938
  xrReferenceSpace: null,
924
939
  xrSupported: true,
925
940
  imageFormat: 'image/png',
package/index.d.ts CHANGED
@@ -191,6 +191,7 @@
191
191
  /// <reference path="./Rendering/Misc/SynchronizableRenderWindow/ObjectManager.d.ts" />
192
192
  /// <reference path="./Rendering/Misc/SynchronizableRenderWindow.d.ts" />
193
193
  /// <reference path="./Rendering/Misc/TextureLODsDownloader.d.ts" />
194
+ /// <reference path="./Rendering/OpenGL/RenderWindow/Constants.d.ts" />
194
195
  /// <reference path="./Rendering/OpenGL/RenderWindow.d.ts" />
195
196
  /// <reference path="./Rendering/SceneGraph/RenderPass.d.ts" />
196
197
  /// <reference path="./Rendering/SceneGraph/ViewNode.d.ts" />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitware/vtk.js",
3
- "version": "26.7.0",
3
+ "version": "26.8.0",
4
4
  "description": "Visualization Toolkit for the Web",
5
5
  "keywords": [
6
6
  "3d",