@@ -20,6 +20,7 @@ function WebVRManager( renderer ) {
2020
2121 var poseTarget = null ;
2222
23+ var controllers = [ ] ;
2324 var standingMatrix = new Matrix4 ( ) ;
2425 var standingMatrixInverse = new Matrix4 ( ) ;
2526
@@ -83,13 +84,108 @@ function WebVRManager( renderer ) {
8384
8485 //
8586
87+ var isTriggerPressed = false ;
88+
89+ function findGamepad ( id ) {
90+
91+ var gamepads = navigator . getGamepads && navigator . getGamepads ( ) ;
92+
93+ for ( var i = 0 , j = 0 , l = gamepads . length ; i < l ; i ++ ) {
94+
95+ var gamepad = gamepads [ i ] ;
96+
97+ if ( gamepad && ( gamepad . id === 'Daydream Controller' ||
98+ gamepad . id === 'Gear VR Controller' || gamepad . id === 'Oculus Go Controller' ||
99+ gamepad . id === 'OpenVR Gamepad' || gamepad . id . startsWith ( 'Oculus Touch' ) ||
100+ gamepad . id . startsWith ( 'Spatial Controller' ) ) ) {
101+
102+ if ( j === id ) return gamepad ;
103+
104+ j ++ ;
105+
106+ }
107+
108+ }
109+
110+ }
111+
112+ function updateControllers ( ) {
113+
114+ for ( var i = 0 ; i < controllers . length ; i ++ ) {
115+
116+ var controller = controllers [ i ] ;
117+
118+ var gamepad = findGamepad ( i ) ;
119+
120+ if ( gamepad !== undefined && gamepad . pose !== undefined ) {
121+
122+ if ( gamepad . pose === null ) return ;
123+
124+ // Pose
125+
126+ var pose = gamepad . pose ;
127+
128+ if ( pose . hasPosition === false ) controller . position . set ( 0.2 , - 0.6 , - 0.05 ) ;
129+
130+ if ( pose . position !== null ) controller . position . fromArray ( pose . position ) ;
131+ if ( pose . orientation !== null ) controller . quaternion . fromArray ( pose . orientation ) ;
132+ controller . matrix . compose ( controller . position , controller . quaternion , controller . scale ) ;
133+ controller . matrix . premultiply ( standingMatrix ) ;
134+ controller . matrix . decompose ( controller . position , controller . quaternion , controller . scale ) ;
135+ controller . matrixWorldNeedsUpdate = true ;
136+ controller . visible = true ;
137+
138+ // Trigger
139+
140+ var buttonId = gamepad . id === 'Daydream Controller' ? 0 : 1 ;
141+
142+ if ( isTriggerPressed !== gamepad . buttons [ buttonId ] . pressed ) {
143+
144+ isTriggerPressed = gamepad . buttons [ buttonId ] . pressed ;
145+
146+ if ( isTriggerPressed ) {
147+
148+ controller . dispatchEvent ( { type : 'selectstart' } ) ;
149+
150+ } else {
151+
152+ controller . dispatchEvent ( { type : 'selectend' } ) ;
153+ controller . dispatchEvent ( { type : 'select' } ) ;
154+
155+ }
156+
157+ }
158+
159+ } else {
160+
161+ controller . visible = false ;
162+
163+ }
164+
165+ }
166+
167+ }
168+
169+ //
170+
86171 this . enabled = false ;
87172 this . userHeight = 1.6 ;
88173
89174 this . getController = function ( id ) {
90175
91- console . warn ( 'WebVRManager: getController() not yet implemented.' ) ;
92- return new Group ( ) ;
176+ var controller = controllers [ id ] ;
177+
178+ if ( controller === undefined ) {
179+
180+ controller = new Group ( ) ;
181+ controller . matrixAutoUpdate = false ;
182+ controller . visible = false ;
183+
184+ controllers [ id ] = controller ;
185+
186+ }
187+
188+ return controller ;
93189
94190 } ;
95191
@@ -231,6 +327,8 @@ function WebVRManager( renderer ) {
231327
232328 }
233329
330+ updateControllers ( ) ;
331+
234332 return cameraVR ;
235333
236334 } ;
0 commit comments