@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.
- package/Rendering/Core/RenderWindowInteractor.js +24 -2
- package/Rendering/OpenGL/RenderWindow/Constants.d.ts +10 -0
- package/Rendering/OpenGL/RenderWindow/Constants.js +13 -0
- package/Rendering/OpenGL/RenderWindow.d.ts +20 -5
- package/Rendering/OpenGL/RenderWindow.js +28 -13
- package/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -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(); //
|
|
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,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
|
-
|
|
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
|
-
|
|
257
|
+
stopXR(): void;
|
|
243
258
|
|
|
244
259
|
/**
|
|
245
260
|
*
|
|
246
261
|
*/
|
|
247
|
-
|
|
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 (
|
|
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.
|
|
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
|
|
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 (
|
|
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 (
|
|
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.
|
|
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);
|
|
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 (
|
|
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" />
|