Skip to content

Commit 07137b5

Browse files
committed
fix: crashing app when xr layers are scaled to 0 due to nan values when inveritng a matrix scaled to 0
1 parent e865439 commit 07137b5

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

‎packages/xr/src/layer.ts‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
} from 'three'
1919
import { getSpaceFromAncestors } from './space.js'
2020
import { XRState, XRStore } from './store.js'
21-
import { toDOMPointInit } from './utils.js'
21+
import { nanToDefault, toDOMPointInit } from './utils.js'
2222

2323
export type XRLayerEntry = {
2424
renderOrder: number
@@ -134,8 +134,15 @@ const vectorHelper = new Vector3()
134134
const quaternionHelper = new Quaternion()
135135
const scaleHelper = new Vector3()
136136

137+
/**
138+
* @param matrix is allowed to contain nan values
139+
*/
137140
function matrixToRigidTransform(matrix: Matrix4, scaleTarget: Vector3 = scaleHelper): XRRigidTransform {
141+
//assume matrix can contain nan values
138142
matrix.decompose(vectorHelper, quaternionHelper, scaleTarget)
143+
scaleTarget.x = nanToDefault(scaleTarget.x)
144+
scaleTarget.y = nanToDefault(scaleTarget.y)
145+
scaleTarget.z = nanToDefault(scaleTarget.z)
139146
return new XRRigidTransform(toDOMPointInit(vectorHelper), toDOMPointInit(quaternionHelper))
140147
}
141148

@@ -332,7 +339,7 @@ function applyXRLayerScale(
332339
const radius = scaleXZ
333340
const layerWidth = radius * (centralAngle ?? DefaultCentralAngle)
334341
target.radius = radius
335-
target.aspectRatio = layerWidth / scale.y
342+
target.aspectRatio = scale.y === 0 ? 1 : layerWidth / scale.y
336343
} else if (shape === 'quad') {
337344
target.width = scale.x / 2
338345
target.height = scale.y / 2

‎packages/xr/src/space.ts‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,19 @@ export function createGetXRSpaceMatrix(
2222
}
2323
}
2424

25+
/**
26+
* @param targetOffsetMatrix might contain NaN values as a result of this operation
27+
*/
2528
export function getSpaceFromAncestors(
2629
object: Object3D,
2730
origin: Object3D | undefined,
2831
originReferenceSpace: XRReferenceSpace,
2932
targetOffsetMatrix?: Matrix4,
3033
): XRSpace
3134

35+
/**
36+
* @param targetOffsetMatrix might contain NaN values as a result of this operation
37+
*/
3238
export function getSpaceFromAncestors(
3339
object: Object3D,
3440
origin?: Object3D,

‎packages/xr/src/utils.ts‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
11
import { Quaternion, Vector3 } from 'three'
22

3+
/**
4+
* @param value is allowed to contain nan values
5+
*/
36
export function toDOMPointInit(
47
value: Vector3 | Quaternion | undefined,
58
defaultW: number = 1,
69
): DOMPointInit | undefined {
710
if (value == null) {
811
return undefined
912
}
10-
return { x: value.x, y: value.y, z: value.z, w: 'w' in value ? value.w : defaultW }
13+
return {
14+
x: nanToDefault(value.x),
15+
y: nanToDefault(value.y),
16+
z: nanToDefault(value.z),
17+
w: 'w' in value ? nanToDefault(value.w, defaultW) : defaultW,
18+
}
19+
}
20+
21+
export function nanToDefault(value: number, defaultValue: number = 0): number {
22+
if (isNaN(value)) {
23+
return defaultValue
24+
}
25+
return nanToDefault(value)
1126
}

0 commit comments

Comments
 (0)