From 2770a2c869d068760dd87e064897c5cb10467726 Mon Sep 17 00:00:00 2001 From: Raanan Weber Date: Tue, 20 Sep 2022 16:28:06 +0200 Subject: [PATCH 1/5] differentiate between xr and xr-near --- packages/dev/core/src/XR/features/WebXRNearInteraction.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dev/core/src/XR/features/WebXRNearInteraction.ts b/packages/dev/core/src/XR/features/WebXRNearInteraction.ts index 68b88802de9..7fb1c47c2be 100644 --- a/packages/dev/core/src/XR/features/WebXRNearInteraction.ts +++ b/packages/dev/core/src/XR/features/WebXRNearInteraction.ts @@ -614,7 +614,7 @@ export class WebXRNearInteraction extends WebXRAbstractFeature { const controllerData = this._controllers[xrController.uniqueId]; const pointerEventInit: PointerEventInit = { pointerId: controllerData.id, - pointerType: "xr", + pointerType: "xr-near", }; controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => { if ( @@ -766,7 +766,7 @@ export class WebXRNearInteraction extends WebXRAbstractFeature { // Fire a pointerup const pointerEventInit: PointerEventInit = { pointerId: controllerData.id, - pointerType: "xr", + pointerType: "xr-near", }; this._scene.simulatePointerUp(new PickingInfo(), pointerEventInit); }); From 50d259a66f76f92d3933b677ad8316e3412da51c Mon Sep 17 00:00:00 2001 From: Raanan Weber Date: Tue, 20 Sep 2022 16:28:46 +0200 Subject: [PATCH 2/5] if pickResult of the scene was provided use it --- packages/dev/core/src/Events/pointerEvents.ts | 5 +++++ packages/dev/core/src/Inputs/scene.inputManager.ts | 1 + 2 files changed, 6 insertions(+) diff --git a/packages/dev/core/src/Events/pointerEvents.ts b/packages/dev/core/src/Events/pointerEvents.ts index de36cf7e75c..1368c9406cf 100644 --- a/packages/dev/core/src/Events/pointerEvents.ts +++ b/packages/dev/core/src/Events/pointerEvents.ts @@ -75,6 +75,11 @@ export class PointerInfoPre extends PointerInfoBase { */ public nearInteractionPickingInfo: Nullable; + /** + * The original picking info that was used to trigger the pointer event + */ + public originalPickingInfo: Nullable = null; + /** * Defines the local position of the pointer on the canvas. */ diff --git a/packages/dev/core/src/Inputs/scene.inputManager.ts b/packages/dev/core/src/Inputs/scene.inputManager.ts index c57692db107..d09bf63f54e 100644 --- a/packages/dev/core/src/Inputs/scene.inputManager.ts +++ b/packages/dev/core/src/Inputs/scene.inputManager.ts @@ -248,6 +248,7 @@ export class InputManager { const scene = this._scene; const pi = new PointerInfoPre(type, evt, this._unTranslatedPointerX, this._unTranslatedPointerY); if (pickResult) { + pi.originalPickingInfo = pickResult; pi.ray = pickResult.ray; if (pickResult.originMesh) { pi.nearInteractionPickingInfo = pickResult; From 9a9c0fd52ed096b68d26989a42ed994b49cd1e21 Mon Sep 17 00:00:00 2001 From: Raanan Weber Date: Tue, 20 Sep 2022 16:29:12 +0200 Subject: [PATCH 3/5] behave differently for near interactions only --- .../src/Behaviors/Meshes/baseSixDofDragBehavior.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts b/packages/dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts index f63115675fe..9bc5a807644 100644 --- a/packages/dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts +++ b/packages/dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts @@ -296,7 +296,7 @@ export class BaseSixDofDragBehavior implements Behavior { this._virtualMeshesInfo[pointerId] = this._createVirtualMeshInfo(); } const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; - const isXRPointer = (pointerInfo.event).pointerType === "xr"; + const isXRNearPointer = (pointerInfo.event).pointerType === "xr-near"; if (pointerInfo.type == PointerEventTypes.POINTERDOWN) { if ( @@ -306,7 +306,7 @@ export class BaseSixDofDragBehavior implements Behavior { pointerInfo.pickInfo.pickedMesh && pointerInfo.pickInfo.pickedPoint && pointerInfo.pickInfo.ray && - (!isXRPointer || pointerInfo.pickInfo.aimTransform) && + (!isXRNearPointer || pointerInfo.pickInfo.aimTransform) && pickPredicate(pointerInfo.pickInfo.pickedMesh) ) { if (!this.allowMultiPointer && this.currentDraggingPointerIds.length > 0) { @@ -325,7 +325,7 @@ export class BaseSixDofDragBehavior implements Behavior { this._ownerNode.computeWorldMatrix(true); const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; - if (isXRPointer) { + if (isXRNearPointer) { this._dragging = pointerInfo.pickInfo.originMesh ? this._dragType.NEAR_DRAG : this._dragType.DRAG_WITH_CONTROLLER; virtualMeshesInfo.originMesh.position.copyFrom(pointerInfo.pickInfo.aimTransform!.position); if (this._dragging === this._dragType.NEAR_DRAG && pointerInfo.pickInfo.gripTransform) { @@ -351,7 +351,7 @@ export class BaseSixDofDragBehavior implements Behavior { virtualMeshesInfo.startingOrientation.copyFrom(virtualMeshesInfo.dragMesh.rotationQuaternion!); virtualMeshesInfo.startingPivotOrientation.copyFrom(virtualMeshesInfo.pivotMesh.rotationQuaternion!); - if (isXRPointer) { + if (isXRNearPointer) { virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.dragMesh); virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.pivotMesh); } else { @@ -415,7 +415,7 @@ export class BaseSixDofDragBehavior implements Behavior { } this._ownerNode.computeWorldMatrix(true); - if (!isXRPointer) { + if (!isXRNearPointer) { this._pointerUpdate2D(pointerInfo.pickInfo.ray!, pointerId, zDragFactor); } else { this._pointerUpdateXR(pointerInfo.pickInfo.aimTransform!, pointerInfo.pickInfo.gripTransform, pointerId, zDragFactor); From 4c751c434ca3a632961e3c853eb84ea7bdab5692 Mon Sep 17 00:00:00 2001 From: Raanan Weber Date: Tue, 20 Sep 2022 16:29:33 +0200 Subject: [PATCH 4/5] use originalScene pick if possible --- .../core/src/Rendering/utilityLayerRenderer.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/dev/core/src/Rendering/utilityLayerRenderer.ts b/packages/dev/core/src/Rendering/utilityLayerRenderer.ts index 02e72d230de..654961cc8fb 100644 --- a/packages/dev/core/src/Rendering/utilityLayerRenderer.ts +++ b/packages/dev/core/src/Rendering/utilityLayerRenderer.ts @@ -205,6 +205,8 @@ export class UtilityLayerRenderer implements IDisposable { } else { scenePick = new PickingInfo(); } + } else if (prePointerInfo.originalPickingInfo) { + scenePick = prePointerInfo.originalPickingInfo; } else { let previousActiveCamera: Nullable = null; // If a camera is set for rendering with this layer @@ -290,18 +292,20 @@ export class UtilityLayerRenderer implements IDisposable { if (!prePointerInfo.skipOnPointerObservable) { prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0; } - } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance > originalScenePick.distance) { + } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance >= originalScenePick.distance) { // We have a pick in both scenes but main is closer than utility // We touched an utility mesh present in the main scene if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) { this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent); prePointerInfo.skipOnPointerObservable = true; - } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) { - if (this._lastPointerEvents[pointerEvent.pointerId]) { - // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete - this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId); - delete this._lastPointerEvents[pointerEvent.pointerId]; + } else { + if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) { + if (this._lastPointerEvents[pointerEvent.pointerId]) { + // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete + this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId); + delete this._lastPointerEvents[pointerEvent.pointerId]; + } } this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent); } From 9bf415ffadfcda838b21662aa7943881029d3701 Mon Sep 17 00:00:00 2001 From: Raanan Weber Date: Tue, 20 Sep 2022 17:40:08 +0200 Subject: [PATCH 5/5] original pick only for original scene --- packages/dev/core/src/Rendering/utilityLayerRenderer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dev/core/src/Rendering/utilityLayerRenderer.ts b/packages/dev/core/src/Rendering/utilityLayerRenderer.ts index 654961cc8fb..63b43a9d7b0 100644 --- a/packages/dev/core/src/Rendering/utilityLayerRenderer.ts +++ b/packages/dev/core/src/Rendering/utilityLayerRenderer.ts @@ -205,7 +205,7 @@ export class UtilityLayerRenderer implements IDisposable { } else { scenePick = new PickingInfo(); } - } else if (prePointerInfo.originalPickingInfo) { + } else if (scene !== this.utilityLayerScene && prePointerInfo.originalPickingInfo) { scenePick = prePointerInfo.originalPickingInfo; } else { let previousActiveCamera: Nullable = null;