Search Unity

Rewired - Advanced Input for Unity

Discussion in 'Assets and Asset Store' started by guavaman, Sep 25, 2014.

  1. ninuxw

    ninuxw

    Joined:
    Jul 8, 2014
    Posts:
    26
    I appreciate your swift response, LoadDefaultMaps was what I needed and it worked like charm! Regarding the wrapper, you are right its not a PP wrapper, it works with a custom UserDataStore_PlayerPrefs I made replaciong all the PlayerPref calls!

    Cheers! Made my day ^^
     
  2. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    @aftokinito I have updated to Windows 10 1709 16299.125 and have re-done all the tests. Everything works as expected.

    I'm guessing there's some other unknown factor on your system causing this issue such as some 3rd party tool that creates emulated XInput devices like VJoy, DS4Win, etc., a 3rd party Xbox controller driver, or some other similar situation. I suggest looking at device manager and seeing what devices show up as Xbox controllers and remove them and uninstall their drivers. Windows should replace the driver the next time you use the device.

    You can test XInput using the script I posted in the previous message. If that has no problems, the next step can only be that I create debug builds for you to run to see what I can learn. Please contact me on the web support form to begin this process so this can be done by email.
     
    Last edited: Jan 19, 2018
  3. tigerwoodsisao

    tigerwoodsisao

    Joined:
    Mar 8, 2015
    Posts:
    17
    Hi! Is there a limit to the number of controllers that can be used?
     
  4. longroadhwy

    longroadhwy

    Joined:
    May 4, 2014
    Posts:
    1,551
    You can set the maximum number of controllers you want to use per player. See Exhibit A for a screen shot. The field circled in blue (Max Joysticks Per Player field) specifically.

    Depending on what operating system limits and USB limit and what method being used being used for access. The USB limit is 127 devices. For operating systems like Windows Xinput (that limits to 4 gamepad devices). But RawInput and Direct Input you have much higher limits.

    I use Raw Input (Windows) most of the time and I usually set my per player controller limit at 100 controllers (Max Joysticks Per Player field). That way I should not have to worry how many controllers that the end user has plugging in on the system. I only use powered USB hubs and not normal usb hubs.

    My game is a flight simulation type so my controller mix (Joysticks, Flight yokes, Rudder pedals, Throttles, HOTAS, etc.) can be quite large compared to typical setup. Especially since I do not know what the end user will have on their system when it comes to controllers.

    Having 30 controllers plugged in concurrently is something I have tried in the past and it works fine. That was mostly flight controllers but I also added racing wheels, gamepads and few other unique USB devices.

    Exhibit A:

    Rewired_max_controllers_per_player_limit_100.JPG
     
    guavaman likes this.
  5. tigerwoodsisao

    tigerwoodsisao

    Joined:
    Mar 8, 2015
    Posts:
    17
    Thank you for answering!
    I understand. If my controller supports RawInput, DirectInput, there is no limit on the number of controllers.
    In the example you answered, you could set multiple controllers for 1 Player. If one controller is associated with 1 Player, is there no limit on the number of players?
     
  6. IceBeamGames

    IceBeamGames

    Joined:
    Feb 9, 2014
    Posts:
    170
    Hey guavaman.

    I'm having a small problem using the custom controller mapper supplied with rewired. I have an action called "Attack" and "Defend". These are button type actions that, by default, I am assigning to the analogue triggers in the "Joystick Maps".

    When I open the Control Mapper, the "Attack" and "Defend" buttons aren't assign on the joystick (although the work in game fine) and when I try and assign them in game, the custom mapper warms me that these actions are already assigned. (I have attached a shot of my mapper with the attack and defend actions missing assigned controls).

    I assume I have set-up something wrong, but I don't really know what. Could you point me in the right direction?
     

    Attached Files:

  7. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    After a bunch of trial and error, I've come to the conclusion you must have done this to get this result:
    1. You've created your map specifically for the Xbox 360 controller and not the Dual Analog Gamepad Template. The Dual Analog Gamepad Template's triggers are defined as buttons as opposed to axes and don't allow "Full Axis" mappings to be made in the editor.
    2. You've left the Axis Range set to "Full" and assigned this to a button-type Action.
    fewafew.png
    3. Control Mapper cannot display a "full axis" mapping for a button-type Action because "Full Axis" mappings only apply to axis-type Actions and there is a separate field for axis-type Actions for "full axis" mappings. When assigning an axis to a button-type Action using Control Mapper, it will create a Positive or Negative mapping, never a "Full Axis" mapping.
    4. Change the Axis Range to "Positive."
     
    Last edited: Jan 19, 2018
    IceBeamGames likes this.
  8. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    There is no limit. See the feature list on the website.
     
  9. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    Rewired 1.1.10.0 is now live on the Unity Asset Store! Please see Updating Rewired before updating.

    Release Notes:

    1.1.10.0:

    API Changes:
    - Added InputMapper.Options.isElementAllowedCallback property.
    - Added InputMapper.ConflictResponse.Ignore enumeration value.

    Bug Fixes:
    - Input Mapper: Fixed issue causing conflict found event responses to be ignored.
     
  10. aftokinito

    aftokinito

    Joined:
    Jan 30, 2013
    Posts:
    10
    64 bit Windows only.

    Yes, I used a new project to test the demo you suggested.

    I haven't got any external software for input handling installed, this machine is purely dedicated for development so it is as clean as one can get, I only got a few development tools Like Unity, Rider, Maven, Python and Node.js installed.

    I will try the XInput script as soon as I arrive at the office on Monday and if that doesn't work, I will contact you through the support form.

    Thanks for the help.
     
  11. IceBeamGames

    IceBeamGames

    Joined:
    Feb 9, 2014
    Posts:
    170
    Ah, I was on the right lines. But I've actually created a Dual Analog Gamepad Template AND a 360 template, an Xbox ONE template, a Dual Shock 3 and Dual Shock 4 template. My game is coming out for various platforms, and I need to cert on those platforms, so the safest options seemed to be to make profiles for all major platform controllers.

    I made all the various gamepad "Attack" and "Defend" maps to be positive only and that seems to have fixed stuff.

    Might be an idea to perhaps restrict button mapping to positive or negative only in the rewired editor then? Means other people can't make my stupid mistakes... :)
     
  12. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    There's no advantage to doing that. The only thing that does is cause you to have to make changes in multiple places should you decide to change your default mappings. The only time you would ever need to create a gamepad-specific Controller Map is if that controller has some elements on it that are not covered by the Dual Analog Gamepad Template such as the DS4's touchpad button. Otherwise, there's no reason to do this.

    I cannot do this without changing the triggers to button-type element identifiers on every controller which would screw up everyone's existing data because triggers would now show up as button mappings instead of axis mappings. The editor restricts triggers to Positive/Negative mappings for Dual Analog Gamepad Template because the triggers are defined as buttons in the template and the maps are converted over to controller-specific axis maps at runtime.

    This issue only affects Control Mapper. It's perfectly legal to map a trigger as a full axis to a button-type Action in Rewired. A trigger is just an axis and axes can have full axis mappings applied to them. I cannot restrict this in the editor because a trigger is not a special type of axis. And even if I did by adding some metadata to identify triggers as a special axis type, you could still perform this full axis mapping to a button Action in code. Control Mapper cannot display a full axis on a button-type Action because of the way it displays input fields. The only band-aid I can possibly do is to change Control Mapper to have special-case code to look for this scenario and display full axis mappings for button-type action fields. This means changing all those functions that handle input fields for buttons to very specific code all the way up the chain instead of the generalized code as it current is.

    Edit: Turns out there may be an easy way to hack Control Mapper to display this special case for button-type Actions.

    Code (csharp):
    1. Change line 2153 to:
    2. if(aem.axisRange == AxisRange.Full && ReInput.mapping.GetAction(actionSet.actionId).type != InputActionType.Button) continue;
    This needs to be tested in more scenarios to make sure it doesn't introduce any other issues.

    Additionally, inverting one of these full axis trigger mappings to a button-type Action will not show the inversion state in Control Mapper because inversion of full axis mappings is only displayed in the full axis input field, not the button input field.
     
    Last edited: Jan 20, 2018
  13. djgriff

    djgriff

    Joined:
    May 29, 2014
    Posts:
    279
    @guavaman Thanks for the detailed reply. Sorry for the delayed reply life has got me on my toes and busy as. I will go through the hit list and come back to you shortly. Greatly appreciated. Thaanks

    Daniel
     
  14. aftokinito

    aftokinito

    Joined:
    Jan 30, 2013
    Posts:
    10
    Hey @guavaman,

    I have finally found what was causing my issues. I have recently been integrating Discord Rich Presence into our game and for some reason Discord in developer mode was hooking into Unity, both the Editor and the Standalone player and this seems to be causing a conflict with either Rewired or XInput. The moment I disabled the developer mode on Discord the issue disappearerd.

    I will get in touch with Discord's gamedev support and see if this is a known issue and/or whether is there a fix. I will keep you updated since this might also affect other people.
     
  15. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    Thanks for the update.

    Does Discord run even when you start a new Unity project? Because you said before that you were still having the same issue in a new project.

    I don't know how Discord could be causing a problem, but it's possible they hook the XInput dll ito intercept and/or modify information received from it like Steam does with Raw Input.

    Edit: I installed Discord and enabled the overlay on my test application and was unable to get any crash with 4 copies of it running with an Xbox 360 controller plugged in. Is there anything specific you're doing to your Discord setup? I did notice when enabling and disabling the overlay using Shift + Backquote that Shift sometimes gets stuck on after disabling it. This would appear to be another case of improper Raw Input key event forwarding by Discord, just like the same scenario with Steam. It would appear these "overlay" systems Windows event interception and forwarding do not work very well.
     
    Last edited: Jan 23, 2018
  16. longroadhwy

    longroadhwy

    Joined:
    May 4, 2014
    Posts:
    1,551
  17. longroadhwy

    longroadhwy

    Joined:
    May 4, 2014
    Posts:
    1,551
    @guavaman

    I forgot to mention VKB has a new throttle under development. It will be interesting what the price point will be compared to a standalone Warthog throttle. One of the key features it has a digital interface so you can more panels to the base unit.

    http://forum.vkb-sim.pro/viewtopic.php?f=26&t=2880
     
  18. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    No. That's some crazy DIY project. He even went to the effort to use a laser cutter. Impressive.

    Very nice throttle! The prospect of adding additional units to the main device is intriguing. Depending on how they choose to handle this in the HID device would determine whether any of this could be detected and mapped using a controller definition.
     
  19. longroadhwy

    longroadhwy

    Joined:
    May 4, 2014
    Posts:
    1,551
    Just looking at the bill of materials it looks like the price point would not be too bad. After looking at that I was just thinking PI Engineer's RailDriver would work almost as well with the proper labeling. It does have enough buttons. And besides RailDriver already available in Rewired. :)

    It will be interesting to see how they handle production when it comes out. The generally seem to do more pre-order batches for the most part. But at least now they are selling on Amazon instead of only direct which was a pain.

    It will be interesting in Logitech does anything more with their Saitek line in the near future.
     
    guavaman likes this.
  20. codejoy

    codejoy

    Joined:
    Aug 17, 2012
    Posts:
    204
    I am getting an error (it is a brand new project and I followed the steps here:

    https://guavaman.com/projects/rewired/docs/QuickStart.html

    I didn't set up a mousemap cause my game does not use mouse input. Is that the error I need to set up a mouse map regardless?



    Rewired: Rewired: An exception occurred during initialization. Input will not function.

    Exception:
    System.ArgumentException: Input Button MouseButton0 is not setup.
    To change the input settings use: Edit -> Project Settings -> Input
    at (wrapper managed-to-native) UnityEngine.Input:GetButton (string)
    at Rewired.ThreadSafeUnityInput+Mouse.Update () [0x00000] in <filename unknown>:0
    at Rewired.ThreadSafeUnityInput+Mouse.PostInitialize () [0x00000] in <filename unknown>:0
    at Rewired.ThreadSafeUnityInput.PostInitialize () [0x00000] in <filename unknown>:0
    at Rewired.ReInput.DfqirGDWyRhSdmTEDJHfVMtbicc (Rewired.InputManager_Base , System.Func`2 , Rewired.Data.ConfigVars , Rewired.Data.ControllerDataFiles , Rewired.Data.UserData ) [0x00000] in <filename unknown>:0 ------- Rewired System Info -------
    Unity version: 2017.3.0f3
    Rewired version: 1.1.10.0.U2017
    Platform: OSX
    Editor Platform: OSX
    Using Unity input: False

    UnityEngine.Logger:LogError(String, Object)
    Rewired.Logger:LogErrorNow(Object, Boolean)
    Rewired.Logger:LogError(Object, Boolean)
    Rewired.Logger:LogError(Object)
    Rewired.InputManager_Base:HandleException(ExceptionPoint, String, Exception)
    Rewired.InputManager_Base:Initialize()
    Rewired.InputManager_Base:Awake()
     
  21. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    No. You did not install Rewired correctly or something deleted the input manager entries. See this Troubleshooting topic.
     
  22. aftokinito

    aftokinito

    Joined:
    Jan 30, 2013
    Posts:
    10
    I am using the wrapper they provide here https://github.com/discordapp/discord-rpc.
    It looks like, indeed, Discord itself was hooking into XInput_4.dll when rich presence had been previously enabled at some point (I didn't reboot between closing my game's project and opening the new one).
     
  23. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    Thanks for the explanation. I don't think there's anything I can do about this then. Rewired accesses XInput by standard means as directed by Microsoft's documentation without anything weird going on like DLL hooking. The only difference between Rewired and any other application is that Rewired is C# managed code and has to use p/invoke to make function calls and marshaling to get the structures.
     
  24. room710games

    room710games

    Joined:
    Oct 3, 2017
    Posts:
    7
    Hello!

    How can I turn off ignoring Shift, Ctrl and Alt keys when I use InputMapper?

    Thank you for your work!
     
    Last edited: Feb 3, 2018
  25. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    They are not ignored. To assign a binding to a modifier key, you must hold it down for a time period. Otherwise, it will be treated as a modifier key for any other keys pressed.

    All options are configurable on the InputMapper.Options object. Properties are named so you can understand them easily:
    http://guavaman.com/projects/rewired/docs/api-reference/html/T_Rewired_InputMapper_Options.htm

    Relevant properties:
    holdDurationToMapKeyboardModifierKeyAsPrimary
    allowKeyboardKeysWithModifiers
    allowKeyboardModifierKeyAsPrimary
     
  26. room710games

    room710games

    Joined:
    Oct 3, 2017
    Posts:
    7
  27. room710games

    room710games

    Joined:
    Oct 3, 2017
    Posts:
    7
    Hello again,

    For some reason Rewired events (like ReInput.ControllerConnectedEvent) are not sensetive to my Steam Controller. And the Steam Controller is not listed in available controllers array. Xbox one controller works good.

    Version of Rewired is recent 1.1.10.0

    Maybe it is because I use Unity 5.6.0


    Look forward to your reply!
     
  28. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    There is a whole section on troubleshooting Steam. Note that most of this information is really documentation on how Steam functions and Steam's back end and doesn't really have anything to do with Rewired. Rewired is treated as any other application by Steam and Rewired does not interface with its API in any way. Steam is responsible for making the device appear to the application based on the settings you choose in Steam. This information was included because so many people have problems with setting up things properly in Steam. However, it's impractical for me to provide complete documentation on Steam as that is a separate system that I did not create and do not have control over. Complete Steam documentation is available in the Steamworks back end. Information on the Steam Controller specifically is here.
     
    Last edited: Feb 4, 2018
  29. SkobbejakGames

    SkobbejakGames

    Joined:
    Jun 3, 2016
    Posts:
    396
    Hi, I just wanted to check if there is a non-PlayerPrefs version of the UserDataStore script. Im trying to convert it for UWP Cloud Saving and Im struggling to find the exact place in the UserDataStore_PlayerPrefs script that loads from the PlayerPrefs, I can find the spot in the script where it saves to PlayerPrefs and I can see how I can change the structure to my needs but I cant find the method that handles the actual loading from PlayerPrefs.
     
  30. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    No there isn't. It's not feasible to provide versions of UserDataStore that work with every possible data storage system.

    UserDataStore_PlayerPrefs's sections are labeled as to their contents.The #region PlayerPrefs Methods contains all the PlayerPrefs saving and loading. All PlayerPrefs function calls start with "PlayerPrefs."

    Lines:
    1012, 1013, 1024, 1063, 1064, 1069, 1070

    Do a search for "PlayerPrefs."
     
  31. SkobbejakGames

    SkobbejakGames

    Joined:
    Jun 3, 2016
    Posts:
    396
    Thanks, I think Ive found all of them, I should be able to figure it out now.
     
  32. SkobbejakGames

    SkobbejakGames

    Joined:
    Jun 3, 2016
    Posts:
    396
    I seem to be having trouble with the Control Mapper when it comes to Mouse Sensitivity. For some reason the Mouse Sensitivity Slider in the Control Mapper doesnt effect the Mouse Sensitivity at all, is there perhaps somewhere that they should be linked? I'm using UFPS and have the UFPS Rewired Manager installed with the Rewired UFPS Input Helper attached. All of my controls work fine and I can set the sensitivity for joysticks but not for the Mouse.

    Please, any help on the matter would be greatly appreciated.
     
  33. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    Separate this from UFPS and determine if mouse sensitivity is working apart from it. You'll be able to know if UFPS is at fault. Open Debug Information -> Players -> PlayerX -> Actions -> Action Category -> ACTION_NAME, click back in the game window and move the mouse. You can see the real-time values being returned by the Action.
     
  34. SkobbejakGames

    SkobbejakGames

    Joined:
    Jun 3, 2016
    Posts:
    396
    @guavaman Thanks for the info, however it seems like everything is correctly connected and linked to Rewired as it displays the values for the MouseX and MouseY actions when moving the mouse in the game.
     
  35. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    Did you check the values and was sensitivity applied? Set the sensitivity very high and look at the values, then change it really low and look at the values. This isn't an issue of UFPS being hooked to Rewired. I'm trying to determine if the sensitivity is applied by Rewired and reflected in the Action value or not. If it is, something in UFPS is negating it. Rewired does not have complete control over UFPS. The integration is a thin script that change the sources for UFPS's inputs but it cannot affect the settings or transformations applied by the individual scripts that consume the input.

    I am still trying to set UFPS up and test all of this. It takes a very long time to install UFPS. The first time I did it using Unity 2017.3 which had a bunch of errors... UFPS changes and I do not check every time they do whether or not they changed something that broke my integration in any way.
     
  36. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    I have tested UFPS and Control Mapper and it works correctly. The only thing I can think of is that you setup the Input Behaviour section of Control Mapper's inspector incorrectly. You must set the Input Behaviour to the Action used for the mouse look axes. In the case of the default UFPS Rewired Input Manager settings, the "Look" Action must be selected.
     
  37. SkobbejakGames

    SkobbejakGames

    Joined:
    Jun 3, 2016
    Posts:
    396
    @guavaman Yes I did check the values and set the sensitivity to different levels in the Control Mapper but the values dont change they stay in a range between 0 and 2 no matter what I set sensitivity to.
     
  38. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    Look at Debug Information again. Players -> Player# -> Input Behaviors -> Look -> Mouse X/Y Axis Sensitivity

    This will show you exactly what value that Input Behavior's Mouse X/Y sensitivity is set to.
     
  39. SkobbejakGames

    SkobbejakGames

    Joined:
    Jun 3, 2016
    Posts:
    396
    Hmm, the Mouse X/Y Axis Sensitivity under Players -> Player# -> Input Behaviors -> Look -> Mouse X/Y Axis Sensitivity
    just stays at 0.1 and doesnt change when setting it in the Control Mapper
     
  40. SkobbejakGames

    SkobbejakGames

    Joined:
    Jun 3, 2016
    Posts:
    396
    Ok, cool got it working my Control Mappers Sensitivity settings were set to Default not Look. Thanks for all the help and sorry for the hassle.
     
  41. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    That's what I said the problem probably was in this post. Glad you got it working.
     
  42. f1chris

    f1chris

    Joined:
    Sep 21, 2013
    Posts:
    335
    I would like triggered let say, a Jump button event only once a second to avoid multiple processing of the same event.

    I know how to do it in the usual way with any other input mechanism, with a timer or simply a bool but I was wondering if there's something built-in Rewired to help with that ?

    thx
     
  43. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    How To's: Handling button presses of various types

    Repeating:

    • Player.GetButtonRepeating: Gets the repeating button state of an Action. This will return TRUE when immediately pressed, then FALSE until the Input Behaviour button repeat delay has elapsed, then TRUE for a 1-frame duration repeating at the interval specified in the Input Behavior assigned to the Action. This also applies to axes being used as buttons.
    However, I would not recommend using this for your specific usage. What you are doing sounds like you need to track whether or not your script has processed the input, not whether or not the input has been received every 1 second. Your script should only disable processing of the input IF it has processed the input. If it hasn't processed it, but it is True, you need to process it immediately, not every 1 second. Use player.GetButton so you have a continuous picture of the input value and only process it if it hasn't been processed already within the last 1 second.

    Rewired has no knowledge of whether or not you have processed input and does not control that level of input management. Your scripts are in charge of processing, therefore your scripts need to track whether something has been processed or not. This is outside the scope of Rewired and is a form of state permission management which must be handled by your game code. Read this in the FAQ to understand the differentiation.
     
    Last edited: Feb 7, 2018
    f1chris likes this.
  44. Triggiano

    Triggiano

    Joined:
    Sep 22, 2015
    Posts:
    13
    Are there any functions in the Rewired library to check which joystick map is being used by a player? Thinking of doing something like this:

    if (player.joystickmap("PS4") == true)
    {
    controllerSensitivity = 500;
    }

    if (player.joystickmap("N64") == true)
    {
    controllerSensitivity = 250;
    }
     
  45. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
  46. Triggiano

    Triggiano

    Joined:
    Sep 22, 2015
    Posts:
    13
  47. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    Code (csharp):
    1. private static System.Guid guid_ds4 = new System.Guid("cd9718bf-a87a-44bc-8716-60a0def28a9f");
    2. private static System.Guid guid_unknown = System.Guid.Empty;
    3.  
    4. void SomeFunction() {
    5.     foreach(Player player in ReInput.players.Players) {
    6.         foreach(Joystick joystick in player.controllers.Joysticks) {
    7.             System.Guid guid = joystick.hardwareTypeGuid;
    8.             if(guid == guid_ds4) {
    9.                 // This is a DS4.
    10.             } else if(guid == guid_unknown) {
    11.                 // This is an Unknown Controller
    12.            }
    13.         }
    14.     }
    15. }
     
  48. Triggiano

    Triggiano

    Joined:
    Sep 22, 2015
    Posts:
    13
    Thank you! This helps a lot.
     
    guavaman likes this.
  49. guavaman

    guavaman

    Joined:
    Nov 20, 2009
    Posts:
    5,624
    Notice: All support requests will be delayed for the next 72 hours.
     
  50. EddieChristian

    EddieChristian

    Joined:
    Oct 9, 2012
    Posts:
    725
    Does this support Oculus and Vive VR controllers??