@@ -17890,6 +17890,84 @@ index 76e09f1f..edefce0e 100644
1789017890
1789117891 gui.addColor(params, 'color').onChange(function (value) {
1789217892 waterNode.color.value.set(value);
17893+ diff --git a/examples-testing/examples/webgpu_xr_cubes.ts b/examples-testing/examples/webgpu_xr_cubes.ts
17894+ index 104e33ae..85925f77 100644
17895+ --- a/examples-testing/examples/webgpu_xr_cubes.ts
17896+ +++ b/examples-testing/examples/webgpu_xr_cubes.ts
17897+ @@ -1,18 +1,22 @@
17898+ -import * as THREE from 'three';
17899+ +import * as THREE from 'three/webgpu';
17900+
17901+ import { BoxLineGeometry } from 'three/addons/geometries/BoxLineGeometry.js';
17902+ import { XRButton } from 'three/addons/webxr/XRButtonGPU.js';
17903+ import { XRControllerModelFactory } from 'three/addons/webxr/XRControllerModelFactory.js';
17904+
17905+ +type CubeMesh = THREE.Mesh<THREE.BufferGeometry, THREE.MeshLambertMaterial> & {
17906+ + currentHex: number;
17907+ +};
17908+ +
17909+ const clock = new THREE.Clock();
17910+
17911+ -let container;
17912+ -let camera, scene, raycaster, renderer;
17913+ +let container: HTMLDivElement;
17914+ +let camera: THREE.PerspectiveCamera, scene: THREE.Scene, raycaster: THREE.Raycaster, renderer: THREE.WebGPURenderer;
17915+
17916+ -let room;
17917+ +let room: THREE.LineSegments;
17918+
17919+ -let controller, controllerGrip;
17920+ -let INTERSECTED;
17921+ +let controller: THREE.XRTargetRaySpace, controllerGrip: THREE.XRGripSpace;
17922+ +let INTERSECTED: CubeMesh | undefined;
17923+
17924+ init();
17925+
17926+ @@ -75,21 +79,21 @@ function init() {
17927+
17928+ //
17929+
17930+ - function onSelectStart() {
17931+ + function onSelectStart(this: THREE.XRTargetRaySpace) {
17932+ this.userData.isSelecting = true;
17933+ }
17934+
17935+ - function onSelectEnd() {
17936+ + function onSelectEnd(this: THREE.XRTargetRaySpace) {
17937+ this.userData.isSelecting = false;
17938+ }
17939+
17940+ controller = renderer.xr.getController(0);
17941+ controller.addEventListener('selectstart', onSelectStart);
17942+ controller.addEventListener('selectend', onSelectEnd);
17943+ - controller.addEventListener('connected', function (event) {
17944+ - this.add(buildController(event.data));
17945+ + controller.addEventListener('connected', function (this: THREE.XRTargetRaySpace, event) {
17946+ + this.add(buildController(event.data)!);
17947+ });
17948+ - controller.addEventListener('disconnected', function () {
17949+ + controller.addEventListener('disconnected', function (this: THREE.XRTargetRaySpace) {
17950+ this.remove(this.children[0]);
17951+ });
17952+ scene.add(controller);
17953+ @@ -107,7 +111,7 @@ function init() {
17954+ document.body.appendChild(XRButton.createButton(renderer));
17955+ }
17956+
17957+ -function buildController(data) {
17958+ +function buildController(data: XRInputSource) {
17959+ let geometry, material;
17960+
17961+ switch (data.targetRayMode) {
17962+ @@ -161,7 +165,7 @@ function animate() {
17963+ if (INTERSECTED != intersects[0].object) {
17964+ if (INTERSECTED) INTERSECTED.material.emissive.setHex(INTERSECTED.currentHex);
17965+
17966+ - INTERSECTED = intersects[0].object;
17967+ + INTERSECTED = intersects[0].object as CubeMesh;
17968+ INTERSECTED.currentHex = INTERSECTED.material.emissive.getHex();
17969+ INTERSECTED.material.emissive.setHex(0xff0000);
17970+ }
1789317971diff --git a/examples-testing/examples/webxr_ar_cones.ts b/examples-testing/examples/webxr_ar_cones.ts
1789417972index 95eb3439..0e641cdb 100644
1789517973--- a/examples-testing/examples/webxr_ar_cones.ts
0 commit comments