|
@@ -41,7 +41,7 @@ class WebXRManager extends EventDispatcher {
|
|
|
let newRenderTarget = null;
|
|
|
|
|
|
const controllers = [];
|
|
|
- const inputSourcesMap = new Map();
|
|
|
+ const controllerInputSources = [];
|
|
|
|
|
|
//
|
|
|
|
|
@@ -118,7 +118,15 @@ class WebXRManager extends EventDispatcher {
|
|
|
|
|
|
function onSessionEvent( event ) {
|
|
|
|
|
|
- const controller = inputSourcesMap.get( event.inputSource );
|
|
|
+ const controllerIndex = controllerInputSources.indexOf( event.inputSource );
|
|
|
+
|
|
|
+ if ( controllerIndex === - 1 ) {
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ const controller = controllers[ controllerIndex ];
|
|
|
|
|
|
if ( controller !== undefined ) {
|
|
|
|
|
@@ -139,17 +147,15 @@ class WebXRManager extends EventDispatcher {
|
|
|
session.removeEventListener( 'end', onSessionEnd );
|
|
|
session.removeEventListener( 'inputsourceschange', onInputSourcesChange );
|
|
|
|
|
|
- inputSourcesMap.forEach( function ( controller, inputSource ) {
|
|
|
-
|
|
|
- if ( controller !== undefined ) {
|
|
|
+ for ( let i = 0; i < controllers.length; i ++ ) {
|
|
|
|
|
|
- controller.disconnect( inputSource );
|
|
|
+ const inputSource = controllerInputSources[ i ];
|
|
|
|
|
|
- }
|
|
|
+ if ( inputSource === null ) continue;
|
|
|
|
|
|
- } );
|
|
|
+ controllers[ i ].disconnect( inputSource );
|
|
|
|
|
|
- inputSourcesMap.clear();
|
|
|
+ }
|
|
|
|
|
|
_currentDepthNear = null;
|
|
|
_currentDepthFar = null;
|
|
@@ -345,28 +351,17 @@ class WebXRManager extends EventDispatcher {
|
|
|
|
|
|
function onInputSourcesChange( event ) {
|
|
|
|
|
|
- const inputSources = session.inputSources;
|
|
|
-
|
|
|
- // Assign controllers to available inputSources
|
|
|
-
|
|
|
- for ( let i = 0; i < inputSources.length; i ++ ) {
|
|
|
-
|
|
|
- const index = inputSources[ i ].handedness === 'right' ? 1 : 0;
|
|
|
- inputSourcesMap.set( inputSources[ i ], controllers[ index ] );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
// Notify disconnected
|
|
|
|
|
|
for ( let i = 0; i < event.removed.length; i ++ ) {
|
|
|
|
|
|
const inputSource = event.removed[ i ];
|
|
|
- const controller = inputSourcesMap.get( inputSource );
|
|
|
+ const index = controllerInputSources.indexOf( inputSource );
|
|
|
|
|
|
- if ( controller ) {
|
|
|
+ if ( index >= 0 ) {
|
|
|
|
|
|
- controller.dispatchEvent( { type: 'disconnected', data: inputSource } );
|
|
|
- inputSourcesMap.delete( inputSource );
|
|
|
+ controllerInputSources[ index ] = null;
|
|
|
+ controllers[ index ].dispatchEvent( { type: 'disconnected', data: inputSource } );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -377,7 +372,38 @@ class WebXRManager extends EventDispatcher {
|
|
|
for ( let i = 0; i < event.added.length; i ++ ) {
|
|
|
|
|
|
const inputSource = event.added[ i ];
|
|
|
- const controller = inputSourcesMap.get( inputSource );
|
|
|
+
|
|
|
+ let controllerIndex = controllerInputSources.indexOf( inputSource );
|
|
|
+
|
|
|
+ if ( controllerIndex === - 1 ) {
|
|
|
+
|
|
|
+ // Assign input source a controller that currently has no input source
|
|
|
+
|
|
|
+ for ( let i = 0; i < controllers.length; i ++ ) {
|
|
|
+
|
|
|
+ if ( i >= controllerInputSources.length ) {
|
|
|
+
|
|
|
+ controllerInputSources.push( inputSource );
|
|
|
+ controllerIndex = i;
|
|
|
+ break;
|
|
|
+
|
|
|
+ } else if ( controllerInputSources[ i ] === null ) {
|
|
|
+
|
|
|
+ controllerInputSources[ i ] = inputSource;
|
|
|
+ controllerIndex = i;
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // If all controllers do currently receive input we ignore new ones
|
|
|
+
|
|
|
+ if ( controllerIndex === - 1 ) break;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ const controller = controllers[ controllerIndex ];
|
|
|
|
|
|
if ( controller ) {
|
|
|
|
|
@@ -667,14 +693,12 @@ class WebXRManager extends EventDispatcher {
|
|
|
|
|
|
//
|
|
|
|
|
|
- const inputSources = session.inputSources;
|
|
|
-
|
|
|
for ( let i = 0; i < controllers.length; i ++ ) {
|
|
|
|
|
|
- const inputSource = inputSources[ i ];
|
|
|
- const controller = inputSourcesMap.get( inputSource );
|
|
|
+ const inputSource = controllerInputSources[ i ];
|
|
|
+ const controller = controllers[ i ];
|
|
|
|
|
|
- if ( controller !== undefined ) {
|
|
|
+ if ( inputSource !== null && controller !== undefined ) {
|
|
|
|
|
|
controller.update( inputSource, frame, customReferenceSpace || referenceSpace );
|
|
|
|