@@ -23,12 +23,16 @@ type PointerCapture = { intersection: any; object: Object3D };
2323
2424const planeHelper = new Plane ( ) ;
2525const 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
2831const oldInputDevicePointOffset = new Vector3 ( ) ;
2932const inputDeviceQuaternionOffset = new Quaternion ( ) ;
3033
3134const vectorHelper = new Vector3 ( ) ;
35+ const matrixHelper = new Matrix4 ( ) ;
3236const boxSizeHelper = new Vector3 ( ) ;
3337const boxCenterHelper = new Vector3 ( ) ;
3438const 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 ( ) ;
189222function patchedIntersectSphereWithObject (
190223 pointerSphere : any ,
191224 object : Object3D ,
0 commit comments