Skip to content

Commit 7d02e46

Browse files
committed
[Fix][IWSDK] Fix the distance grabbing scaling issue.
1 parent 546bfb9 commit 7d02e46

1 file changed

Lines changed: 40 additions & 7 deletions

File tree

packages/core/src/grab/pointer-events-patch.ts

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ type PointerCapture = { intersection: any; object: Object3D };
2323

2424
const planeHelper = new Plane();
2525
const helperSphere: Sphere = new Sphere();
26-
const vecHelper = new Vector3();
26+
27+
const rayDirectionHelperMap = new Map<any, Vector3>();
28+
const pointerPositionHelperMap = new Map<any, Vector3>();
29+
const pointerQuaternionHelperMap = new Map<any, Quaternion>();
2730

2831
const oldInputDevicePointOffset = new Vector3();
2932
const inputDeviceQuaternionOffset = new Quaternion();
3033

3134
const vectorHelper = new Vector3();
35+
const matrixHelper = new Matrix4();
3236
const boxSizeHelper = new Vector3();
3337
const boxCenterHelper = new Vector3();
3438
const vec0_0001 = new Vector3(0.0001, 0.0001, 0.0001);
@@ -67,11 +71,29 @@ export function patchedIntersectRayPointerCapture(
6771
const pointOnFace =
6872
ray.intersectPlane(planeHelper, new Vector3()) ?? intersection.point;
6973

74+
let rayDirectionHelper = rayDirectionHelperMap.get(this);
75+
if (!rayDirectionHelper) {
76+
rayDirectionHelper = new Vector3();
77+
rayDirectionHelperMap.set(this, rayDirectionHelper);
78+
}
79+
80+
let pointerPositionHelper = pointerPositionHelperMap.get(this);
81+
if (!pointerPositionHelper) {
82+
pointerPositionHelper = new Vector3();
83+
pointerPositionHelperMap.set(this, pointerPositionHelper);
84+
}
85+
86+
let pointerQuaternionHelper = pointerQuaternionHelperMap.get(this);
87+
if (!pointerQuaternionHelper) {
88+
pointerQuaternionHelper = new Quaternion();
89+
pointerQuaternionHelperMap.set(this, pointerQuaternionHelper);
90+
}
91+
7092
// Preserve distance along the ray from previous intersection
7193
const distanceAlongRay = intersection.pointerPosition.distanceTo(
7294
intersection.point,
7395
);
74-
const point = vecHelper
96+
const point = rayDirectionHelper
7597
.copy(ray.direction)
7698
.multiplyScalar(distanceAlongRay)
7799
.add(ray.origin);
@@ -82,8 +104,8 @@ export function patchedIntersectRayPointerCapture(
82104
object,
83105
pointOnFace,
84106
point,
85-
pointerPosition: ray.origin.clone(),
86-
pointerQuaternion: (this.raycasterQuaternion as Quaternion).clone(),
107+
pointerPosition: pointerPositionHelper.copy(ray.origin),
108+
pointerQuaternion: pointerQuaternionHelper.copy(this.raycasterQuaternion),
87109
};
88110
}
89111

@@ -134,14 +156,26 @@ export function patchedIntersectSpherePointerCapture(
134156
new Vector3(),
135157
);
136158

159+
let pointerPositionHelper = pointerPositionHelperMap.get(this);
160+
if (!pointerPositionHelper) {
161+
pointerPositionHelper = new Vector3();
162+
pointerPositionHelperMap.set(this, pointerPositionHelper);
163+
}
164+
165+
let pointerQuaternionHelper = pointerQuaternionHelperMap.get(this);
166+
if (!pointerQuaternionHelper) {
167+
pointerQuaternionHelper = new Quaternion();
168+
pointerQuaternionHelperMap.set(this, pointerQuaternionHelper);
169+
}
170+
137171
// NOTE: We intentionally skip UV recomputation here for performance.
138172
return {
139173
details: {
140174
type: 'sphere',
141175
},
142176
distance: point.distanceTo(pointOnFace),
143-
pointerPosition: this.fromPosition.clone(),
144-
pointerQuaternion: this.fromQuaternion.clone(),
177+
pointerPosition: pointerPositionHelper.copy(this.fromPosition),
178+
pointerQuaternion: pointerQuaternionHelper.copy(this.fromQuaternion),
145179
object,
146180
point,
147181
pointOnFace,
@@ -185,7 +219,6 @@ function patchedIsSphereIntersectingMesh(
185219
);
186220
}
187221

188-
const matrixHelper = new Matrix4();
189222
function patchedIntersectSphereWithObject(
190223
pointerSphere: any,
191224
object: Object3D,

0 commit comments

Comments
 (0)