@@ -16,6 +16,7 @@ sealed class MainMenu : MonoBehaviour, IMainMenu, IConnectInterfaces, IInstantia
16
16
IRequestFeedback
17
17
{
18
18
const string k_SettingsMenuSectionName = "Settings" ;
19
+ const float k_MaxFlickDuration = 0.3f ;
19
20
20
21
[ SerializeField ]
21
22
ActionMap m_ActionMap ;
@@ -43,6 +44,8 @@ sealed class MainMenu : MonoBehaviour, IMainMenu, IConnectInterfaces, IInstantia
43
44
MainMenuUI m_MainMenuUI ;
44
45
float m_LastRotationInput ;
45
46
MenuHideFlags m_MenuHideFlags = MenuHideFlags . Hidden ;
47
+ float m_RotationInputStartValue ;
48
+ float m_RotationInputStartTime ;
46
49
readonly Dictionary < Type , MainMenuButton > m_ToolButtons = new Dictionary < Type , MainMenuButton > ( ) ;
47
50
readonly Dictionary < ISettingsMenuProvider , GameObject > m_SettingsMenus = new Dictionary < ISettingsMenuProvider , GameObject > ( ) ;
48
51
readonly Dictionary < ISettingsMenuItemProvider , GameObject > m_SettingsMenuItems = new Dictionary < ISettingsMenuItemProvider , GameObject > ( ) ;
@@ -53,7 +56,6 @@ sealed class MainMenu : MonoBehaviour, IMainMenu, IConnectInterfaces, IInstantia
53
56
public List < Type > menuWorkspaces { private get ; set ; }
54
57
public Dictionary < KeyValuePair < Type , Transform > , ISettingsMenuProvider > settingsMenuProviders { get ; set ; }
55
58
public Dictionary < KeyValuePair < Type , Transform > , ISettingsMenuItemProvider > settingsMenuItemProviders { get ; set ; }
56
- public List < ActionMenuData > menuActions { get ; set ; }
57
59
public Transform targetRayOrigin { private get ; set ; }
58
60
public Node node { get ; set ; }
59
61
@@ -62,6 +64,7 @@ sealed class MainMenu : MonoBehaviour, IMainMenu, IConnectInterfaces, IInstantia
62
64
public Transform rayOrigin { private get ; set ; }
63
65
64
66
public Bounds localBounds { get { return m_MainMenuUI . localBounds ; } }
67
+ public int priority { get { return 0 ; } }
65
68
66
69
public bool focus { get { return m_MainMenuUI . hovering ; } }
67
70
@@ -142,23 +145,53 @@ public void ProcessInput(ActionMapInput input, ConsumeControlDelegate consumeCon
142
145
var mainMenuInput = ( MainMenuInput ) input ;
143
146
var rotationInput = - mainMenuInput . rotate . rawValue ;
144
147
145
- consumeControl ( mainMenuInput . rotate ) ;
146
- consumeControl ( mainMenuInput . blockY ) ;
147
-
148
148
const float kFlickDeltaThreshold = 0.5f ;
149
- if ( ( this . GetDeviceType ( ) != DeviceType . Vive && Mathf . Abs ( rotationInput ) >= kFlickDeltaThreshold
150
- && Mathf . Abs ( m_LastRotationInput ) < kFlickDeltaThreshold ) || mainMenuInput . flickFace . wasJustReleased )
149
+
150
+ if ( this . GetDeviceType ( ) == DeviceType . Vive )
151
151
{
152
- m_MainMenuUI . targetFaceIndex += ( int ) Mathf . Sign ( rotationInput ) ;
153
- this . Pulse ( node , m_FaceRotationPulse ) ;
152
+ if ( ! Mathf . Approximately ( rotationInput , 0f ) )
153
+ {
154
+ var time = Time . time ;
155
+ if ( Mathf . Approximately ( m_LastRotationInput , 0f ) )
156
+ {
157
+ // Touch began
158
+ m_RotationInputStartValue = rotationInput ;
159
+ m_RotationInputStartTime = time ;
160
+ }
161
+ else
162
+ {
163
+ // Touch held
164
+ var distance = rotationInput - m_RotationInputStartValue ;
165
+ var lastDistance = m_LastRotationInput - m_RotationInputStartValue ;
166
+ if ( Mathf . Abs ( distance ) >= kFlickDeltaThreshold
167
+ && Mathf . Abs ( lastDistance ) < kFlickDeltaThreshold
168
+ && time - m_RotationInputStartTime < k_MaxFlickDuration )
169
+ {
170
+ m_RotationInputStartValue = rotationInput ;
171
+ m_RotationInputStartTime = time ;
172
+ if ( ! m_MainMenuUI . rotating )
173
+ {
174
+ FlickMenu ( distance ) ;
175
+ }
176
+ }
177
+ }
178
+ }
179
+ }
180
+ else if ( Mathf . Abs ( rotationInput ) >= kFlickDeltaThreshold
181
+ && Mathf . Abs ( m_LastRotationInput ) < kFlickDeltaThreshold )
182
+ {
183
+ FlickMenu ( rotationInput ) ;
154
184
}
155
-
156
- if ( m_MenuHideFlags == 0 )
157
- consumeControl ( mainMenuInput . flickFace ) ;
158
185
159
186
m_LastRotationInput = rotationInput ;
160
187
}
161
188
189
+ void FlickMenu ( float rotationInput )
190
+ {
191
+ m_MainMenuUI . targetFaceIndex += ( int ) Mathf . Sign ( rotationInput ) ;
192
+ this . Pulse ( node , m_FaceRotationPulse ) ;
193
+ }
194
+
162
195
void OnDestroy ( )
163
196
{
164
197
if ( m_MainMenuUI )
@@ -299,6 +332,11 @@ void OnButtonHovered(Transform rayOrigin, Type buttonType, string buttonDescript
299
332
this . PreviewInToolMenuButton ( rayOrigin , buttonType , buttonDescription ) ;
300
333
}
301
334
335
+ void OnToggleHovered ( Transform rayOrigin )
336
+ {
337
+ this . Pulse ( this . RequestNodeFromRayOrigin ( rayOrigin ) , m_ButtonHoverPulse ) ;
338
+ }
339
+
302
340
void SendVisibilityPulse ( )
303
341
{
304
342
this . Pulse ( node , m_MenuHideFlags == 0 ? m_HidePulse : m_ShowPulse ) ;
@@ -333,12 +371,29 @@ void AddSettingsMenu(ISettingsMenuProvider provider, MainMenuUI.ButtonData butto
333
371
{
334
372
buttonData . sectionName = k_SettingsMenuSectionName ;
335
373
336
- CreateFaceButton ( buttonData , tooltip , ( ) =>
374
+ var button = CreateFaceButton ( buttonData , tooltip , ( ) =>
337
375
{
338
376
var instance = m_MainMenuUI . AddSubmenu ( k_SettingsMenuSectionName , provider . settingsMenuPrefab ) ;
339
377
m_SettingsMenus [ provider ] = instance ;
340
378
provider . settingsMenuInstance = instance ;
379
+ AddToggleHaptics ( instance ) ;
341
380
} ) ;
381
+
382
+ button . hovered += OnButtonHovered ;
383
+ button . clicked += OnButtonClicked ;
384
+ }
385
+
386
+ void AddToggleHaptics ( GameObject menuInstance )
387
+ {
388
+ var toggles = menuInstance . GetComponentsInChildren < MainMenuToggle > ( ) ;
389
+ if ( toggles != null && toggles . Length > 0 )
390
+ {
391
+ foreach ( var toggle in toggles )
392
+ {
393
+ toggle . hovered += OnToggleHovered ;
394
+ toggle . clicked += OnButtonClicked ;
395
+ }
396
+ }
342
397
}
343
398
344
399
public void RemoveSettingsMenu ( ISettingsMenuProvider provider )
@@ -359,6 +414,7 @@ public void AddSettingsMenuItem(ISettingsMenuItemProvider provider)
359
414
var instance = m_MainMenuUI . CreateCustomButton ( provider . settingsMenuItemPrefab , k_SettingsMenuSectionName ) ;
360
415
m_SettingsMenuItems [ provider ] = instance ;
361
416
provider . settingsMenuItemInstance = instance ;
417
+ AddToggleHaptics ( instance ) ;
362
418
}
363
419
364
420
public void RemoveSettingsMenuItem ( ISettingsMenuItemProvider provider )
@@ -376,7 +432,7 @@ public void RemoveSettingsMenuItem(ISettingsMenuItemProvider provider)
376
432
377
433
void ShowFeedback ( )
378
434
{
379
- var tooltipText = this . GetDeviceType ( ) == DeviceType . Vive ? "Press to Rotate Menu" : "Rotate Menu" ;
435
+ var tooltipText = this . GetDeviceType ( ) == DeviceType . Vive ? "Swipe to Rotate Menu" : "Rotate Menu" ;
380
436
List < VRInputDevice . VRControl > controls ;
381
437
if ( m_Controls . TryGetValue ( "FlickFace" , out controls ) )
382
438
{
0 commit comments