OVRInput.cs 154 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796
  1. /************************************************************************************
  2. Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
  3. Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use
  4. the Utilities SDK except in compliance with the License, which is provided at the time of installation
  5. or download, or which otherwise accompanies this software in either electronic or hard copy form.
  6. You may obtain a copy of the License at
  7. https://developer.oculus.com/licenses/utilities-1.31
  8. Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
  9. under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
  10. ANY KIND, either express or implied. See the License for the specific language governing
  11. permissions and limitations under the License.
  12. ************************************************************************************/
  13. using System;
  14. using System.Collections;
  15. using System.Collections.Generic;
  16. using System.Runtime.InteropServices;
  17. using UnityEngine;
  18. #if UNITY_2017_2_OR_NEWER
  19. using InputTracking = UnityEngine.XR.InputTracking;
  20. using Node = UnityEngine.XR.XRNode;
  21. using Settings = UnityEngine.XR.XRSettings;
  22. #else
  23. using InputTracking = UnityEngine.VR.InputTracking;
  24. using Node = UnityEngine.VR.VRNode;
  25. using Settings = UnityEngine.VR.VRSettings;
  26. #endif
  27. /// <summary>
  28. /// Provides a unified input system for Oculus controllers and gamepads.
  29. /// </summary>
  30. public static class OVRInput
  31. {
  32. [Flags]
  33. /// Virtual button mappings that allow the same input bindings to work across different controllers.
  34. public enum Button
  35. {
  36. None = 0, ///< Maps to RawButton: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  37. One = 0x00000001, ///< Maps to RawButton: [Gamepad, Touch, RTouch: A], [LTouch: X], [LTrackedRemote: LTouchpad], [RTrackedRemote: RTouchpad], [Touchpad, Remote: Start]
  38. Two = 0x00000002, ///< Maps to RawButton: [Gamepad, Touch, RTouch: B], [LTouch: Y], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: Back]
  39. Three = 0x00000004, ///< Maps to RawButton: [Gamepad, Touch: X], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  40. Four = 0x00000008, ///< Maps to RawButton: [Gamepad, Touch: Y], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  41. Start = 0x00000100, ///< Maps to RawButton: [Gamepad: Start], [Touch, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Start], [RTouch: None]
  42. Back = 0x00000200, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Back], [Touch, LTouch, RTouch: None]
  43. PrimaryShoulder = 0x00001000, ///< Maps to RawButton: [Gamepad: LShoulder], [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  44. PrimaryIndexTrigger = 0x00002000, ///< Maps to RawButton: [Gamepad, Touch, LTouch, LTrackedRemote: LIndexTrigger], [RTouch, RTrackedRemote: RIndexTrigger], [Touchpad, Remote: None]
  45. PrimaryHandTrigger = 0x00004000, ///< Maps to RawButton: [Touch, LTouch: LHandTrigger], [RTouch: RHandTrigger], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  46. PrimaryThumbstick = 0x00008000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstick], [RTouch: RThumbstick], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  47. PrimaryThumbstickUp = 0x00010000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickUp], [RTouch: RThumbstickUp], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  48. PrimaryThumbstickDown = 0x00020000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickDown], [RTouch: RThumbstickDown], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  49. PrimaryThumbstickLeft = 0x00040000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickLeft], [RTouch: RThumbstickLeft], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  50. PrimaryThumbstickRight = 0x00080000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickRight], [RTouch: RThumbstickRight], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  51. PrimaryTouchpad = 0x00000400, ///< Maps to RawButton: [LTrackedRemote, Touchpad: LTouchpad], [RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, Remote: None]
  52. SecondaryShoulder = 0x00100000, ///< Maps to RawButton: [Gamepad: RShoulder], [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  53. SecondaryIndexTrigger = 0x00200000, ///< Maps to RawButton: [Gamepad, Touch: RIndexTrigger], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  54. SecondaryHandTrigger = 0x00400000, ///< Maps to RawButton: [Touch: RHandTrigger], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  55. SecondaryThumbstick = 0x00800000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstick], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  56. SecondaryThumbstickUp = 0x01000000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstickUp], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  57. SecondaryThumbstickDown = 0x02000000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstickDown], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  58. SecondaryThumbstickLeft = 0x04000000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstickLeft], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  59. SecondaryThumbstickRight = 0x08000000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstickRight], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  60. SecondaryTouchpad = 0x00000800, ///< Maps to RawButton: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  61. DpadUp = 0x00000010, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadUp], [Touch, LTouch, RTouch: None]
  62. DpadDown = 0x00000020, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadDown], [Touch, LTouch, RTouch: None]
  63. DpadLeft = 0x00000040, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadLeft], [Touch, LTouch, RTouch: None]
  64. DpadRight = 0x00000080, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadRight], [Touch, LTouch, RTouch: None]
  65. Up = 0x10000000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickUp], [RTouch: RThumbstickUp], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadUp]
  66. Down = 0x20000000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickDown], [RTouch: RThumbstickDown], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadDown]
  67. Left = 0x40000000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickLeft], [RTouch: RThumbstickLeft], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadLeft]
  68. Right = unchecked((int)0x80000000),///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickRight], [RTouch: RThumbstickRight], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadRight]
  69. Any = ~None, ///< Maps to RawButton: [Gamepad, Touch, LTouch, RTouch: Any]
  70. }
  71. [Flags]
  72. /// Raw button mappings that can be used to directly query the state of a controller.
  73. public enum RawButton
  74. {
  75. None = 0, ///< Maps to Physical Button: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  76. A = 0x00000001, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: A], [LTrackedRemote: LIndexTrigger], [RTrackedRemote: RIndexTrigger], [LTouch, Touchpad, Remote: None]
  77. B = 0x00000002, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: B], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  78. X = 0x00000100, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: X], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  79. Y = 0x00000200, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: Y], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  80. Start = 0x00100000, ///< Maps to Physical Button: [Gamepad, Touch, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Start], [RTouch: None]
  81. Back = 0x00200000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Back], [Touch, LTouch, RTouch: None]
  82. LShoulder = 0x00000800, ///< Maps to Physical Button: [Gamepad: LShoulder], [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  83. LIndexTrigger = 0x10000000, ///< Maps to Physical Button: [Gamepad, Touch, LTouch, LTrackedRemote: LIndexTrigger], [RTouch, RTrackedRemote, Touchpad, Remote: None]
  84. LHandTrigger = 0x20000000, ///< Maps to Physical Button: [Touch, LTouch: LHandTrigger], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  85. LThumbstick = 0x00000400, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstick], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  86. LThumbstickUp = 0x00000010, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstickUp], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  87. LThumbstickDown = 0x00000020, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstickDown], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  88. LThumbstickLeft = 0x00000040, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstickLeft], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  89. LThumbstickRight = 0x00000080, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstickRight], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  90. LTouchpad = 0x40000000, ///< Maps to Physical Button: [LTrackedRemote: LTouchpad], [Gamepad, Touch, LTouch, RTouch, RTrackedRemote, Touchpad, Remote: None]
  91. RShoulder = 0x00000008, ///< Maps to Physical Button: [Gamepad: RShoulder], [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  92. RIndexTrigger = 0x04000000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch, RTrackedRemote: RIndexTrigger], [LTouch, LTrackedRemote, Touchpad, Remote: None]
  93. RHandTrigger = 0x08000000, ///< Maps to Physical Button: [Touch, RTouch: RHandTrigger], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  94. RThumbstick = 0x00000004, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstick], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  95. RThumbstickUp = 0x00001000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstickUp], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  96. RThumbstickDown = 0x00002000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstickDown], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  97. RThumbstickLeft = 0x00004000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstickLeft], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  98. RThumbstickRight = 0x00008000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstickRight], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  99. RTouchpad = unchecked((int)0x80000000),///< Maps to Physical Button: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  100. DpadUp = 0x00010000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadUp], [Touch, LTouch, RTouch: None]
  101. DpadDown = 0x00020000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadDown], [Touch, LTouch, RTouch: None]
  102. DpadLeft = 0x00040000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadLeft], [Touch, LTouch, RTouch: None]
  103. DpadRight = 0x00080000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadRight], [Touch, LTouch, RTouch: None]
  104. Any = ~None, ///< Maps to Physical Button: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Any]
  105. }
  106. [Flags]
  107. /// Virtual capacitive touch mappings that allow the same input bindings to work across different controllers with capacitive touch support.
  108. public enum Touch
  109. {
  110. None = 0, ///< Maps to RawTouch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  111. One = Button.One, ///< Maps to RawTouch: [Touch, RTouch: A], [LTouch: X], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  112. Two = Button.Two, ///< Maps to RawTouch: [Touch, RTouch: B], [LTouch: Y], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  113. Three = Button.Three, ///< Maps to RawTouch: [Touch: X], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  114. Four = Button.Four, ///< Maps to RawTouch: [Touch: Y], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  115. PrimaryIndexTrigger = Button.PrimaryIndexTrigger, ///< Maps to RawTouch: [Touch, LTouch: LIndexTrigger], [RTouch: RIndexTrigger], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  116. PrimaryThumbstick = Button.PrimaryThumbstick, ///< Maps to RawTouch: [Touch, LTouch: LThumbstick], [RTouch: RThumbstick], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  117. PrimaryThumbRest = 0x00001000, ///< Maps to RawTouch: [Touch, LTouch: LThumbRest], [RTouch: RThumbRest], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  118. PrimaryTouchpad = Button.PrimaryTouchpad, ///< Maps to RawTouch: [LTrackedRemote, Touchpad: LTouchpad], [RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, Remote: None]
  119. SecondaryIndexTrigger = Button.SecondaryIndexTrigger, ///< Maps to RawTouch: [Touch: RIndexTrigger], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  120. SecondaryThumbstick = Button.SecondaryThumbstick, ///< Maps to RawTouch: [Touch: RThumbstick], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  121. SecondaryThumbRest = 0x00100000, ///< Maps to RawTouch: [Touch: RThumbRest], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  122. SecondaryTouchpad = Button.SecondaryTouchpad, ///< Maps to RawTouch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  123. Any = ~None, ///< Maps to RawTouch: [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad: Any], [Gamepad, Remote: None]
  124. }
  125. [Flags]
  126. /// Raw capacitive touch mappings that can be used to directly query the state of a controller.
  127. public enum RawTouch
  128. {
  129. None = 0, ///< Maps to Physical Touch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  130. A = RawButton.A, ///< Maps to Physical Touch: [Touch, RTouch: A], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  131. B = RawButton.B, ///< Maps to Physical Touch: [Touch, RTouch: B], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  132. X = RawButton.X, ///< Maps to Physical Touch: [Touch, LTouch: X], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  133. Y = RawButton.Y, ///< Maps to Physical Touch: [Touch, LTouch: Y], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  134. LIndexTrigger = 0x00001000, ///< Maps to Physical Touch: [Touch, LTouch: LIndexTrigger], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  135. LThumbstick = RawButton.LThumbstick, ///< Maps to Physical Touch: [Touch, LTouch: LThumbstick], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  136. LThumbRest = 0x00000800, ///< Maps to Physical Touch: [Touch, LTouch: LThumbRest], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  137. LTouchpad = RawButton.LTouchpad, ///< Maps to Physical Touch: [LTrackedRemote, Touchpad: LTouchpad], [Gamepad, Touch, LTouch, RTouch, RTrackedRemote, Remote: None]
  138. RIndexTrigger = 0x00000010, ///< Maps to Physical Touch: [Touch, RTouch: RIndexTrigger], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  139. RThumbstick = RawButton.RThumbstick, ///< Maps to Physical Touch: [Touch, RTouch: RThumbstick], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  140. RThumbRest = 0x00000008, ///< Maps to Physical Touch: [Touch, RTouch: RThumbRest], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  141. RTouchpad = RawButton.RTouchpad, ///< Maps to Physical Touch: [RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, Touchpad, Remote: None]
  142. Any = ~None, ///< Maps to Physical Touch: [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad: Any], [Gamepad, Remote: None]
  143. }
  144. [Flags]
  145. /// Virtual near touch mappings that allow the same input bindings to work across different controllers with near touch support.
  146. /// A near touch uses the capacitive touch sensors of a controller to detect approximate finger proximity prior to a full touch being reported.
  147. public enum NearTouch
  148. {
  149. None = 0, ///< Maps to RawNearTouch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  150. PrimaryIndexTrigger = 0x00000001, ///< Maps to RawNearTouch: [Touch, LTouch: LIndexTrigger], [RTouch: RIndexTrigger], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  151. PrimaryThumbButtons = 0x00000002, ///< Maps to RawNearTouch: [Touch, LTouch: LThumbButtons], [RTouch: RThumbButtons], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  152. SecondaryIndexTrigger = 0x00000004, ///< Maps to RawNearTouch: [Touch: RIndexTrigger], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  153. SecondaryThumbButtons = 0x00000008, ///< Maps to RawNearTouch: [Touch: RThumbButtons], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  154. Any = ~None, ///< Maps to RawNearTouch: [Touch, LTouch, RTouch: Any], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  155. }
  156. [Flags]
  157. /// Raw near touch mappings that can be used to directly query the state of a controller.
  158. public enum RawNearTouch
  159. {
  160. None = 0, ///< Maps to Physical NearTouch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  161. LIndexTrigger = 0x00000001, ///< Maps to Physical NearTouch: [Touch, LTouch: Implies finger is in close proximity to LIndexTrigger.], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  162. LThumbButtons = 0x00000002, ///< Maps to Physical NearTouch: [Touch, LTouch: Implies thumb is in close proximity to LThumbstick OR X/Y buttons.], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  163. RIndexTrigger = 0x00000004, ///< Maps to Physical NearTouch: [Touch, RTouch: Implies finger is in close proximity to RIndexTrigger.], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  164. RThumbButtons = 0x00000008, ///< Maps to Physical NearTouch: [Touch, RTouch: Implies thumb is in close proximity to RThumbstick OR A/B buttons.], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  165. Any = ~None, ///< Maps to Physical NearTouch: [Touch, LTouch, RTouch: Any], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  166. }
  167. [Flags]
  168. /// Virtual 1-dimensional axis (float) mappings that allow the same input bindings to work across different controllers.
  169. public enum Axis1D
  170. {
  171. None = 0, ///< Maps to RawAxis1D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  172. PrimaryIndexTrigger = 0x01, ///< Maps to RawAxis1D: [Gamepad, Touch, LTouch: LIndexTrigger], [RTouch: RIndexTrigger], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  173. PrimaryHandTrigger = 0x04, ///< Maps to RawAxis1D: [Touch, LTouch: LHandTrigger], [RTouch: RHandTrigger], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  174. SecondaryIndexTrigger = 0x02, ///< Maps to RawAxis1D: [Gamepad, Touch: RIndexTrigger], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  175. SecondaryHandTrigger = 0x08, ///< Maps to RawAxis1D: [Touch: RHandTrigger], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  176. Any = ~None, ///< Maps to RawAxis1D: [Gamepad, Touch, LTouch, RTouch: Any], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  177. }
  178. [Flags]
  179. /// Raw 1-dimensional axis (float) mappings that can be used to directly query the state of a controller.
  180. public enum RawAxis1D
  181. {
  182. None = 0, ///< Maps to Physical Axis1D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  183. LIndexTrigger = 0x01, ///< Maps to Physical Axis1D: [Gamepad, Touch, LTouch: LIndexTrigger], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  184. LHandTrigger = 0x04, ///< Maps to Physical Axis1D: [Touch, LTouch: LHandTrigger], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  185. RIndexTrigger = 0x02, ///< Maps to Physical Axis1D: [Gamepad, Touch, RTouch: RIndexTrigger], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  186. RHandTrigger = 0x08, ///< Maps to Physical Axis1D: [Touch, RTouch: RHandTrigger], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  187. Any = ~None, ///< Maps to Physical Axis1D: [Gamepad, Touch, LTouch, RTouch: Any], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  188. }
  189. [Flags]
  190. /// Virtual 2-dimensional axis (Vector2) mappings that allow the same input bindings to work across different controllers.
  191. public enum Axis2D
  192. {
  193. None = 0, ///< Maps to RawAxis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  194. PrimaryThumbstick = 0x01, ///< Maps to RawAxis2D: [Gamepad, Touch, LTouch: LThumbstick], [RTouch: RThumbstick], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  195. PrimaryTouchpad = 0x04, ///< Maps to RawAxis2D: [LTrackedRemote, Touchpad: LTouchpad], RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, Remote: None]
  196. SecondaryThumbstick = 0x02, ///< Maps to RawAxis2D: [Gamepad, Touch: RThumbstick], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  197. SecondaryTouchpad = 0x08, ///< Maps to RawAxis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  198. Any = ~None, ///< Maps to RawAxis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad: Any], [Remote: None]
  199. }
  200. [Flags]
  201. /// Raw 2-dimensional axis (Vector2) mappings that can be used to directly query the state of a controller.
  202. public enum RawAxis2D
  203. {
  204. None = 0, ///< Maps to Physical Axis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  205. LThumbstick = 0x01, ///< Maps to Physical Axis2D: [Gamepad, Touch, LTouch: LThumbstick], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  206. LTouchpad = 0x04, ///< Maps to Physical Axis2D: [LTrackedRemote, Touchpad: LTouchpad], [Gamepad, Touch, LTouch, RTouch, RTrackedRemote, Remote: None]
  207. RThumbstick = 0x02, ///< Maps to Physical Axis2D: [Gamepad, Touch, RTouch: RThumbstick], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None]
  208. RTouchpad = 0x08, ///< Maps to Physical Axis2D: [RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, Touchpad, Remote: None]
  209. Any = ~None, ///< Maps to Physical Axis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote: Any], [Touchpad, Remote: None]
  210. }
  211. [Flags]
  212. /// OpenVR Controller State Enum
  213. public enum OpenVRButton : ulong
  214. {
  215. None = 0,
  216. Two = 0x0002,
  217. Thumbstick = 0x100000000,
  218. Grip = 0x0004,
  219. }
  220. [Flags]
  221. /// Identifies a controller which can be used to query the virtual or raw input state.
  222. public enum Controller
  223. {
  224. None = OVRPlugin.Controller.None, ///< Null controller.
  225. LTouch = OVRPlugin.Controller.LTouch, ///< Left Oculus Touch controller. Virtual input mapping differs from the combined L/R Touch mapping.
  226. RTouch = OVRPlugin.Controller.RTouch, ///< Right Oculus Touch controller. Virtual input mapping differs from the combined L/R Touch mapping.
  227. Touch = OVRPlugin.Controller.Touch, ///< Combined Left/Right pair of Oculus Touch controllers.
  228. Remote = OVRPlugin.Controller.Remote, ///< Oculus Remote controller.
  229. Gamepad = OVRPlugin.Controller.Gamepad, ///< Xbox 360 or Xbox One gamepad on PC. Generic gamepad on Android.
  230. Hands = OVRPlugin.Controller.Hands, ///< Left Hand provided by hand-tracking.
  231. LHand = OVRPlugin.Controller.LHand, ///< Left Hand provided by hand-tracking.
  232. RHand = OVRPlugin.Controller.RHand, ///< Right Hand provided by hand-tracking.
  233. Touchpad = OVRPlugin.Controller.Touchpad, ///< GearVR touchpad on Android.
  234. LTrackedRemote = OVRPlugin.Controller.LTrackedRemote, ///< Left GearVR tracked remote on Android.
  235. RTrackedRemote = OVRPlugin.Controller.RTrackedRemote, ///< Right GearVR tracked remote on Android.
  236. Active = OVRPlugin.Controller.Active, ///< Default controller. Represents the controller that most recently registered a button press from the user.
  237. All = OVRPlugin.Controller.All, ///< Represents the logical OR of all controllers.
  238. }
  239. public enum Handedness
  240. {
  241. Unsupported = OVRPlugin.Handedness.Unsupported,
  242. LeftHanded = OVRPlugin.Handedness.LeftHanded,
  243. RightHanded = OVRPlugin.Handedness.RightHanded,
  244. }
  245. private static readonly float AXIS_AS_BUTTON_THRESHOLD = 0.5f;
  246. private static readonly float AXIS_DEADZONE_THRESHOLD = 0.2f;
  247. private static List<OVRControllerBase> controllers;
  248. private static Controller activeControllerType = Controller.None;
  249. private static Controller connectedControllerTypes = Controller.None;
  250. private static OVRPlugin.Step stepType = OVRPlugin.Step.Render;
  251. private static int fixedUpdateCount = 0;
  252. private static bool _pluginSupportsActiveController = false;
  253. private static bool _pluginSupportsActiveControllerCached = false;
  254. private static System.Version _pluginSupportsActiveControllerMinVersion = new System.Version(1, 9, 0);
  255. private static bool pluginSupportsActiveController
  256. {
  257. get
  258. {
  259. if (!_pluginSupportsActiveControllerCached)
  260. {
  261. bool isSupportedPlatform = true;
  262. #if (UNITY_ANDROID && !UNITY_EDITOR) || UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
  263. isSupportedPlatform = false;
  264. #endif
  265. _pluginSupportsActiveController = isSupportedPlatform && (OVRPlugin.version >= _pluginSupportsActiveControllerMinVersion);
  266. _pluginSupportsActiveControllerCached = true;
  267. }
  268. return _pluginSupportsActiveController;
  269. }
  270. }
  271. /// <summary>
  272. /// Creates an instance of OVRInput.
  273. /// </summary>
  274. static OVRInput()
  275. {
  276. controllers = new List<OVRControllerBase>
  277. {
  278. #if UNITY_ANDROID && !UNITY_EDITOR
  279. new OVRControllerGamepadAndroid(),
  280. new OVRControllerTouchpad(),
  281. new OVRControllerLTrackedRemote(),
  282. new OVRControllerRTrackedRemote(),
  283. new OVRControllerTouch(),
  284. new OVRControllerLTouch(),
  285. new OVRControllerRTouch(),
  286. new OVRControllerHands(),
  287. new OVRControllerLHand(),
  288. new OVRControllerRHand(),
  289. #elif UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
  290. new OVRControllerGamepadMac(),
  291. #else
  292. new OVRControllerGamepadPC(),
  293. new OVRControllerTouch(),
  294. new OVRControllerLTouch(),
  295. new OVRControllerRTouch(),
  296. new OVRControllerRemote(),
  297. #endif
  298. };
  299. InitHapticInfo();
  300. }
  301. /// <summary>
  302. /// Updates the internal state of OVRInput. Must be called manually if used independently from OVRManager.
  303. /// </summary>
  304. public static void Update()
  305. {
  306. connectedControllerTypes = Controller.None;
  307. stepType = OVRPlugin.Step.Render;
  308. fixedUpdateCount = 0;
  309. if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR)
  310. {
  311. UpdateXRControllerNodeIds();
  312. UpdateXRControllerHaptics();
  313. }
  314. for (int i = 0; i < controllers.Count; i++)
  315. {
  316. OVRControllerBase controller = controllers[i];
  317. connectedControllerTypes |= controller.Update();
  318. if ((connectedControllerTypes & controller.controllerType) != 0)
  319. {
  320. RawButton rawButtonMask = RawButton.Any;
  321. RawTouch rawTouchMask = RawTouch.Any;
  322. if (Get(rawButtonMask, controller.controllerType)
  323. || Get(rawTouchMask, controller.controllerType))
  324. {
  325. activeControllerType = controller.controllerType;
  326. }
  327. }
  328. }
  329. if ((activeControllerType == Controller.LTouch) || (activeControllerType == Controller.RTouch))
  330. {
  331. if ((connectedControllerTypes & Controller.Touch) == Controller.Touch)
  332. {
  333. // If either Touch controller is Active and both Touch controllers are connected, set both to Active.
  334. activeControllerType = Controller.Touch;
  335. }
  336. }
  337. if ((activeControllerType == Controller.LHand) || (activeControllerType == Controller.RHand))
  338. {
  339. if ((connectedControllerTypes & Controller.Hands) == Controller.Hands)
  340. {
  341. // If either Hand controller is Active and both Hand controllers are connected, set both to Active.
  342. activeControllerType = Controller.Hands;
  343. }
  344. }
  345. if ((connectedControllerTypes & activeControllerType) == 0)
  346. {
  347. activeControllerType = Controller.None;
  348. }
  349. // Promote TrackedRemote to Active if one is connected and no other controller is active
  350. if (activeControllerType == Controller.None)
  351. {
  352. if ((connectedControllerTypes & Controller.RTrackedRemote) != 0)
  353. {
  354. activeControllerType = Controller.RTrackedRemote;
  355. }
  356. else if ((connectedControllerTypes & Controller.LTrackedRemote) != 0)
  357. {
  358. activeControllerType = Controller.LTrackedRemote;
  359. }
  360. }
  361. if ( OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus && pluginSupportsActiveController)
  362. {
  363. // override locally derived active and connected controllers if plugin provides more accurate data
  364. connectedControllerTypes = (OVRInput.Controller)OVRPlugin.GetConnectedControllers();
  365. activeControllerType = (OVRInput.Controller)OVRPlugin.GetActiveController();
  366. }
  367. else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR)
  368. {
  369. activeControllerType = connectedControllerTypes;
  370. }
  371. }
  372. /// <summary>
  373. /// Updates the internal physics state of OVRInput. Must be called manually if used independently from OVRManager.
  374. /// </summary>
  375. public static void FixedUpdate()
  376. {
  377. stepType = OVRPlugin.Step.Physics;
  378. double predictionSeconds = (double)fixedUpdateCount * Time.fixedDeltaTime / Mathf.Max(Time.timeScale, 1e-6f);
  379. fixedUpdateCount++;
  380. OVRPlugin.UpdateNodePhysicsPoses(0, predictionSeconds);
  381. }
  382. /// <summary>
  383. /// Returns true if the given Controller's orientation is currently tracked.
  384. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return false.
  385. /// </summary>
  386. public static bool GetControllerOrientationTracked(OVRInput.Controller controllerType)
  387. {
  388. switch (controllerType)
  389. {
  390. case Controller.LTouch:
  391. case Controller.LTrackedRemote:
  392. case Controller.LHand:
  393. return OVRPlugin.GetNodeOrientationTracked(OVRPlugin.Node.HandLeft);
  394. case Controller.RTouch:
  395. case Controller.RTrackedRemote:
  396. case Controller.RHand:
  397. return OVRPlugin.GetNodeOrientationTracked(OVRPlugin.Node.HandRight);
  398. default:
  399. return false;
  400. }
  401. }
  402. /// <summary>
  403. /// Returns true if the given Controller's orientation is currently valid.
  404. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return false.
  405. /// </summary>
  406. public static bool GetControllerOrientationValid(OVRInput.Controller controllerType)
  407. {
  408. switch (controllerType)
  409. {
  410. case Controller.LTouch:
  411. case Controller.LTrackedRemote:
  412. case Controller.LHand:
  413. return OVRPlugin.GetNodeOrientationValid(OVRPlugin.Node.HandLeft);
  414. case Controller.RTouch:
  415. case Controller.RTrackedRemote:
  416. case Controller.RHand:
  417. return OVRPlugin.GetNodeOrientationValid(OVRPlugin.Node.HandRight);
  418. default:
  419. return false;
  420. }
  421. }
  422. /// <summary>
  423. /// Returns true if the given Controller's position is currently tracked.
  424. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return false.
  425. /// </summary>
  426. public static bool GetControllerPositionTracked(OVRInput.Controller controllerType)
  427. {
  428. switch (controllerType)
  429. {
  430. case Controller.LTouch:
  431. case Controller.LTrackedRemote:
  432. case Controller.LHand:
  433. return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.HandLeft);
  434. case Controller.RTouch:
  435. case Controller.RTrackedRemote:
  436. case Controller.RHand:
  437. return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.HandRight);
  438. default:
  439. return false;
  440. }
  441. }
  442. /// <summary>
  443. /// Returns true if the given Controller's position is currently valid.
  444. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return false.
  445. /// </summary>
  446. public static bool GetControllerPositionValid(OVRInput.Controller controllerType)
  447. {
  448. switch (controllerType)
  449. {
  450. case Controller.LTouch:
  451. case Controller.LTrackedRemote:
  452. case Controller.LHand:
  453. return OVRPlugin.GetNodePositionValid(OVRPlugin.Node.HandLeft);
  454. case Controller.RTouch:
  455. case Controller.RTrackedRemote:
  456. case Controller.RHand:
  457. return OVRPlugin.GetNodePositionValid(OVRPlugin.Node.HandRight);
  458. default:
  459. return false;
  460. }
  461. }
  462. /// <summary>
  463. /// Gets the position of the given Controller local to its tracking space.
  464. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero.
  465. /// </summary>
  466. public static Vector3 GetLocalControllerPosition(OVRInput.Controller controllerType)
  467. {
  468. switch (controllerType)
  469. {
  470. case Controller.LTouch:
  471. case Controller.LTrackedRemote:
  472. case Controller.LHand:
  473. if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus)
  474. return OVRPlugin.GetNodePose(OVRPlugin.Node.HandLeft, stepType).ToOVRPose().position;
  475. else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR)
  476. return openVRControllerDetails[0].localPosition;
  477. else
  478. {
  479. Vector3 retVec;
  480. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.Position, OVRPlugin.Node.HandLeft, stepType, out retVec))
  481. return retVec;
  482. return Vector3.zero; //Will never be hit, but is a final fallback.
  483. }
  484. case Controller.RTouch:
  485. case Controller.RTrackedRemote:
  486. case Controller.RHand:
  487. if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus)
  488. return OVRPlugin.GetNodePose(OVRPlugin.Node.HandRight, stepType).ToOVRPose().position;
  489. else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR)
  490. return openVRControllerDetails[1].localPosition;
  491. else
  492. {
  493. Vector3 retVec;
  494. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.Position, OVRPlugin.Node.HandRight, stepType, out retVec))
  495. return retVec;
  496. return Vector3.zero;
  497. }
  498. default:
  499. return Vector3.zero;
  500. }
  501. }
  502. /// <summary>
  503. /// Gets the linear velocity of the given Controller local to its tracking space.
  504. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero.
  505. /// </summary>
  506. public static Vector3 GetLocalControllerVelocity(OVRInput.Controller controllerType)
  507. {
  508. Vector3 velocity = Vector3.zero;
  509. switch (controllerType)
  510. {
  511. case Controller.LTouch:
  512. case Controller.LTrackedRemote:
  513. case Controller.LHand:
  514. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.Velocity, OVRPlugin.Node.HandLeft, stepType, out velocity))
  515. {
  516. return velocity;
  517. }
  518. else
  519. {
  520. return Vector3.zero;
  521. }
  522. case Controller.RTouch:
  523. case Controller.RTrackedRemote:
  524. case Controller.RHand:
  525. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.Velocity, OVRPlugin.Node.HandRight, stepType, out velocity))
  526. {
  527. return velocity;
  528. }
  529. else
  530. {
  531. return Vector3.zero;
  532. }
  533. default:
  534. return Vector3.zero;
  535. }
  536. }
  537. /// <summary>
  538. /// Gets the linear acceleration of the given Controller local to its tracking space.
  539. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero.
  540. /// </summary>
  541. public static Vector3 GetLocalControllerAcceleration(OVRInput.Controller controllerType)
  542. {
  543. Vector3 accel = Vector3.zero;
  544. switch (controllerType)
  545. {
  546. case Controller.LTouch:
  547. case Controller.LTrackedRemote:
  548. case Controller.LHand:
  549. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.Acceleration, OVRPlugin.Node.HandLeft, stepType, out accel))
  550. {
  551. return accel;
  552. }
  553. else
  554. {
  555. return Vector3.zero;
  556. }
  557. case Controller.RTouch:
  558. case Controller.RTrackedRemote:
  559. case Controller.RHand:
  560. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.Acceleration, OVRPlugin.Node.HandRight, stepType, out accel))
  561. {
  562. return accel;
  563. }
  564. else
  565. {
  566. return Vector3.zero;
  567. }
  568. default:
  569. return Vector3.zero;
  570. }
  571. }
  572. /// <summary>
  573. /// Gets the rotation of the given Controller local to its tracking space.
  574. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Quaternion.identity.
  575. /// </summary>
  576. public static Quaternion GetLocalControllerRotation(OVRInput.Controller controllerType)
  577. {
  578. switch (controllerType)
  579. {
  580. case Controller.LTouch:
  581. case Controller.LTrackedRemote:
  582. case Controller.LHand:
  583. if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus)
  584. return OVRPlugin.GetNodePose(OVRPlugin.Node.HandLeft, stepType).ToOVRPose().orientation;
  585. else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR)
  586. return openVRControllerDetails[0].localOrientation;
  587. else
  588. {
  589. Quaternion retQuat;
  590. if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.LeftHand, NodeStatePropertyType.Orientation, OVRPlugin.Node.HandLeft, stepType, out retQuat))
  591. return retQuat;
  592. return Quaternion.identity;
  593. }
  594. case Controller.RTouch:
  595. case Controller.RTrackedRemote:
  596. case Controller.RHand:
  597. if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus)
  598. return OVRPlugin.GetNodePose(OVRPlugin.Node.HandRight, stepType).ToOVRPose().orientation;
  599. else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR)
  600. return openVRControllerDetails[1].localOrientation;
  601. else
  602. {
  603. Quaternion retQuat;
  604. if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.RightHand, NodeStatePropertyType.Orientation, OVRPlugin.Node.HandRight, stepType, out retQuat))
  605. return retQuat;
  606. return Quaternion.identity;
  607. }
  608. default:
  609. return Quaternion.identity;
  610. }
  611. }
  612. /// <summary>
  613. /// Gets the angular velocity of the given Controller local to its tracking space in radians per second around each axis.
  614. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero.
  615. /// </summary>
  616. public static Vector3 GetLocalControllerAngularVelocity(OVRInput.Controller controllerType)
  617. {
  618. Vector3 velocity = Vector3.zero;
  619. switch (controllerType)
  620. {
  621. case Controller.LTouch:
  622. case Controller.LTrackedRemote:
  623. case Controller.LHand:
  624. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.AngularVelocity, OVRPlugin.Node.HandLeft, stepType, out velocity))
  625. {
  626. return velocity;
  627. }
  628. else
  629. {
  630. return Vector3.zero;
  631. }
  632. case Controller.RTouch:
  633. case Controller.RTrackedRemote:
  634. case Controller.RHand:
  635. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.AngularVelocity, OVRPlugin.Node.HandRight, stepType, out velocity))
  636. {
  637. return velocity;
  638. }
  639. else
  640. {
  641. return Vector3.zero;
  642. }
  643. default:
  644. return Vector3.zero;
  645. }
  646. }
  647. /// <summary>
  648. /// Gets the angular acceleration of the given Controller local to its tracking space in radians per second per second around each axis.
  649. /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero.
  650. /// </summary>
  651. public static Vector3 GetLocalControllerAngularAcceleration(OVRInput.Controller controllerType)
  652. {
  653. Vector3 accel = Vector3.zero;
  654. switch (controllerType)
  655. {
  656. case Controller.LTouch:
  657. case Controller.LTrackedRemote:
  658. case Controller.LHand:
  659. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.AngularAcceleration, OVRPlugin.Node.HandLeft, stepType, out accel))
  660. {
  661. return accel;
  662. }
  663. else
  664. {
  665. return Vector3.zero;
  666. }
  667. case Controller.RTouch:
  668. case Controller.RTrackedRemote:
  669. case Controller.RHand:
  670. if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.AngularAcceleration, OVRPlugin.Node.HandRight, stepType, out accel))
  671. {
  672. return accel;
  673. }
  674. else
  675. {
  676. return Vector3.zero;
  677. }
  678. default:
  679. return Vector3.zero;
  680. }
  681. }
  682. /// <summary>
  683. /// Gets the dominant hand that the user has specified in settings, for mobile devices.
  684. /// </summary>
  685. public static Handedness GetDominantHand()
  686. {
  687. return (Handedness) OVRPlugin.GetDominantHand();
  688. }
  689. /// <summary>
  690. /// Gets the current state of the given virtual button mask with the given controller mask.
  691. /// Returns true if any masked button is down on any masked controller.
  692. /// </summary>
  693. public static bool Get(Button virtualMask, Controller controllerMask = Controller.Active)
  694. {
  695. return GetResolvedButton(virtualMask, RawButton.None, controllerMask);
  696. }
  697. /// <summary>
  698. /// Gets the current state of the given raw button mask with the given controller mask.
  699. /// Returns true if any masked button is down on any masked controllers.
  700. /// </summary>
  701. public static bool Get(RawButton rawMask, Controller controllerMask = Controller.Active)
  702. {
  703. return GetResolvedButton(Button.None, rawMask, controllerMask);
  704. }
  705. private static bool GetResolvedButton(Button virtualMask, RawButton rawMask, Controller controllerMask)
  706. {
  707. if ((controllerMask & Controller.Active) != 0)
  708. controllerMask |= activeControllerType;
  709. for (int i = 0; i < controllers.Count; i++)
  710. {
  711. OVRControllerBase controller = controllers[i];
  712. if (ShouldResolveController(controller.controllerType, controllerMask))
  713. {
  714. RawButton resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  715. if (((RawButton)controller.currentState.Buttons & resolvedMask) != 0)
  716. {
  717. return true;
  718. }
  719. }
  720. }
  721. return false;
  722. }
  723. /// <summary>
  724. /// Gets the current down state of the given virtual button mask with the given controller mask.
  725. /// Returns true if any masked button was pressed this frame on any masked controller and no masked button was previously down last frame.
  726. /// </summary>
  727. public static bool GetDown(Button virtualMask, Controller controllerMask = Controller.Active)
  728. {
  729. return GetResolvedButtonDown(virtualMask, RawButton.None, controllerMask);
  730. }
  731. /// <summary>
  732. /// Gets the current down state of the given raw button mask with the given controller mask.
  733. /// Returns true if any masked button was pressed this frame on any masked controller and no masked button was previously down last frame.
  734. /// </summary>
  735. public static bool GetDown(RawButton rawMask, Controller controllerMask = Controller.Active)
  736. {
  737. return GetResolvedButtonDown(Button.None, rawMask, controllerMask);
  738. }
  739. private static bool GetResolvedButtonDown(Button virtualMask, RawButton rawMask, Controller controllerMask)
  740. {
  741. bool down = false;
  742. if ((controllerMask & Controller.Active) != 0)
  743. controllerMask |= activeControllerType;
  744. for (int i = 0; i < controllers.Count; i++)
  745. {
  746. OVRControllerBase controller = controllers[i];
  747. if (ShouldResolveController(controller.controllerType, controllerMask))
  748. {
  749. RawButton resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  750. if (((RawButton)controller.previousState.Buttons & resolvedMask) != 0)
  751. {
  752. return false;
  753. }
  754. if ((((RawButton)controller.currentState.Buttons & resolvedMask) != 0)
  755. && (((RawButton)controller.previousState.Buttons & resolvedMask) == 0))
  756. {
  757. down = true;
  758. }
  759. }
  760. }
  761. return down;
  762. }
  763. /// <summary>
  764. /// Gets the current up state of the given virtual button mask with the given controller mask.
  765. /// Returns true if any masked button was released this frame on any masked controller and no other masked button is still down this frame.
  766. /// </summary>
  767. public static bool GetUp(Button virtualMask, Controller controllerMask = Controller.Active)
  768. {
  769. return GetResolvedButtonUp(virtualMask, RawButton.None, controllerMask);
  770. }
  771. /// <summary>
  772. /// Gets the current up state of the given raw button mask with the given controller mask.
  773. /// Returns true if any masked button was released this frame on any masked controller and no other masked button is still down this frame.
  774. /// </summary>
  775. public static bool GetUp(RawButton rawMask, Controller controllerMask = Controller.Active)
  776. {
  777. return GetResolvedButtonUp(Button.None, rawMask, controllerMask);
  778. }
  779. private static bool GetResolvedButtonUp(Button virtualMask, RawButton rawMask, Controller controllerMask)
  780. {
  781. bool up = false;
  782. if ((controllerMask & Controller.Active) != 0)
  783. controllerMask |= activeControllerType;
  784. for (int i = 0; i < controllers.Count; i++)
  785. {
  786. OVRControllerBase controller = controllers[i];
  787. if (ShouldResolveController(controller.controllerType, controllerMask))
  788. {
  789. RawButton resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  790. if (((RawButton)controller.currentState.Buttons & resolvedMask) != 0)
  791. {
  792. return false;
  793. }
  794. if ((((RawButton)controller.currentState.Buttons & resolvedMask) == 0)
  795. && (((RawButton)controller.previousState.Buttons & resolvedMask) != 0))
  796. {
  797. up = true;
  798. }
  799. }
  800. }
  801. return up;
  802. }
  803. /// <summary>
  804. /// Gets the current state of the given virtual touch mask with the given controller mask.
  805. /// Returns true if any masked touch is down on any masked controller.
  806. /// </summary>
  807. public static bool Get(Touch virtualMask, Controller controllerMask = Controller.Active)
  808. {
  809. return GetResolvedTouch(virtualMask, RawTouch.None, controllerMask);
  810. }
  811. /// <summary>
  812. /// Gets the current state of the given raw touch mask with the given controller mask.
  813. /// Returns true if any masked touch is down on any masked controllers.
  814. /// </summary>
  815. public static bool Get(RawTouch rawMask, Controller controllerMask = Controller.Active)
  816. {
  817. return GetResolvedTouch(Touch.None, rawMask, controllerMask);
  818. }
  819. private static bool GetResolvedTouch(Touch virtualMask, RawTouch rawMask, Controller controllerMask)
  820. {
  821. if ((controllerMask & Controller.Active) != 0)
  822. controllerMask |= activeControllerType;
  823. for (int i = 0; i < controllers.Count; i++)
  824. {
  825. OVRControllerBase controller = controllers[i];
  826. if (ShouldResolveController(controller.controllerType, controllerMask))
  827. {
  828. RawTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  829. if (((RawTouch)controller.currentState.Touches & resolvedMask) != 0)
  830. {
  831. return true;
  832. }
  833. }
  834. }
  835. return false;
  836. }
  837. /// <summary>
  838. /// Gets the current down state of the given virtual touch mask with the given controller mask.
  839. /// Returns true if any masked touch was pressed this frame on any masked controller and no masked touch was previously down last frame.
  840. /// </summary>
  841. public static bool GetDown(Touch virtualMask, Controller controllerMask = Controller.Active)
  842. {
  843. return GetResolvedTouchDown(virtualMask, RawTouch.None, controllerMask);
  844. }
  845. /// <summary>
  846. /// Gets the current down state of the given raw touch mask with the given controller mask.
  847. /// Returns true if any masked touch was pressed this frame on any masked controller and no masked touch was previously down last frame.
  848. /// </summary>
  849. public static bool GetDown(RawTouch rawMask, Controller controllerMask = Controller.Active)
  850. {
  851. return GetResolvedTouchDown(Touch.None, rawMask, controllerMask);
  852. }
  853. private static bool GetResolvedTouchDown(Touch virtualMask, RawTouch rawMask, Controller controllerMask)
  854. {
  855. bool down = false;
  856. if ((controllerMask & Controller.Active) != 0)
  857. controllerMask |= activeControllerType;
  858. for (int i = 0; i < controllers.Count; i++)
  859. {
  860. OVRControllerBase controller = controllers[i];
  861. if (ShouldResolveController(controller.controllerType, controllerMask))
  862. {
  863. RawTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  864. if (((RawTouch)controller.previousState.Touches & resolvedMask) != 0)
  865. {
  866. return false;
  867. }
  868. if ((((RawTouch)controller.currentState.Touches & resolvedMask) != 0)
  869. && (((RawTouch)controller.previousState.Touches & resolvedMask) == 0))
  870. {
  871. down = true;
  872. }
  873. }
  874. }
  875. return down;
  876. }
  877. /// <summary>
  878. /// Gets the current up state of the given virtual touch mask with the given controller mask.
  879. /// Returns true if any masked touch was released this frame on any masked controller and no other masked touch is still down this frame.
  880. /// </summary>
  881. public static bool GetUp(Touch virtualMask, Controller controllerMask = Controller.Active)
  882. {
  883. return GetResolvedTouchUp(virtualMask, RawTouch.None, controllerMask);
  884. }
  885. /// <summary>
  886. /// Gets the current up state of the given raw touch mask with the given controller mask.
  887. /// Returns true if any masked touch was released this frame on any masked controller and no other masked touch is still down this frame.
  888. /// </summary>
  889. public static bool GetUp(RawTouch rawMask, Controller controllerMask = Controller.Active)
  890. {
  891. return GetResolvedTouchUp(Touch.None, rawMask, controllerMask);
  892. }
  893. private static bool GetResolvedTouchUp(Touch virtualMask, RawTouch rawMask, Controller controllerMask)
  894. {
  895. bool up = false;
  896. if ((controllerMask & Controller.Active) != 0)
  897. controllerMask |= activeControllerType;
  898. for (int i = 0; i < controllers.Count; i++)
  899. {
  900. OVRControllerBase controller = controllers[i];
  901. if (ShouldResolveController(controller.controllerType, controllerMask))
  902. {
  903. RawTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  904. if (((RawTouch)controller.currentState.Touches & resolvedMask) != 0)
  905. {
  906. return false;
  907. }
  908. if ((((RawTouch)controller.currentState.Touches & resolvedMask) == 0)
  909. && (((RawTouch)controller.previousState.Touches & resolvedMask) != 0))
  910. {
  911. up = true;
  912. }
  913. }
  914. }
  915. return up;
  916. }
  917. /// <summary>
  918. /// Gets the current state of the given virtual near touch mask with the given controller mask.
  919. /// Returns true if any masked near touch is down on any masked controller.
  920. /// </summary>
  921. public static bool Get(NearTouch virtualMask, Controller controllerMask = Controller.Active)
  922. {
  923. return GetResolvedNearTouch(virtualMask, RawNearTouch.None, controllerMask);
  924. }
  925. /// <summary>
  926. /// Gets the current state of the given raw near touch mask with the given controller mask.
  927. /// Returns true if any masked near touch is down on any masked controllers.
  928. /// </summary>
  929. public static bool Get(RawNearTouch rawMask, Controller controllerMask = Controller.Active)
  930. {
  931. return GetResolvedNearTouch(NearTouch.None, rawMask, controllerMask);
  932. }
  933. private static bool GetResolvedNearTouch(NearTouch virtualMask, RawNearTouch rawMask, Controller controllerMask)
  934. {
  935. if ((controllerMask & Controller.Active) != 0)
  936. controllerMask |= activeControllerType;
  937. for (int i = 0; i < controllers.Count; i++)
  938. {
  939. OVRControllerBase controller = controllers[i];
  940. if (ShouldResolveController(controller.controllerType, controllerMask))
  941. {
  942. RawNearTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  943. if (((RawNearTouch)controller.currentState.NearTouches & resolvedMask) != 0)
  944. {
  945. return true;
  946. }
  947. }
  948. }
  949. return false;
  950. }
  951. /// <summary>
  952. /// Gets the current down state of the given virtual near touch mask with the given controller mask.
  953. /// Returns true if any masked near touch was pressed this frame on any masked controller and no masked near touch was previously down last frame.
  954. /// </summary>
  955. public static bool GetDown(NearTouch virtualMask, Controller controllerMask = Controller.Active)
  956. {
  957. return GetResolvedNearTouchDown(virtualMask, RawNearTouch.None, controllerMask);
  958. }
  959. /// <summary>
  960. /// Gets the current down state of the given raw near touch mask with the given controller mask.
  961. /// Returns true if any masked near touch was pressed this frame on any masked controller and no masked near touch was previously down last frame.
  962. /// </summary>
  963. public static bool GetDown(RawNearTouch rawMask, Controller controllerMask = Controller.Active)
  964. {
  965. return GetResolvedNearTouchDown(NearTouch.None, rawMask, controllerMask);
  966. }
  967. private static bool GetResolvedNearTouchDown(NearTouch virtualMask, RawNearTouch rawMask, Controller controllerMask)
  968. {
  969. bool down = false;
  970. if ((controllerMask & Controller.Active) != 0)
  971. controllerMask |= activeControllerType;
  972. for (int i = 0; i < controllers.Count; i++)
  973. {
  974. OVRControllerBase controller = controllers[i];
  975. if (ShouldResolveController(controller.controllerType, controllerMask))
  976. {
  977. RawNearTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  978. if (((RawNearTouch)controller.previousState.NearTouches & resolvedMask) != 0)
  979. {
  980. return false;
  981. }
  982. if ((((RawNearTouch)controller.currentState.NearTouches & resolvedMask) != 0)
  983. && (((RawNearTouch)controller.previousState.NearTouches & resolvedMask) == 0))
  984. {
  985. down = true;
  986. }
  987. }
  988. }
  989. return down;
  990. }
  991. /// <summary>
  992. /// Gets the current up state of the given virtual near touch mask with the given controller mask.
  993. /// Returns true if any masked near touch was released this frame on any masked controller and no other masked near touch is still down this frame.
  994. /// </summary>
  995. public static bool GetUp(NearTouch virtualMask, Controller controllerMask = Controller.Active)
  996. {
  997. return GetResolvedNearTouchUp(virtualMask, RawNearTouch.None, controllerMask);
  998. }
  999. /// <summary>
  1000. /// Gets the current up state of the given raw near touch mask with the given controller mask.
  1001. /// Returns true if any masked near touch was released this frame on any masked controller and no other masked near touch is still down this frame.
  1002. /// </summary>
  1003. public static bool GetUp(RawNearTouch rawMask, Controller controllerMask = Controller.Active)
  1004. {
  1005. return GetResolvedNearTouchUp(NearTouch.None, rawMask, controllerMask);
  1006. }
  1007. private static bool GetResolvedNearTouchUp(NearTouch virtualMask, RawNearTouch rawMask, Controller controllerMask)
  1008. {
  1009. bool up = false;
  1010. if ((controllerMask & Controller.Active) != 0)
  1011. controllerMask |= activeControllerType;
  1012. for (int i = 0; i < controllers.Count; i++)
  1013. {
  1014. OVRControllerBase controller = controllers[i];
  1015. if (ShouldResolveController(controller.controllerType, controllerMask))
  1016. {
  1017. RawNearTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  1018. if (((RawNearTouch)controller.currentState.NearTouches & resolvedMask) != 0)
  1019. {
  1020. return false;
  1021. }
  1022. if ((((RawNearTouch)controller.currentState.NearTouches & resolvedMask) == 0)
  1023. && (((RawNearTouch)controller.previousState.NearTouches & resolvedMask) != 0))
  1024. {
  1025. up = true;
  1026. }
  1027. }
  1028. }
  1029. return up;
  1030. }
  1031. /// <summary>
  1032. /// Gets the current state of the given virtual 1-dimensional axis mask on the given controller mask.
  1033. /// Returns the value of the largest masked axis across all masked controllers. Values range from 0 to 1.
  1034. /// </summary>
  1035. public static float Get(Axis1D virtualMask, Controller controllerMask = Controller.Active)
  1036. {
  1037. return GetResolvedAxis1D(virtualMask, RawAxis1D.None, controllerMask);
  1038. }
  1039. /// <summary>
  1040. /// Gets the current state of the given raw 1-dimensional axis mask on the given controller mask.
  1041. /// Returns the value of the largest masked axis across all masked controllers. Values range from 0 to 1.
  1042. /// </summary>
  1043. public static float Get(RawAxis1D rawMask, Controller controllerMask = Controller.Active)
  1044. {
  1045. return GetResolvedAxis1D(Axis1D.None, rawMask, controllerMask);
  1046. }
  1047. private static float GetResolvedAxis1D(Axis1D virtualMask, RawAxis1D rawMask, Controller controllerMask)
  1048. {
  1049. float maxAxis = 0.0f;
  1050. if ((controllerMask & Controller.Active) != 0)
  1051. controllerMask |= activeControllerType;
  1052. for (int i = 0; i < controllers.Count; i++)
  1053. {
  1054. OVRControllerBase controller = controllers[i];
  1055. if (OVRManager.loadedXRDevice != OVRManager.XRDevice.Oculus)
  1056. controller.shouldApplyDeadzone = false;
  1057. if (ShouldResolveController(controller.controllerType, controllerMask))
  1058. {
  1059. RawAxis1D resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  1060. if ((RawAxis1D.LIndexTrigger & resolvedMask) != 0)
  1061. {
  1062. float axis = controller.currentState.LIndexTrigger;
  1063. if (controller.shouldApplyDeadzone)
  1064. axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD);
  1065. maxAxis = CalculateAbsMax(maxAxis, axis);
  1066. }
  1067. if ((RawAxis1D.RIndexTrigger & resolvedMask) != 0)
  1068. {
  1069. float axis = controller.currentState.RIndexTrigger;
  1070. if (controller.shouldApplyDeadzone)
  1071. axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD);
  1072. maxAxis = CalculateAbsMax(maxAxis, axis);
  1073. }
  1074. if ((RawAxis1D.LHandTrigger & resolvedMask) != 0)
  1075. {
  1076. float axis = controller.currentState.LHandTrigger;
  1077. if (controller.shouldApplyDeadzone)
  1078. axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD);
  1079. maxAxis = CalculateAbsMax(maxAxis, axis);
  1080. }
  1081. if ((RawAxis1D.RHandTrigger & resolvedMask) != 0)
  1082. {
  1083. float axis = controller.currentState.RHandTrigger;
  1084. if (controller.shouldApplyDeadzone)
  1085. axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD);
  1086. maxAxis = CalculateAbsMax(maxAxis, axis);
  1087. }
  1088. }
  1089. }
  1090. return maxAxis;
  1091. }
  1092. /// <summary>
  1093. /// Gets the current state of the given virtual 2-dimensional axis mask on the given controller mask.
  1094. /// Returns the vector of the largest masked axis across all masked controllers. Values range from -1 to 1.
  1095. /// </summary>
  1096. public static Vector2 Get(Axis2D virtualMask, Controller controllerMask = Controller.Active)
  1097. {
  1098. return GetResolvedAxis2D(virtualMask, RawAxis2D.None, controllerMask);
  1099. }
  1100. /// <summary>
  1101. /// Gets the current state of the given raw 2-dimensional axis mask on the given controller mask.
  1102. /// Returns the vector of the largest masked axis across all masked controllers. Values range from -1 to 1.
  1103. /// </summary>
  1104. public static Vector2 Get(RawAxis2D rawMask, Controller controllerMask = Controller.Active)
  1105. {
  1106. return GetResolvedAxis2D(Axis2D.None, rawMask, controllerMask);
  1107. }
  1108. private static Vector2 GetResolvedAxis2D(Axis2D virtualMask, RawAxis2D rawMask, Controller controllerMask)
  1109. {
  1110. Vector2 maxAxis = Vector2.zero;
  1111. if ((controllerMask & Controller.Active) != 0)
  1112. controllerMask |= activeControllerType;
  1113. for (int i = 0; i < controllers.Count; i++)
  1114. {
  1115. OVRControllerBase controller = controllers[i];
  1116. if (OVRManager.loadedXRDevice != OVRManager.XRDevice.Oculus)
  1117. controller.shouldApplyDeadzone = false;
  1118. if (ShouldResolveController(controller.controllerType, controllerMask))
  1119. {
  1120. RawAxis2D resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask);
  1121. if ((RawAxis2D.LThumbstick & resolvedMask) != 0)
  1122. {
  1123. Vector2 axis = new Vector2(
  1124. controller.currentState.LThumbstick.x,
  1125. controller.currentState.LThumbstick.y);
  1126. if (controller.shouldApplyDeadzone)
  1127. axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD);
  1128. maxAxis = CalculateAbsMax(maxAxis, axis);
  1129. }
  1130. if ((RawAxis2D.LTouchpad & resolvedMask) != 0)
  1131. {
  1132. Vector2 axis = new Vector2(
  1133. controller.currentState.LTouchpad.x,
  1134. controller.currentState.LTouchpad.y);
  1135. //if (controller.shouldApplyDeadzone)
  1136. // axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD);
  1137. maxAxis = CalculateAbsMax(maxAxis, axis);
  1138. }
  1139. if ((RawAxis2D.RThumbstick & resolvedMask) != 0)
  1140. {
  1141. Vector2 axis = new Vector2(
  1142. controller.currentState.RThumbstick.x,
  1143. controller.currentState.RThumbstick.y);
  1144. if (controller.shouldApplyDeadzone)
  1145. axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD);
  1146. maxAxis = CalculateAbsMax(maxAxis, axis);
  1147. }
  1148. if ((RawAxis2D.RTouchpad & resolvedMask) != 0)
  1149. {
  1150. Vector2 axis = new Vector2(
  1151. controller.currentState.RTouchpad.x,
  1152. controller.currentState.RTouchpad.y);
  1153. //if (controller.shouldApplyDeadzone)
  1154. // axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD);
  1155. maxAxis = CalculateAbsMax(maxAxis, axis);
  1156. }
  1157. }
  1158. }
  1159. return maxAxis;
  1160. }
  1161. /// <summary>
  1162. /// Returns a mask of all currently connected controller types.
  1163. /// </summary>
  1164. public static Controller GetConnectedControllers()
  1165. {
  1166. return connectedControllerTypes;
  1167. }
  1168. /// <summary>
  1169. /// Returns true if the specified controller type is currently connected.
  1170. /// </summary>
  1171. public static bool IsControllerConnected(Controller controller)
  1172. {
  1173. return (connectedControllerTypes & controller) == controller;
  1174. }
  1175. /// <summary>
  1176. /// Returns the current active controller type.
  1177. /// </summary>
  1178. public static Controller GetActiveController()
  1179. {
  1180. return activeControllerType;
  1181. }
  1182. private static void StartVibration(float amplitude, float duration, Node controllerNode)
  1183. {
  1184. int index = (controllerNode == Node.LeftHand) ? 0 : 1;
  1185. hapticInfos[index].hapticsDurationPlayed = 0.0f;
  1186. hapticInfos[index].hapticAmplitude = amplitude;
  1187. hapticInfos[index].hapticsDuration = duration;
  1188. hapticInfos[index].playingHaptics = (amplitude != 0.0f);
  1189. hapticInfos[index].node = controllerNode;
  1190. if (amplitude <= 0.0f || duration <= 0.0f)
  1191. {
  1192. hapticInfos[index].playingHaptics = false;
  1193. }
  1194. }
  1195. private static int NUM_HAPTIC_CHANNELS = 2;
  1196. private static HapticInfo[] hapticInfos;
  1197. private static float OPENVR_MAX_HAPTIC_AMPLITUDE = 4000.0f;
  1198. private static float HAPTIC_VIBRATION_DURATION_SECONDS = 2.0f;
  1199. private static String OPENVR_TOUCH_NAME = "oculus_touch";
  1200. private static String OPENVR_VIVE_CONTROLLER_NAME = "vive_controller";
  1201. private static String OPENVR_WINDOWSMR_CONTROLLER_NAME = "holographic_controller";
  1202. [Flags]
  1203. /// OpenVR Controller Enum
  1204. public enum OpenVRController : ulong
  1205. {
  1206. Unknown = 0,
  1207. OculusTouch = 1,
  1208. ViveController = 2,
  1209. WindowsMRController = 3
  1210. }
  1211. [StructLayout(LayoutKind.Sequential)]
  1212. public struct OpenVRControllerDetails
  1213. {
  1214. public OVR.OpenVR.VRControllerState_t state;
  1215. public OpenVRController controllerType;
  1216. public uint deviceID;
  1217. public Vector3 localPosition; //Position relative to Tracking Space
  1218. public Quaternion localOrientation; //Orientation relative to Tracking Space
  1219. }
  1220. public static OpenVRControllerDetails[] openVRControllerDetails = new OpenVRControllerDetails[2];
  1221. private class HapticInfo
  1222. {
  1223. public bool playingHaptics;
  1224. public float hapticsDurationPlayed;
  1225. public float hapticsDuration;
  1226. public float hapticAmplitude;
  1227. public Node node;
  1228. }
  1229. /// <summary>
  1230. /// Sets OpenVR left and right controller poses local to tracking space
  1231. /// </summary>
  1232. public static void SetOpenVRLocalPose(Vector3 leftPos, Vector3 rightPos, Quaternion leftRot, Quaternion rightRot)
  1233. {
  1234. openVRControllerDetails[0].localPosition = leftPos;
  1235. openVRControllerDetails[0].localOrientation = leftRot;
  1236. openVRControllerDetails[1].localPosition = rightPos;
  1237. openVRControllerDetails[1].localOrientation = rightRot;
  1238. }
  1239. /// <summary>
  1240. /// Accesses OpenVR properties about a given deviceID. Especially useful for differentiating per type of OpenVR device (i.e. Oculus, Vive)
  1241. /// </summary>
  1242. public static string GetOpenVRStringProperty(OVR.OpenVR.ETrackedDeviceProperty prop, uint deviceId = OVR.OpenVR.OpenVR.k_unTrackedDeviceIndex_Hmd)
  1243. {
  1244. OVR.OpenVR.ETrackedPropertyError error = OVR.OpenVR.ETrackedPropertyError.TrackedProp_Success;
  1245. OVR.OpenVR.CVRSystem system = OVR.OpenVR.OpenVR.System;
  1246. if (system != null)
  1247. {
  1248. uint capacity = system.GetStringTrackedDeviceProperty(deviceId, prop, null, 0, ref error);
  1249. if (capacity > 1)
  1250. {
  1251. var result = new System.Text.StringBuilder((int)capacity);
  1252. system.GetStringTrackedDeviceProperty(deviceId, prop, result, capacity, ref error);
  1253. return result.ToString();
  1254. }
  1255. return (error != OVR.OpenVR.ETrackedPropertyError.TrackedProp_Success) ? error.ToString() : "<unknown>";
  1256. }
  1257. return "";
  1258. }
  1259. /// <summary>
  1260. /// Associates OpenVR device IDs with left and right motion controllers, for later haptic playback.
  1261. /// </summary>
  1262. private static void UpdateXRControllerNodeIds()
  1263. {
  1264. if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR)
  1265. {
  1266. openVRControllerDetails[0].deviceID = OVR.OpenVR.OpenVR.k_unMaxTrackedDeviceCount;
  1267. openVRControllerDetails[1].deviceID = OVR.OpenVR.OpenVR.k_unMaxTrackedDeviceCount;
  1268. OVR.OpenVR.CVRSystem system = OVR.OpenVR.OpenVR.System;
  1269. if (system != null)
  1270. {
  1271. for (uint id = 0; id < OVR.OpenVR.OpenVR.k_unMaxTrackedDeviceCount; id++)
  1272. {
  1273. OVR.OpenVR.ETrackedDeviceClass deviceClass = system.GetTrackedDeviceClass(id);
  1274. if (deviceClass == OVR.OpenVR.ETrackedDeviceClass.Controller && system.IsTrackedDeviceConnected(id))
  1275. {
  1276. OpenVRController controllerType;
  1277. String controllerName = GetOpenVRStringProperty(OVR.OpenVR.ETrackedDeviceProperty.Prop_ControllerType_String, id);
  1278. if (controllerName == OPENVR_TOUCH_NAME)
  1279. controllerType = OpenVRController.OculusTouch;
  1280. else if (controllerName == OPENVR_VIVE_CONTROLLER_NAME)
  1281. controllerType = OpenVRController.ViveController;
  1282. else if (controllerName == OPENVR_WINDOWSMR_CONTROLLER_NAME)
  1283. controllerType = OpenVRController.WindowsMRController;
  1284. else
  1285. controllerType = OpenVRController.Unknown;
  1286. OVR.OpenVR.ETrackedControllerRole role = system.GetControllerRoleForTrackedDeviceIndex(id);
  1287. if (role == OVR.OpenVR.ETrackedControllerRole.LeftHand)
  1288. {
  1289. system.GetControllerState(id, ref openVRControllerDetails[0].state, (uint)Marshal.SizeOf(typeof(OVR.OpenVR.VRControllerState_t)));
  1290. openVRControllerDetails[0].deviceID = id;
  1291. openVRControllerDetails[0].controllerType = controllerType;
  1292. connectedControllerTypes |= Controller.LTouch;
  1293. }
  1294. else if (role == OVR.OpenVR.ETrackedControllerRole.RightHand)
  1295. {
  1296. system.GetControllerState(id, ref openVRControllerDetails[1].state, (uint)Marshal.SizeOf(typeof(OVR.OpenVR.VRControllerState_t)));
  1297. openVRControllerDetails[1].deviceID = id;
  1298. openVRControllerDetails[1].controllerType = controllerType;
  1299. connectedControllerTypes |= Controller.RTouch;
  1300. }
  1301. }
  1302. }
  1303. }
  1304. }
  1305. }
  1306. /// <summary>
  1307. /// Runs once a frame to update cross-platform haptic playback
  1308. /// </summary>
  1309. private static void UpdateXRControllerHaptics()
  1310. {
  1311. if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR)
  1312. {
  1313. for (int i = 0; i < NUM_HAPTIC_CHANNELS; i++)
  1314. {
  1315. if (hapticInfos[i].playingHaptics)
  1316. {
  1317. hapticInfos[i].hapticsDurationPlayed += Time.deltaTime;
  1318. PlayHapticImpulse(hapticInfos[i].hapticAmplitude, hapticInfos[i].node);
  1319. if (hapticInfos[i].hapticsDurationPlayed >= hapticInfos[i].hapticsDuration)
  1320. {
  1321. hapticInfos[i].playingHaptics = false;
  1322. }
  1323. }
  1324. }
  1325. }
  1326. }
  1327. private static void InitHapticInfo()
  1328. {
  1329. hapticInfos = new HapticInfo[NUM_HAPTIC_CHANNELS];
  1330. for (int i = 0; i < NUM_HAPTIC_CHANNELS; i++)
  1331. {
  1332. hapticInfos[i] = new HapticInfo();
  1333. }
  1334. }
  1335. private static void PlayHapticImpulse(float amplitude, Node deviceNode)
  1336. {
  1337. OVR.OpenVR.CVRSystem system = OVR.OpenVR.OpenVR.System;
  1338. if (system != null && amplitude != 0.0f)
  1339. {
  1340. uint controllerId = (deviceNode == Node.LeftHand) ? openVRControllerDetails[0].deviceID : openVRControllerDetails[1].deviceID;
  1341. if (IsValidOpenVRDevice(controllerId))
  1342. system.TriggerHapticPulse(controllerId, 0, (char)(OPENVR_MAX_HAPTIC_AMPLITUDE * amplitude));
  1343. }
  1344. }
  1345. private static bool IsValidOpenVRDevice(uint deviceId)
  1346. {
  1347. return (deviceId >= 0 && deviceId < OVR.OpenVR.OpenVR.k_unMaxTrackedDeviceCount);
  1348. }
  1349. /// <summary>
  1350. /// Activates vibration with the given frequency and amplitude with the given controller mask.
  1351. /// Ignored on controllers that do not support vibration. Expected values range from 0 to 1.
  1352. /// </summary>
  1353. public static void SetControllerVibration(float frequency, float amplitude, Controller controllerMask = Controller.Active)
  1354. {
  1355. if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus)
  1356. {
  1357. if ((controllerMask & Controller.Active) != 0)
  1358. controllerMask |= activeControllerType;
  1359. for (int i = 0; i < controllers.Count; i++)
  1360. {
  1361. OVRControllerBase controller = controllers[i];
  1362. if (ShouldResolveController(controller.controllerType, controllerMask))
  1363. {
  1364. controller.SetControllerVibration(frequency, amplitude);
  1365. }
  1366. }
  1367. }
  1368. else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR)
  1369. {
  1370. if (controllerMask == Controller.LTouch || controllerMask == Controller.RTouch)
  1371. {
  1372. Node controllerNode = (controllerMask == Controller.LTouch) ? Node.LeftHand : Node.RightHand;
  1373. StartVibration(amplitude, HAPTIC_VIBRATION_DURATION_SECONDS, controllerNode);
  1374. }
  1375. }
  1376. }
  1377. /// <summary>
  1378. /// Triggers a recenter to realign the specified controller's virtual pose with the user's real-world pose.
  1379. /// Only applicable to controllers that require recentering, such as the GearVR Controller.
  1380. /// Ignored for controllers that do not require recentering.
  1381. /// </summary>
  1382. public static void RecenterController(Controller controllerMask = Controller.Active)
  1383. {
  1384. if ((controllerMask & Controller.Active) != 0)
  1385. controllerMask |= activeControllerType;
  1386. for (int i = 0; i < controllers.Count; i++)
  1387. {
  1388. OVRControllerBase controller = controllers[i];
  1389. if (ShouldResolveController(controller.controllerType, controllerMask))
  1390. {
  1391. controller.RecenterController();
  1392. }
  1393. }
  1394. }
  1395. /// <summary>
  1396. /// Returns true if the specified controller was recentered this frame.
  1397. /// Only applicable to controllers that require recentering, such as the GearVR Controller.
  1398. /// Returns false for controllers that do not require recentering.
  1399. /// </summary>
  1400. public static bool GetControllerWasRecentered(Controller controllerMask = Controller.Active)
  1401. {
  1402. if ((controllerMask & Controller.Active) != 0)
  1403. controllerMask |= activeControllerType;
  1404. bool wasRecentered = false;
  1405. for (int i = 0; i < controllers.Count; i++)
  1406. {
  1407. OVRControllerBase controller = controllers[i];
  1408. if (ShouldResolveController(controller.controllerType, controllerMask))
  1409. {
  1410. wasRecentered |= controller.WasRecentered();
  1411. }
  1412. }
  1413. return wasRecentered;
  1414. }
  1415. /// <summary>
  1416. /// Returns the number of times the controller has been recentered this session.
  1417. /// Useful for detecting recenter events and resetting state such as arm model simulations, etc.
  1418. /// Wraps around to 0 after 255.
  1419. /// Only applicable to controllers that require recentering, such as the GearVR Controller.
  1420. /// Returns 0 for controllers that do not require recentering.
  1421. /// </summary>
  1422. public static byte GetControllerRecenterCount(Controller controllerMask = Controller.Active)
  1423. {
  1424. if ((controllerMask & Controller.Active) != 0)
  1425. controllerMask |= activeControllerType;
  1426. byte recenterCount = 0;
  1427. for (int i = 0; i < controllers.Count; i++)
  1428. {
  1429. OVRControllerBase controller = controllers[i];
  1430. if (ShouldResolveController(controller.controllerType, controllerMask))
  1431. {
  1432. recenterCount = controller.GetRecenterCount();
  1433. break;
  1434. }
  1435. }
  1436. return recenterCount;
  1437. }
  1438. /// <summary>
  1439. /// Returns the battery percentage remaining for the specified controller. Values range from 0 to 100.
  1440. /// Only applicable to controllers that report battery level, such as the GearVR Controller.
  1441. /// Returns 0 for controllers that do not report battery level.
  1442. /// </summary>
  1443. public static byte GetControllerBatteryPercentRemaining(Controller controllerMask = Controller.Active)
  1444. {
  1445. if ((controllerMask & Controller.Active) != 0)
  1446. controllerMask |= activeControllerType;
  1447. byte battery = 0;
  1448. for (int i = 0; i < controllers.Count; i++)
  1449. {
  1450. OVRControllerBase controller = controllers[i];
  1451. if (ShouldResolveController(controller.controllerType, controllerMask))
  1452. {
  1453. battery = controller.GetBatteryPercentRemaining();
  1454. break;
  1455. }
  1456. }
  1457. return battery;
  1458. }
  1459. private static Vector2 CalculateAbsMax(Vector2 a, Vector2 b)
  1460. {
  1461. float absA = a.sqrMagnitude;
  1462. float absB = b.sqrMagnitude;
  1463. if (absA >= absB)
  1464. return a;
  1465. return b;
  1466. }
  1467. private static float CalculateAbsMax(float a, float b)
  1468. {
  1469. float absA = (a >= 0) ? a : -a;
  1470. float absB = (b >= 0) ? b : -b;
  1471. if (absA >= absB)
  1472. return a;
  1473. return b;
  1474. }
  1475. private static Vector2 CalculateDeadzone(Vector2 a, float deadzone)
  1476. {
  1477. if (a.sqrMagnitude <= (deadzone * deadzone))
  1478. return Vector2.zero;
  1479. a *= ((a.magnitude - deadzone) / (1.0f - deadzone));
  1480. if (a.sqrMagnitude > 1.0f)
  1481. return a.normalized;
  1482. return a;
  1483. }
  1484. private static float CalculateDeadzone(float a, float deadzone)
  1485. {
  1486. float mag = (a >= 0) ? a : -a;
  1487. if (mag <= deadzone)
  1488. return 0.0f;
  1489. a *= (mag - deadzone) / (1.0f - deadzone);
  1490. if ((a * a) > 1.0f)
  1491. return (a >= 0) ? 1.0f : -1.0f;
  1492. return a;
  1493. }
  1494. private static bool ShouldResolveController(Controller controllerType, Controller controllerMask)
  1495. {
  1496. bool isValid = false;
  1497. if ((controllerType & controllerMask) == controllerType)
  1498. {
  1499. isValid = true;
  1500. }
  1501. // If the mask requests both Touch controllers, reject the individual touch controllers.
  1502. if (((controllerMask & Controller.Touch) == Controller.Touch)
  1503. && ((controllerType & Controller.Touch) != 0)
  1504. && ((controllerType & Controller.Touch) != Controller.Touch))
  1505. {
  1506. isValid = false;
  1507. }
  1508. // If the mask requests both Hands, reject the individual hands.
  1509. if (((controllerMask & Controller.Hands) == Controller.Hands)
  1510. && ((controllerType & Controller.Hands) != 0)
  1511. && ((controllerType & Controller.Hands) != Controller.Hands))
  1512. {
  1513. isValid = false;
  1514. }
  1515. return isValid;
  1516. }
  1517. private abstract class OVRControllerBase
  1518. {
  1519. public class VirtualButtonMap
  1520. {
  1521. public RawButton None = RawButton.None;
  1522. public RawButton One = RawButton.None;
  1523. public RawButton Two = RawButton.None;
  1524. public RawButton Three = RawButton.None;
  1525. public RawButton Four = RawButton.None;
  1526. public RawButton Start = RawButton.None;
  1527. public RawButton Back = RawButton.None;
  1528. public RawButton PrimaryShoulder = RawButton.None;
  1529. public RawButton PrimaryIndexTrigger = RawButton.None;
  1530. public RawButton PrimaryHandTrigger = RawButton.None;
  1531. public RawButton PrimaryThumbstick = RawButton.None;
  1532. public RawButton PrimaryThumbstickUp = RawButton.None;
  1533. public RawButton PrimaryThumbstickDown = RawButton.None;
  1534. public RawButton PrimaryThumbstickLeft = RawButton.None;
  1535. public RawButton PrimaryThumbstickRight = RawButton.None;
  1536. public RawButton PrimaryTouchpad = RawButton.None;
  1537. public RawButton SecondaryShoulder = RawButton.None;
  1538. public RawButton SecondaryIndexTrigger = RawButton.None;
  1539. public RawButton SecondaryHandTrigger = RawButton.None;
  1540. public RawButton SecondaryThumbstick = RawButton.None;
  1541. public RawButton SecondaryThumbstickUp = RawButton.None;
  1542. public RawButton SecondaryThumbstickDown = RawButton.None;
  1543. public RawButton SecondaryThumbstickLeft = RawButton.None;
  1544. public RawButton SecondaryThumbstickRight = RawButton.None;
  1545. public RawButton SecondaryTouchpad = RawButton.None;
  1546. public RawButton DpadUp = RawButton.None;
  1547. public RawButton DpadDown = RawButton.None;
  1548. public RawButton DpadLeft = RawButton.None;
  1549. public RawButton DpadRight = RawButton.None;
  1550. public RawButton Up = RawButton.None;
  1551. public RawButton Down = RawButton.None;
  1552. public RawButton Left = RawButton.None;
  1553. public RawButton Right = RawButton.None;
  1554. public RawButton ToRawMask(Button virtualMask)
  1555. {
  1556. RawButton rawMask = 0;
  1557. if (virtualMask == Button.None)
  1558. return RawButton.None;
  1559. if ((virtualMask & Button.One) != 0)
  1560. rawMask |= One;
  1561. if ((virtualMask & Button.Two) != 0)
  1562. rawMask |= Two;
  1563. if ((virtualMask & Button.Three) != 0)
  1564. rawMask |= Three;
  1565. if ((virtualMask & Button.Four) != 0)
  1566. rawMask |= Four;
  1567. if ((virtualMask & Button.Start) != 0)
  1568. rawMask |= Start;
  1569. if ((virtualMask & Button.Back) != 0)
  1570. rawMask |= Back;
  1571. if ((virtualMask & Button.PrimaryShoulder) != 0)
  1572. rawMask |= PrimaryShoulder;
  1573. if ((virtualMask & Button.PrimaryIndexTrigger) != 0)
  1574. rawMask |= PrimaryIndexTrigger;
  1575. if ((virtualMask & Button.PrimaryHandTrigger) != 0)
  1576. rawMask |= PrimaryHandTrigger;
  1577. if ((virtualMask & Button.PrimaryThumbstick) != 0)
  1578. rawMask |= PrimaryThumbstick;
  1579. if ((virtualMask & Button.PrimaryThumbstickUp) != 0)
  1580. rawMask |= PrimaryThumbstickUp;
  1581. if ((virtualMask & Button.PrimaryThumbstickDown) != 0)
  1582. rawMask |= PrimaryThumbstickDown;
  1583. if ((virtualMask & Button.PrimaryThumbstickLeft) != 0)
  1584. rawMask |= PrimaryThumbstickLeft;
  1585. if ((virtualMask & Button.PrimaryThumbstickRight) != 0)
  1586. rawMask |= PrimaryThumbstickRight;
  1587. if ((virtualMask & Button.PrimaryTouchpad) != 0)
  1588. rawMask |= PrimaryTouchpad;
  1589. if ((virtualMask & Button.SecondaryShoulder) != 0)
  1590. rawMask |= SecondaryShoulder;
  1591. if ((virtualMask & Button.SecondaryIndexTrigger) != 0)
  1592. rawMask |= SecondaryIndexTrigger;
  1593. if ((virtualMask & Button.SecondaryHandTrigger) != 0)
  1594. rawMask |= SecondaryHandTrigger;
  1595. if ((virtualMask & Button.SecondaryThumbstick) != 0)
  1596. rawMask |= SecondaryThumbstick;
  1597. if ((virtualMask & Button.SecondaryThumbstickUp) != 0)
  1598. rawMask |= SecondaryThumbstickUp;
  1599. if ((virtualMask & Button.SecondaryThumbstickDown) != 0)
  1600. rawMask |= SecondaryThumbstickDown;
  1601. if ((virtualMask & Button.SecondaryThumbstickLeft) != 0)
  1602. rawMask |= SecondaryThumbstickLeft;
  1603. if ((virtualMask & Button.SecondaryThumbstickRight) != 0)
  1604. rawMask |= SecondaryThumbstickRight;
  1605. if ((virtualMask & Button.SecondaryTouchpad) != 0)
  1606. rawMask |= SecondaryTouchpad;
  1607. if ((virtualMask & Button.DpadUp) != 0)
  1608. rawMask |= DpadUp;
  1609. if ((virtualMask & Button.DpadDown) != 0)
  1610. rawMask |= DpadDown;
  1611. if ((virtualMask & Button.DpadLeft) != 0)
  1612. rawMask |= DpadLeft;
  1613. if ((virtualMask & Button.DpadRight) != 0)
  1614. rawMask |= DpadRight;
  1615. if ((virtualMask & Button.Up) != 0)
  1616. rawMask |= Up;
  1617. if ((virtualMask & Button.Down) != 0)
  1618. rawMask |= Down;
  1619. if ((virtualMask & Button.Left) != 0)
  1620. rawMask |= Left;
  1621. if ((virtualMask & Button.Right) != 0)
  1622. rawMask |= Right;
  1623. return rawMask;
  1624. }
  1625. }
  1626. public class VirtualTouchMap
  1627. {
  1628. public RawTouch None = RawTouch.None;
  1629. public RawTouch One = RawTouch.None;
  1630. public RawTouch Two = RawTouch.None;
  1631. public RawTouch Three = RawTouch.None;
  1632. public RawTouch Four = RawTouch.None;
  1633. public RawTouch PrimaryIndexTrigger = RawTouch.None;
  1634. public RawTouch PrimaryThumbstick = RawTouch.None;
  1635. public RawTouch PrimaryThumbRest = RawTouch.None;
  1636. public RawTouch PrimaryTouchpad = RawTouch.None;
  1637. public RawTouch SecondaryIndexTrigger = RawTouch.None;
  1638. public RawTouch SecondaryThumbstick = RawTouch.None;
  1639. public RawTouch SecondaryThumbRest = RawTouch.None;
  1640. public RawTouch SecondaryTouchpad = RawTouch.None;
  1641. public RawTouch ToRawMask(Touch virtualMask)
  1642. {
  1643. RawTouch rawMask = 0;
  1644. if (virtualMask == Touch.None)
  1645. return RawTouch.None;
  1646. if ((virtualMask & Touch.One) != 0)
  1647. rawMask |= One;
  1648. if ((virtualMask & Touch.Two) != 0)
  1649. rawMask |= Two;
  1650. if ((virtualMask & Touch.Three) != 0)
  1651. rawMask |= Three;
  1652. if ((virtualMask & Touch.Four) != 0)
  1653. rawMask |= Four;
  1654. if ((virtualMask & Touch.PrimaryIndexTrigger) != 0)
  1655. rawMask |= PrimaryIndexTrigger;
  1656. if ((virtualMask & Touch.PrimaryThumbstick) != 0)
  1657. rawMask |= PrimaryThumbstick;
  1658. if ((virtualMask & Touch.PrimaryThumbRest) != 0)
  1659. rawMask |= PrimaryThumbRest;
  1660. if ((virtualMask & Touch.PrimaryTouchpad) != 0)
  1661. rawMask |= PrimaryTouchpad;
  1662. if ((virtualMask & Touch.SecondaryIndexTrigger) != 0)
  1663. rawMask |= SecondaryIndexTrigger;
  1664. if ((virtualMask & Touch.SecondaryThumbstick) != 0)
  1665. rawMask |= SecondaryThumbstick;
  1666. if ((virtualMask & Touch.SecondaryThumbRest) != 0)
  1667. rawMask |= SecondaryThumbRest;
  1668. if ((virtualMask & Touch.SecondaryTouchpad) != 0)
  1669. rawMask |= SecondaryTouchpad;
  1670. return rawMask;
  1671. }
  1672. }
  1673. public class VirtualNearTouchMap
  1674. {
  1675. public RawNearTouch None = RawNearTouch.None;
  1676. public RawNearTouch PrimaryIndexTrigger = RawNearTouch.None;
  1677. public RawNearTouch PrimaryThumbButtons = RawNearTouch.None;
  1678. public RawNearTouch SecondaryIndexTrigger = RawNearTouch.None;
  1679. public RawNearTouch SecondaryThumbButtons = RawNearTouch.None;
  1680. public RawNearTouch ToRawMask(NearTouch virtualMask)
  1681. {
  1682. RawNearTouch rawMask = 0;
  1683. if (virtualMask == NearTouch.None)
  1684. return RawNearTouch.None;
  1685. if ((virtualMask & NearTouch.PrimaryIndexTrigger) != 0)
  1686. rawMask |= PrimaryIndexTrigger;
  1687. if ((virtualMask & NearTouch.PrimaryThumbButtons) != 0)
  1688. rawMask |= PrimaryThumbButtons;
  1689. if ((virtualMask & NearTouch.SecondaryIndexTrigger) != 0)
  1690. rawMask |= SecondaryIndexTrigger;
  1691. if ((virtualMask & NearTouch.SecondaryThumbButtons) != 0)
  1692. rawMask |= SecondaryThumbButtons;
  1693. return rawMask;
  1694. }
  1695. }
  1696. public class VirtualAxis1DMap
  1697. {
  1698. public RawAxis1D None = RawAxis1D.None;
  1699. public RawAxis1D PrimaryIndexTrigger = RawAxis1D.None;
  1700. public RawAxis1D PrimaryHandTrigger = RawAxis1D.None;
  1701. public RawAxis1D SecondaryIndexTrigger = RawAxis1D.None;
  1702. public RawAxis1D SecondaryHandTrigger = RawAxis1D.None;
  1703. public RawAxis1D ToRawMask(Axis1D virtualMask)
  1704. {
  1705. RawAxis1D rawMask = 0;
  1706. if (virtualMask == Axis1D.None)
  1707. return RawAxis1D.None;
  1708. if ((virtualMask & Axis1D.PrimaryIndexTrigger) != 0)
  1709. rawMask |= PrimaryIndexTrigger;
  1710. if ((virtualMask & Axis1D.PrimaryHandTrigger) != 0)
  1711. rawMask |= PrimaryHandTrigger;
  1712. if ((virtualMask & Axis1D.SecondaryIndexTrigger) != 0)
  1713. rawMask |= SecondaryIndexTrigger;
  1714. if ((virtualMask & Axis1D.SecondaryHandTrigger) != 0)
  1715. rawMask |= SecondaryHandTrigger;
  1716. return rawMask;
  1717. }
  1718. }
  1719. public class VirtualAxis2DMap
  1720. {
  1721. public RawAxis2D None = RawAxis2D.None;
  1722. public RawAxis2D PrimaryThumbstick = RawAxis2D.None;
  1723. public RawAxis2D PrimaryTouchpad = RawAxis2D.None;
  1724. public RawAxis2D SecondaryThumbstick = RawAxis2D.None;
  1725. public RawAxis2D SecondaryTouchpad = RawAxis2D.None;
  1726. public RawAxis2D ToRawMask(Axis2D virtualMask)
  1727. {
  1728. RawAxis2D rawMask = 0;
  1729. if (virtualMask == Axis2D.None)
  1730. return RawAxis2D.None;
  1731. if ((virtualMask & Axis2D.PrimaryThumbstick) != 0)
  1732. rawMask |= PrimaryThumbstick;
  1733. if ((virtualMask & Axis2D.PrimaryTouchpad) != 0)
  1734. rawMask |= PrimaryTouchpad;
  1735. if ((virtualMask & Axis2D.SecondaryThumbstick) != 0)
  1736. rawMask |= SecondaryThumbstick;
  1737. if ((virtualMask & Axis2D.SecondaryTouchpad) != 0)
  1738. rawMask |= SecondaryTouchpad;
  1739. return rawMask;
  1740. }
  1741. }
  1742. public Controller controllerType = Controller.None;
  1743. public VirtualButtonMap buttonMap = new VirtualButtonMap();
  1744. public VirtualTouchMap touchMap = new VirtualTouchMap();
  1745. public VirtualNearTouchMap nearTouchMap = new VirtualNearTouchMap();
  1746. public VirtualAxis1DMap axis1DMap = new VirtualAxis1DMap();
  1747. public VirtualAxis2DMap axis2DMap = new VirtualAxis2DMap();
  1748. public OVRPlugin.ControllerState4 previousState = new OVRPlugin.ControllerState4();
  1749. public OVRPlugin.ControllerState4 currentState = new OVRPlugin.ControllerState4();
  1750. public bool shouldApplyDeadzone = true;
  1751. public OVRControllerBase()
  1752. {
  1753. ConfigureButtonMap();
  1754. ConfigureTouchMap();
  1755. ConfigureNearTouchMap();
  1756. ConfigureAxis1DMap();
  1757. ConfigureAxis2DMap();
  1758. }
  1759. public virtual Controller Update()
  1760. {
  1761. OVRPlugin.ControllerState4 state;
  1762. if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR && ( (controllerType & Controller.Touch) != 0) )
  1763. state = GetOpenVRControllerState(controllerType);
  1764. else
  1765. state = OVRPlugin.GetControllerState4((uint)controllerType);
  1766. if (state.LIndexTrigger >= AXIS_AS_BUTTON_THRESHOLD)
  1767. state.Buttons |= (uint)RawButton.LIndexTrigger;
  1768. if (state.LHandTrigger >= AXIS_AS_BUTTON_THRESHOLD)
  1769. state.Buttons |= (uint)RawButton.LHandTrigger;
  1770. if (state.LThumbstick.y >= AXIS_AS_BUTTON_THRESHOLD)
  1771. state.Buttons |= (uint)RawButton.LThumbstickUp;
  1772. if (state.LThumbstick.y <= -AXIS_AS_BUTTON_THRESHOLD)
  1773. state.Buttons |= (uint)RawButton.LThumbstickDown;
  1774. if (state.LThumbstick.x <= -AXIS_AS_BUTTON_THRESHOLD)
  1775. state.Buttons |= (uint)RawButton.LThumbstickLeft;
  1776. if (state.LThumbstick.x >= AXIS_AS_BUTTON_THRESHOLD)
  1777. state.Buttons |= (uint)RawButton.LThumbstickRight;
  1778. if (state.RIndexTrigger >= AXIS_AS_BUTTON_THRESHOLD)
  1779. state.Buttons |= (uint)RawButton.RIndexTrigger;
  1780. if (state.RHandTrigger >= AXIS_AS_BUTTON_THRESHOLD)
  1781. state.Buttons |= (uint)RawButton.RHandTrigger;
  1782. if (state.RThumbstick.y >= AXIS_AS_BUTTON_THRESHOLD)
  1783. state.Buttons |= (uint)RawButton.RThumbstickUp;
  1784. if (state.RThumbstick.y <= -AXIS_AS_BUTTON_THRESHOLD)
  1785. state.Buttons |= (uint)RawButton.RThumbstickDown;
  1786. if (state.RThumbstick.x <= -AXIS_AS_BUTTON_THRESHOLD)
  1787. state.Buttons |= (uint)RawButton.RThumbstickLeft;
  1788. if (state.RThumbstick.x >= AXIS_AS_BUTTON_THRESHOLD)
  1789. state.Buttons |= (uint)RawButton.RThumbstickRight;
  1790. previousState = currentState;
  1791. currentState = state;
  1792. return ((Controller)currentState.ConnectedControllers & controllerType);
  1793. }
  1794. private OVRPlugin.ControllerState4 GetOpenVRControllerState(Controller controllerType)
  1795. {
  1796. OVRPlugin.ControllerState4 state = new OVRPlugin.ControllerState4();
  1797. if ((controllerType & Controller.LTouch) == Controller.LTouch && IsValidOpenVRDevice(openVRControllerDetails[0].deviceID))
  1798. {
  1799. OVR.OpenVR.VRControllerState_t leftControllerState = openVRControllerDetails[0].state;
  1800. if ((leftControllerState.ulButtonPressed & ((ulong)OpenVRButton.Two)) == (ulong)OpenVRButton.Two)
  1801. state.Buttons |= (uint)RawButton.Y;
  1802. if ((leftControllerState.ulButtonPressed & ((ulong)OpenVRButton.Thumbstick)) == (ulong)OpenVRButton.Thumbstick)
  1803. state.Buttons |= (uint)RawButton.LThumbstick;
  1804. state.LIndexTrigger = leftControllerState.rAxis1.x;
  1805. if (openVRControllerDetails[0].controllerType == OpenVRController.OculusTouch || openVRControllerDetails[0].controllerType == OpenVRController.ViveController)
  1806. {
  1807. state.LThumbstick.x = leftControllerState.rAxis0.x;
  1808. state.LThumbstick.y = leftControllerState.rAxis0.y;
  1809. }
  1810. else if (openVRControllerDetails[0].controllerType == OpenVRController.WindowsMRController)
  1811. {
  1812. state.LThumbstick.x = leftControllerState.rAxis2.x;
  1813. state.LThumbstick.y = leftControllerState.rAxis2.y;
  1814. }
  1815. if (openVRControllerDetails[0].controllerType == OpenVRController.OculusTouch)
  1816. state.LHandTrigger = leftControllerState.rAxis2.x;
  1817. else if (openVRControllerDetails[0].controllerType == OpenVRController.ViveController || openVRControllerDetails[0].controllerType == OpenVRController.WindowsMRController)
  1818. state.LHandTrigger = ((leftControllerState.ulButtonPressed & ((ulong)OpenVRButton.Grip)) == ((ulong)OpenVRButton.Grip)) ? 1 : 0;
  1819. }
  1820. if ((controllerType & Controller.RTouch) == Controller.RTouch && IsValidOpenVRDevice(openVRControllerDetails[1].deviceID))
  1821. {
  1822. OVR.OpenVR.VRControllerState_t rightControllerState = openVRControllerDetails[1].state;
  1823. if ((rightControllerState.ulButtonPressed & ((ulong)OpenVRButton.Two)) == (ulong)OpenVRButton.Two)
  1824. state.Buttons |= (uint)RawButton.B;
  1825. if ((rightControllerState.ulButtonPressed & ((ulong)OpenVRButton.Thumbstick)) == (ulong)OpenVRButton.Thumbstick)
  1826. state.Buttons |= (uint)RawButton.RThumbstick;
  1827. state.RIndexTrigger = rightControllerState.rAxis1.x;
  1828. if (openVRControllerDetails[1].controllerType == OpenVRController.OculusTouch || openVRControllerDetails[1].controllerType == OpenVRController.ViveController)
  1829. {
  1830. state.RThumbstick.x = rightControllerState.rAxis0.x;
  1831. state.RThumbstick.y = rightControllerState.rAxis0.y;
  1832. }
  1833. else if (openVRControllerDetails[1].controllerType == OpenVRController.WindowsMRController)
  1834. {
  1835. state.RThumbstick.x = rightControllerState.rAxis2.x;
  1836. state.RThumbstick.y = rightControllerState.rAxis2.y;
  1837. }
  1838. if (openVRControllerDetails[1].controllerType == OpenVRController.OculusTouch)
  1839. state.RHandTrigger = rightControllerState.rAxis2.x;
  1840. else if (openVRControllerDetails[1].controllerType == OpenVRController.ViveController || openVRControllerDetails[1].controllerType == OpenVRController.WindowsMRController)
  1841. state.RHandTrigger = ((rightControllerState.ulButtonPressed & ((ulong)OpenVRButton.Grip)) == ((ulong)OpenVRButton.Grip)) ? 1 : 0;
  1842. }
  1843. return state;
  1844. }
  1845. public virtual void SetControllerVibration(float frequency, float amplitude)
  1846. {
  1847. OVRPlugin.SetControllerVibration((uint)controllerType, frequency, amplitude);
  1848. }
  1849. public virtual void RecenterController()
  1850. {
  1851. OVRPlugin.RecenterTrackingOrigin(OVRPlugin.RecenterFlags.Controllers);
  1852. }
  1853. public virtual bool WasRecentered()
  1854. {
  1855. return false;
  1856. }
  1857. public virtual byte GetRecenterCount()
  1858. {
  1859. return 0;
  1860. }
  1861. public virtual byte GetBatteryPercentRemaining()
  1862. {
  1863. return 0;
  1864. }
  1865. public abstract void ConfigureButtonMap();
  1866. public abstract void ConfigureTouchMap();
  1867. public abstract void ConfigureNearTouchMap();
  1868. public abstract void ConfigureAxis1DMap();
  1869. public abstract void ConfigureAxis2DMap();
  1870. public RawButton ResolveToRawMask(Button virtualMask)
  1871. {
  1872. return buttonMap.ToRawMask(virtualMask);
  1873. }
  1874. public RawTouch ResolveToRawMask(Touch virtualMask)
  1875. {
  1876. return touchMap.ToRawMask(virtualMask);
  1877. }
  1878. public RawNearTouch ResolveToRawMask(NearTouch virtualMask)
  1879. {
  1880. return nearTouchMap.ToRawMask(virtualMask);
  1881. }
  1882. public RawAxis1D ResolveToRawMask(Axis1D virtualMask)
  1883. {
  1884. return axis1DMap.ToRawMask(virtualMask);
  1885. }
  1886. public RawAxis2D ResolveToRawMask(Axis2D virtualMask)
  1887. {
  1888. return axis2DMap.ToRawMask(virtualMask);
  1889. }
  1890. }
  1891. private class OVRControllerTouch : OVRControllerBase
  1892. {
  1893. public OVRControllerTouch()
  1894. {
  1895. controllerType = Controller.Touch;
  1896. }
  1897. public override void ConfigureButtonMap()
  1898. {
  1899. buttonMap.None = RawButton.None;
  1900. buttonMap.One = RawButton.A;
  1901. buttonMap.Two = RawButton.B;
  1902. buttonMap.Three = RawButton.X;
  1903. buttonMap.Four = RawButton.Y;
  1904. buttonMap.Start = RawButton.Start;
  1905. buttonMap.Back = RawButton.None;
  1906. buttonMap.PrimaryShoulder = RawButton.None;
  1907. buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger;
  1908. buttonMap.PrimaryHandTrigger = RawButton.LHandTrigger;
  1909. buttonMap.PrimaryThumbstick = RawButton.LThumbstick;
  1910. buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp;
  1911. buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown;
  1912. buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft;
  1913. buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight;
  1914. buttonMap.PrimaryTouchpad = RawButton.None;
  1915. buttonMap.SecondaryShoulder = RawButton.None;
  1916. buttonMap.SecondaryIndexTrigger = RawButton.RIndexTrigger;
  1917. buttonMap.SecondaryHandTrigger = RawButton.RHandTrigger;
  1918. buttonMap.SecondaryThumbstick = RawButton.RThumbstick;
  1919. buttonMap.SecondaryThumbstickUp = RawButton.RThumbstickUp;
  1920. buttonMap.SecondaryThumbstickDown = RawButton.RThumbstickDown;
  1921. buttonMap.SecondaryThumbstickLeft = RawButton.RThumbstickLeft;
  1922. buttonMap.SecondaryThumbstickRight = RawButton.RThumbstickRight;
  1923. buttonMap.SecondaryTouchpad = RawButton.None;
  1924. buttonMap.DpadUp = RawButton.None;
  1925. buttonMap.DpadDown = RawButton.None;
  1926. buttonMap.DpadLeft = RawButton.None;
  1927. buttonMap.DpadRight = RawButton.None;
  1928. buttonMap.Up = RawButton.LThumbstickUp;
  1929. buttonMap.Down = RawButton.LThumbstickDown;
  1930. buttonMap.Left = RawButton.LThumbstickLeft;
  1931. buttonMap.Right = RawButton.LThumbstickRight;
  1932. }
  1933. public override void ConfigureTouchMap()
  1934. {
  1935. touchMap.None = RawTouch.None;
  1936. touchMap.One = RawTouch.A;
  1937. touchMap.Two = RawTouch.B;
  1938. touchMap.Three = RawTouch.X;
  1939. touchMap.Four = RawTouch.Y;
  1940. touchMap.PrimaryIndexTrigger = RawTouch.LIndexTrigger;
  1941. touchMap.PrimaryThumbstick = RawTouch.LThumbstick;
  1942. touchMap.PrimaryThumbRest = RawTouch.LThumbRest;
  1943. touchMap.PrimaryTouchpad = RawTouch.None;
  1944. touchMap.SecondaryIndexTrigger = RawTouch.RIndexTrigger;
  1945. touchMap.SecondaryThumbstick = RawTouch.RThumbstick;
  1946. touchMap.SecondaryThumbRest = RawTouch.RThumbRest;
  1947. touchMap.SecondaryTouchpad = RawTouch.None;
  1948. }
  1949. public override void ConfigureNearTouchMap()
  1950. {
  1951. nearTouchMap.None = RawNearTouch.None;
  1952. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.LIndexTrigger;
  1953. nearTouchMap.PrimaryThumbButtons = RawNearTouch.LThumbButtons;
  1954. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.RIndexTrigger;
  1955. nearTouchMap.SecondaryThumbButtons = RawNearTouch.RThumbButtons;
  1956. }
  1957. public override void ConfigureAxis1DMap()
  1958. {
  1959. axis1DMap.None = RawAxis1D.None;
  1960. axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger;
  1961. axis1DMap.PrimaryHandTrigger = RawAxis1D.LHandTrigger;
  1962. axis1DMap.SecondaryIndexTrigger = RawAxis1D.RIndexTrigger;
  1963. axis1DMap.SecondaryHandTrigger = RawAxis1D.RHandTrigger;
  1964. }
  1965. public override void ConfigureAxis2DMap()
  1966. {
  1967. axis2DMap.None = RawAxis2D.None;
  1968. axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick;
  1969. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  1970. axis2DMap.SecondaryThumbstick = RawAxis2D.RThumbstick;
  1971. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  1972. }
  1973. public override bool WasRecentered()
  1974. {
  1975. return ((currentState.LRecenterCount + currentState.RRecenterCount) != (previousState.LRecenterCount + previousState.RRecenterCount));
  1976. }
  1977. public override byte GetRecenterCount()
  1978. {
  1979. return (byte)(currentState.LRecenterCount + currentState.RRecenterCount);
  1980. }
  1981. public override byte GetBatteryPercentRemaining()
  1982. {
  1983. byte leftBattery = currentState.LBatteryPercentRemaining;
  1984. byte rightBattery = currentState.RBatteryPercentRemaining;
  1985. byte minBattery = (leftBattery <= rightBattery) ? leftBattery : rightBattery;
  1986. return minBattery;
  1987. }
  1988. }
  1989. private class OVRControllerLTouch : OVRControllerBase
  1990. {
  1991. public OVRControllerLTouch()
  1992. {
  1993. controllerType = Controller.LTouch;
  1994. }
  1995. public override void ConfigureButtonMap()
  1996. {
  1997. buttonMap.None = RawButton.None;
  1998. buttonMap.One = RawButton.X;
  1999. buttonMap.Two = RawButton.Y;
  2000. buttonMap.Three = RawButton.None;
  2001. buttonMap.Four = RawButton.None;
  2002. buttonMap.Start = RawButton.Start;
  2003. buttonMap.Back = RawButton.None;
  2004. buttonMap.PrimaryShoulder = RawButton.None;
  2005. buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger;
  2006. buttonMap.PrimaryHandTrigger = RawButton.LHandTrigger;
  2007. buttonMap.PrimaryThumbstick = RawButton.LThumbstick;
  2008. buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp;
  2009. buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown;
  2010. buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft;
  2011. buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight;
  2012. buttonMap.PrimaryTouchpad = RawButton.None;
  2013. buttonMap.SecondaryShoulder = RawButton.None;
  2014. buttonMap.SecondaryIndexTrigger = RawButton.None;
  2015. buttonMap.SecondaryHandTrigger = RawButton.None;
  2016. buttonMap.SecondaryThumbstick = RawButton.None;
  2017. buttonMap.SecondaryThumbstickUp = RawButton.None;
  2018. buttonMap.SecondaryThumbstickDown = RawButton.None;
  2019. buttonMap.SecondaryThumbstickLeft = RawButton.None;
  2020. buttonMap.SecondaryThumbstickRight = RawButton.None;
  2021. buttonMap.SecondaryTouchpad = RawButton.None;
  2022. buttonMap.DpadUp = RawButton.None;
  2023. buttonMap.DpadDown = RawButton.None;
  2024. buttonMap.DpadLeft = RawButton.None;
  2025. buttonMap.DpadRight = RawButton.None;
  2026. buttonMap.Up = RawButton.LThumbstickUp;
  2027. buttonMap.Down = RawButton.LThumbstickDown;
  2028. buttonMap.Left = RawButton.LThumbstickLeft;
  2029. buttonMap.Right = RawButton.LThumbstickRight;
  2030. }
  2031. public override void ConfigureTouchMap()
  2032. {
  2033. touchMap.None = RawTouch.None;
  2034. touchMap.One = RawTouch.X;
  2035. touchMap.Two = RawTouch.Y;
  2036. touchMap.Three = RawTouch.None;
  2037. touchMap.Four = RawTouch.None;
  2038. touchMap.PrimaryIndexTrigger = RawTouch.LIndexTrigger;
  2039. touchMap.PrimaryThumbstick = RawTouch.LThumbstick;
  2040. touchMap.PrimaryThumbRest = RawTouch.LThumbRest;
  2041. touchMap.PrimaryTouchpad = RawTouch.None;
  2042. touchMap.SecondaryIndexTrigger = RawTouch.None;
  2043. touchMap.SecondaryThumbstick = RawTouch.None;
  2044. touchMap.SecondaryThumbRest = RawTouch.None;
  2045. touchMap.SecondaryTouchpad = RawTouch.None;
  2046. }
  2047. public override void ConfigureNearTouchMap()
  2048. {
  2049. nearTouchMap.None = RawNearTouch.None;
  2050. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.LIndexTrigger;
  2051. nearTouchMap.PrimaryThumbButtons = RawNearTouch.LThumbButtons;
  2052. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  2053. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  2054. }
  2055. public override void ConfigureAxis1DMap()
  2056. {
  2057. axis1DMap.None = RawAxis1D.None;
  2058. axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger;
  2059. axis1DMap.PrimaryHandTrigger = RawAxis1D.LHandTrigger;
  2060. axis1DMap.SecondaryIndexTrigger = RawAxis1D.None;
  2061. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  2062. }
  2063. public override void ConfigureAxis2DMap()
  2064. {
  2065. axis2DMap.None = RawAxis2D.None;
  2066. axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick;
  2067. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  2068. axis2DMap.SecondaryThumbstick = RawAxis2D.None;
  2069. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  2070. }
  2071. public override bool WasRecentered()
  2072. {
  2073. return (currentState.LRecenterCount != previousState.LRecenterCount);
  2074. }
  2075. public override byte GetRecenterCount()
  2076. {
  2077. return currentState.LRecenterCount;
  2078. }
  2079. public override byte GetBatteryPercentRemaining()
  2080. {
  2081. return currentState.LBatteryPercentRemaining;
  2082. }
  2083. }
  2084. private class OVRControllerRTouch : OVRControllerBase
  2085. {
  2086. public OVRControllerRTouch()
  2087. {
  2088. controllerType = Controller.RTouch;
  2089. }
  2090. public override void ConfigureButtonMap()
  2091. {
  2092. buttonMap.None = RawButton.None;
  2093. buttonMap.One = RawButton.A;
  2094. buttonMap.Two = RawButton.B;
  2095. buttonMap.Three = RawButton.None;
  2096. buttonMap.Four = RawButton.None;
  2097. buttonMap.Start = RawButton.None;
  2098. buttonMap.Back = RawButton.None;
  2099. buttonMap.PrimaryShoulder = RawButton.None;
  2100. buttonMap.PrimaryIndexTrigger = RawButton.RIndexTrigger;
  2101. buttonMap.PrimaryHandTrigger = RawButton.RHandTrigger;
  2102. buttonMap.PrimaryThumbstick = RawButton.RThumbstick;
  2103. buttonMap.PrimaryThumbstickUp = RawButton.RThumbstickUp;
  2104. buttonMap.PrimaryThumbstickDown = RawButton.RThumbstickDown;
  2105. buttonMap.PrimaryThumbstickLeft = RawButton.RThumbstickLeft;
  2106. buttonMap.PrimaryThumbstickRight = RawButton.RThumbstickRight;
  2107. buttonMap.PrimaryTouchpad = RawButton.None;
  2108. buttonMap.SecondaryShoulder = RawButton.None;
  2109. buttonMap.SecondaryIndexTrigger = RawButton.None;
  2110. buttonMap.SecondaryHandTrigger = RawButton.None;
  2111. buttonMap.SecondaryThumbstick = RawButton.None;
  2112. buttonMap.SecondaryThumbstickUp = RawButton.None;
  2113. buttonMap.SecondaryThumbstickDown = RawButton.None;
  2114. buttonMap.SecondaryThumbstickLeft = RawButton.None;
  2115. buttonMap.SecondaryThumbstickRight = RawButton.None;
  2116. buttonMap.SecondaryTouchpad = RawButton.None;
  2117. buttonMap.DpadUp = RawButton.None;
  2118. buttonMap.DpadDown = RawButton.None;
  2119. buttonMap.DpadLeft = RawButton.None;
  2120. buttonMap.DpadRight = RawButton.None;
  2121. buttonMap.Up = RawButton.RThumbstickUp;
  2122. buttonMap.Down = RawButton.RThumbstickDown;
  2123. buttonMap.Left = RawButton.RThumbstickLeft;
  2124. buttonMap.Right = RawButton.RThumbstickRight;
  2125. }
  2126. public override void ConfigureTouchMap()
  2127. {
  2128. touchMap.None = RawTouch.None;
  2129. touchMap.One = RawTouch.A;
  2130. touchMap.Two = RawTouch.B;
  2131. touchMap.Three = RawTouch.None;
  2132. touchMap.Four = RawTouch.None;
  2133. touchMap.PrimaryIndexTrigger = RawTouch.RIndexTrigger;
  2134. touchMap.PrimaryThumbstick = RawTouch.RThumbstick;
  2135. touchMap.PrimaryThumbRest = RawTouch.RThumbRest;
  2136. touchMap.PrimaryTouchpad = RawTouch.None;
  2137. touchMap.SecondaryIndexTrigger = RawTouch.None;
  2138. touchMap.SecondaryThumbstick = RawTouch.None;
  2139. touchMap.SecondaryThumbRest = RawTouch.None;
  2140. touchMap.SecondaryTouchpad = RawTouch.None;
  2141. }
  2142. public override void ConfigureNearTouchMap()
  2143. {
  2144. nearTouchMap.None = RawNearTouch.None;
  2145. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.RIndexTrigger;
  2146. nearTouchMap.PrimaryThumbButtons = RawNearTouch.RThumbButtons;
  2147. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  2148. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  2149. }
  2150. public override void ConfigureAxis1DMap()
  2151. {
  2152. axis1DMap.None = RawAxis1D.None;
  2153. axis1DMap.PrimaryIndexTrigger = RawAxis1D.RIndexTrigger;
  2154. axis1DMap.PrimaryHandTrigger = RawAxis1D.RHandTrigger;
  2155. axis1DMap.SecondaryIndexTrigger = RawAxis1D.None;
  2156. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  2157. }
  2158. public override void ConfigureAxis2DMap()
  2159. {
  2160. axis2DMap.None = RawAxis2D.None;
  2161. axis2DMap.PrimaryThumbstick = RawAxis2D.RThumbstick;
  2162. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  2163. axis2DMap.SecondaryThumbstick = RawAxis2D.None;
  2164. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  2165. }
  2166. public override bool WasRecentered()
  2167. {
  2168. return (currentState.RRecenterCount != previousState.RRecenterCount);
  2169. }
  2170. public override byte GetRecenterCount()
  2171. {
  2172. return currentState.RRecenterCount;
  2173. }
  2174. public override byte GetBatteryPercentRemaining()
  2175. {
  2176. return currentState.RBatteryPercentRemaining;
  2177. }
  2178. }
  2179. private class OVRControllerHands : OVRControllerBase
  2180. {
  2181. public OVRControllerHands()
  2182. {
  2183. controllerType = Controller.Hands;
  2184. }
  2185. public override void ConfigureButtonMap()
  2186. {
  2187. buttonMap.None = RawButton.None;
  2188. buttonMap.One = RawButton.A;
  2189. buttonMap.Two = RawButton.None;
  2190. buttonMap.Three = RawButton.X;
  2191. buttonMap.Four = RawButton.None;
  2192. buttonMap.Start = RawButton.None;
  2193. buttonMap.Back = RawButton.None;
  2194. buttonMap.PrimaryShoulder = RawButton.None;
  2195. buttonMap.PrimaryIndexTrigger = RawButton.None;
  2196. buttonMap.PrimaryHandTrigger = RawButton.None;
  2197. buttonMap.PrimaryThumbstick = RawButton.None;
  2198. buttonMap.PrimaryThumbstickUp = RawButton.None;
  2199. buttonMap.PrimaryThumbstickDown = RawButton.None;
  2200. buttonMap.PrimaryThumbstickLeft = RawButton.None;
  2201. buttonMap.PrimaryThumbstickRight = RawButton.None;
  2202. buttonMap.PrimaryTouchpad = RawButton.None;
  2203. buttonMap.SecondaryShoulder = RawButton.None;
  2204. buttonMap.SecondaryIndexTrigger = RawButton.None;
  2205. buttonMap.SecondaryHandTrigger = RawButton.None;
  2206. buttonMap.SecondaryThumbstick = RawButton.None;
  2207. buttonMap.SecondaryThumbstickUp = RawButton.None;
  2208. buttonMap.SecondaryThumbstickDown = RawButton.None;
  2209. buttonMap.SecondaryThumbstickLeft = RawButton.None;
  2210. buttonMap.SecondaryThumbstickRight = RawButton.None;
  2211. buttonMap.SecondaryTouchpad = RawButton.None;
  2212. buttonMap.DpadUp = RawButton.None;
  2213. buttonMap.DpadDown = RawButton.None;
  2214. buttonMap.DpadLeft = RawButton.None;
  2215. buttonMap.DpadRight = RawButton.None;
  2216. buttonMap.Up = RawButton.None;
  2217. buttonMap.Down = RawButton.None;
  2218. buttonMap.Left = RawButton.None;
  2219. buttonMap.Right = RawButton.None;
  2220. }
  2221. public override void ConfigureTouchMap()
  2222. {
  2223. touchMap.None = RawTouch.None;
  2224. touchMap.One = RawTouch.None;
  2225. touchMap.Two = RawTouch.None;
  2226. touchMap.Three = RawTouch.None;
  2227. touchMap.Four = RawTouch.None;
  2228. touchMap.PrimaryIndexTrigger = RawTouch.None;
  2229. touchMap.PrimaryThumbstick = RawTouch.None;
  2230. touchMap.PrimaryThumbRest = RawTouch.None;
  2231. touchMap.PrimaryTouchpad = RawTouch.None;
  2232. touchMap.SecondaryIndexTrigger = RawTouch.None;
  2233. touchMap.SecondaryThumbstick = RawTouch.None;
  2234. touchMap.SecondaryThumbRest = RawTouch.None;
  2235. touchMap.SecondaryTouchpad = RawTouch.None;
  2236. }
  2237. public override void ConfigureNearTouchMap()
  2238. {
  2239. nearTouchMap.None = RawNearTouch.None;
  2240. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  2241. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  2242. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  2243. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  2244. }
  2245. public override void ConfigureAxis1DMap()
  2246. {
  2247. axis1DMap.None = RawAxis1D.None;
  2248. axis1DMap.PrimaryIndexTrigger = RawAxis1D.None;
  2249. axis1DMap.PrimaryHandTrigger = RawAxis1D.None;
  2250. axis1DMap.SecondaryIndexTrigger = RawAxis1D.None;
  2251. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  2252. }
  2253. public override void ConfigureAxis2DMap()
  2254. {
  2255. axis2DMap.None = RawAxis2D.None;
  2256. axis2DMap.PrimaryThumbstick = RawAxis2D.None;
  2257. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  2258. axis2DMap.SecondaryThumbstick = RawAxis2D.None;
  2259. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  2260. }
  2261. public override bool WasRecentered()
  2262. {
  2263. return ((currentState.LRecenterCount + currentState.RRecenterCount) != (previousState.LRecenterCount + previousState.RRecenterCount));
  2264. }
  2265. public override byte GetRecenterCount()
  2266. {
  2267. return (byte)(currentState.LRecenterCount + currentState.RRecenterCount);
  2268. }
  2269. public override byte GetBatteryPercentRemaining()
  2270. {
  2271. byte leftBattery = currentState.LBatteryPercentRemaining;
  2272. byte rightBattery = currentState.RBatteryPercentRemaining;
  2273. byte minBattery = (leftBattery <= rightBattery) ? leftBattery : rightBattery;
  2274. return minBattery;
  2275. }
  2276. }
  2277. private class OVRControllerLHand : OVRControllerBase
  2278. {
  2279. public OVRControllerLHand()
  2280. {
  2281. controllerType = Controller.LHand;
  2282. }
  2283. public override void ConfigureButtonMap()
  2284. {
  2285. buttonMap.None = RawButton.None;
  2286. buttonMap.One = RawButton.X;
  2287. buttonMap.Two = RawButton.None;
  2288. buttonMap.Three = RawButton.None;
  2289. buttonMap.Four = RawButton.None;
  2290. buttonMap.Start = RawButton.None;
  2291. buttonMap.Back = RawButton.None;
  2292. buttonMap.PrimaryShoulder = RawButton.None;
  2293. buttonMap.PrimaryIndexTrigger = RawButton.None;
  2294. buttonMap.PrimaryHandTrigger = RawButton.None;
  2295. buttonMap.PrimaryThumbstick = RawButton.None;
  2296. buttonMap.PrimaryThumbstickUp = RawButton.None;
  2297. buttonMap.PrimaryThumbstickDown = RawButton.None;
  2298. buttonMap.PrimaryThumbstickLeft = RawButton.None;
  2299. buttonMap.PrimaryThumbstickRight = RawButton.None;
  2300. buttonMap.PrimaryTouchpad = RawButton.None;
  2301. buttonMap.SecondaryShoulder = RawButton.None;
  2302. buttonMap.SecondaryIndexTrigger = RawButton.None;
  2303. buttonMap.SecondaryHandTrigger = RawButton.None;
  2304. buttonMap.SecondaryThumbstick = RawButton.None;
  2305. buttonMap.SecondaryThumbstickUp = RawButton.None;
  2306. buttonMap.SecondaryThumbstickDown = RawButton.None;
  2307. buttonMap.SecondaryThumbstickLeft = RawButton.None;
  2308. buttonMap.SecondaryThumbstickRight = RawButton.None;
  2309. buttonMap.SecondaryTouchpad = RawButton.None;
  2310. buttonMap.DpadUp = RawButton.None;
  2311. buttonMap.DpadDown = RawButton.None;
  2312. buttonMap.DpadLeft = RawButton.None;
  2313. buttonMap.DpadRight = RawButton.None;
  2314. buttonMap.Up = RawButton.None;
  2315. buttonMap.Down = RawButton.None;
  2316. buttonMap.Left = RawButton.None;
  2317. buttonMap.Right = RawButton.None;
  2318. }
  2319. public override void ConfigureTouchMap()
  2320. {
  2321. touchMap.None = RawTouch.None;
  2322. touchMap.One = RawTouch.None;
  2323. touchMap.Two = RawTouch.None;
  2324. touchMap.Three = RawTouch.None;
  2325. touchMap.Four = RawTouch.None;
  2326. touchMap.PrimaryIndexTrigger = RawTouch.None;
  2327. touchMap.PrimaryThumbstick = RawTouch.None;
  2328. touchMap.PrimaryThumbRest = RawTouch.None;
  2329. touchMap.PrimaryTouchpad = RawTouch.None;
  2330. touchMap.SecondaryIndexTrigger = RawTouch.None;
  2331. touchMap.SecondaryThumbstick = RawTouch.None;
  2332. touchMap.SecondaryThumbRest = RawTouch.None;
  2333. touchMap.SecondaryTouchpad = RawTouch.None;
  2334. }
  2335. public override void ConfigureNearTouchMap()
  2336. {
  2337. nearTouchMap.None = RawNearTouch.None;
  2338. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  2339. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  2340. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  2341. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  2342. }
  2343. public override void ConfigureAxis1DMap()
  2344. {
  2345. axis1DMap.None = RawAxis1D.None;
  2346. axis1DMap.PrimaryIndexTrigger = RawAxis1D.None;
  2347. axis1DMap.PrimaryHandTrigger = RawAxis1D.None;
  2348. axis1DMap.SecondaryIndexTrigger = RawAxis1D.None;
  2349. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  2350. }
  2351. public override void ConfigureAxis2DMap()
  2352. {
  2353. axis2DMap.None = RawAxis2D.None;
  2354. axis2DMap.PrimaryThumbstick = RawAxis2D.None;
  2355. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  2356. axis2DMap.SecondaryThumbstick = RawAxis2D.None;
  2357. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  2358. }
  2359. public override bool WasRecentered()
  2360. {
  2361. return (currentState.LRecenterCount != previousState.LRecenterCount);
  2362. }
  2363. public override byte GetRecenterCount()
  2364. {
  2365. return currentState.LRecenterCount;
  2366. }
  2367. public override byte GetBatteryPercentRemaining()
  2368. {
  2369. return currentState.LBatteryPercentRemaining;
  2370. }
  2371. }
  2372. private class OVRControllerRHand : OVRControllerBase
  2373. {
  2374. public OVRControllerRHand()
  2375. {
  2376. controllerType = Controller.RHand;
  2377. }
  2378. public override void ConfigureButtonMap()
  2379. {
  2380. buttonMap.None = RawButton.None;
  2381. buttonMap.One = RawButton.A;
  2382. buttonMap.Two = RawButton.None;
  2383. buttonMap.Three = RawButton.None;
  2384. buttonMap.Four = RawButton.None;
  2385. buttonMap.Start = RawButton.None;
  2386. buttonMap.Back = RawButton.None;
  2387. buttonMap.PrimaryShoulder = RawButton.None;
  2388. buttonMap.PrimaryIndexTrigger = RawButton.None;
  2389. buttonMap.PrimaryHandTrigger = RawButton.None;
  2390. buttonMap.PrimaryThumbstick = RawButton.None;
  2391. buttonMap.PrimaryThumbstickUp = RawButton.None;
  2392. buttonMap.PrimaryThumbstickDown = RawButton.None;
  2393. buttonMap.PrimaryThumbstickLeft = RawButton.None;
  2394. buttonMap.PrimaryThumbstickRight = RawButton.None;
  2395. buttonMap.PrimaryTouchpad = RawButton.None;
  2396. buttonMap.SecondaryShoulder = RawButton.None;
  2397. buttonMap.SecondaryIndexTrigger = RawButton.None;
  2398. buttonMap.SecondaryHandTrigger = RawButton.None;
  2399. buttonMap.SecondaryThumbstick = RawButton.None;
  2400. buttonMap.SecondaryThumbstickUp = RawButton.None;
  2401. buttonMap.SecondaryThumbstickDown = RawButton.None;
  2402. buttonMap.SecondaryThumbstickLeft = RawButton.None;
  2403. buttonMap.SecondaryThumbstickRight = RawButton.None;
  2404. buttonMap.SecondaryTouchpad = RawButton.None;
  2405. buttonMap.DpadUp = RawButton.None;
  2406. buttonMap.DpadDown = RawButton.None;
  2407. buttonMap.DpadLeft = RawButton.None;
  2408. buttonMap.DpadRight = RawButton.None;
  2409. buttonMap.Up = RawButton.None;
  2410. buttonMap.Down = RawButton.None;
  2411. buttonMap.Left = RawButton.None;
  2412. buttonMap.Right = RawButton.None;
  2413. }
  2414. public override void ConfigureTouchMap()
  2415. {
  2416. touchMap.None = RawTouch.None;
  2417. touchMap.One = RawTouch.None;
  2418. touchMap.Two = RawTouch.None;
  2419. touchMap.Three = RawTouch.None;
  2420. touchMap.Four = RawTouch.None;
  2421. touchMap.PrimaryIndexTrigger = RawTouch.None;
  2422. touchMap.PrimaryThumbstick = RawTouch.None;
  2423. touchMap.PrimaryThumbRest = RawTouch.None;
  2424. touchMap.PrimaryTouchpad = RawTouch.None;
  2425. touchMap.SecondaryIndexTrigger = RawTouch.None;
  2426. touchMap.SecondaryThumbstick = RawTouch.None;
  2427. touchMap.SecondaryThumbRest = RawTouch.None;
  2428. touchMap.SecondaryTouchpad = RawTouch.None;
  2429. }
  2430. public override void ConfigureNearTouchMap()
  2431. {
  2432. nearTouchMap.None = RawNearTouch.None;
  2433. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  2434. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  2435. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  2436. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  2437. }
  2438. public override void ConfigureAxis1DMap()
  2439. {
  2440. axis1DMap.None = RawAxis1D.None;
  2441. axis1DMap.PrimaryIndexTrigger = RawAxis1D.None;
  2442. axis1DMap.PrimaryHandTrigger = RawAxis1D.None;
  2443. axis1DMap.SecondaryIndexTrigger = RawAxis1D.None;
  2444. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  2445. }
  2446. public override void ConfigureAxis2DMap()
  2447. {
  2448. axis2DMap.None = RawAxis2D.None;
  2449. axis2DMap.PrimaryThumbstick = RawAxis2D.None;
  2450. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  2451. axis2DMap.SecondaryThumbstick = RawAxis2D.None;
  2452. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  2453. }
  2454. public override bool WasRecentered()
  2455. {
  2456. return (currentState.RRecenterCount != previousState.RRecenterCount);
  2457. }
  2458. public override byte GetRecenterCount()
  2459. {
  2460. return currentState.RRecenterCount;
  2461. }
  2462. public override byte GetBatteryPercentRemaining()
  2463. {
  2464. return currentState.RBatteryPercentRemaining;
  2465. }
  2466. }
  2467. private class OVRControllerRemote : OVRControllerBase
  2468. {
  2469. public OVRControllerRemote()
  2470. {
  2471. controllerType = Controller.Remote;
  2472. }
  2473. public override void ConfigureButtonMap()
  2474. {
  2475. buttonMap.None = RawButton.None;
  2476. buttonMap.One = RawButton.Start;
  2477. buttonMap.Two = RawButton.Back;
  2478. buttonMap.Three = RawButton.None;
  2479. buttonMap.Four = RawButton.None;
  2480. buttonMap.Start = RawButton.Start;
  2481. buttonMap.Back = RawButton.Back;
  2482. buttonMap.PrimaryShoulder = RawButton.None;
  2483. buttonMap.PrimaryIndexTrigger = RawButton.None;
  2484. buttonMap.PrimaryHandTrigger = RawButton.None;
  2485. buttonMap.PrimaryThumbstick = RawButton.None;
  2486. buttonMap.PrimaryThumbstickUp = RawButton.None;
  2487. buttonMap.PrimaryThumbstickDown = RawButton.None;
  2488. buttonMap.PrimaryThumbstickLeft = RawButton.None;
  2489. buttonMap.PrimaryThumbstickRight = RawButton.None;
  2490. buttonMap.PrimaryTouchpad = RawButton.None;
  2491. buttonMap.SecondaryShoulder = RawButton.None;
  2492. buttonMap.SecondaryIndexTrigger = RawButton.None;
  2493. buttonMap.SecondaryHandTrigger = RawButton.None;
  2494. buttonMap.SecondaryThumbstick = RawButton.None;
  2495. buttonMap.SecondaryThumbstickUp = RawButton.None;
  2496. buttonMap.SecondaryThumbstickDown = RawButton.None;
  2497. buttonMap.SecondaryThumbstickLeft = RawButton.None;
  2498. buttonMap.SecondaryThumbstickRight = RawButton.None;
  2499. buttonMap.SecondaryTouchpad = RawButton.None;
  2500. buttonMap.DpadUp = RawButton.DpadUp;
  2501. buttonMap.DpadDown = RawButton.DpadDown;
  2502. buttonMap.DpadLeft = RawButton.DpadLeft;
  2503. buttonMap.DpadRight = RawButton.DpadRight;
  2504. buttonMap.Up = RawButton.DpadUp;
  2505. buttonMap.Down = RawButton.DpadDown;
  2506. buttonMap.Left = RawButton.DpadLeft;
  2507. buttonMap.Right = RawButton.DpadRight;
  2508. }
  2509. public override void ConfigureTouchMap()
  2510. {
  2511. touchMap.None = RawTouch.None;
  2512. touchMap.One = RawTouch.None;
  2513. touchMap.Two = RawTouch.None;
  2514. touchMap.Three = RawTouch.None;
  2515. touchMap.Four = RawTouch.None;
  2516. touchMap.PrimaryIndexTrigger = RawTouch.None;
  2517. touchMap.PrimaryThumbstick = RawTouch.None;
  2518. touchMap.PrimaryThumbRest = RawTouch.None;
  2519. touchMap.PrimaryTouchpad = RawTouch.None;
  2520. touchMap.SecondaryIndexTrigger = RawTouch.None;
  2521. touchMap.SecondaryThumbstick = RawTouch.None;
  2522. touchMap.SecondaryThumbRest = RawTouch.None;
  2523. touchMap.SecondaryTouchpad = RawTouch.None;
  2524. }
  2525. public override void ConfigureNearTouchMap()
  2526. {
  2527. nearTouchMap.None = RawNearTouch.None;
  2528. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  2529. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  2530. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  2531. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  2532. }
  2533. public override void ConfigureAxis1DMap()
  2534. {
  2535. axis1DMap.None = RawAxis1D.None;
  2536. axis1DMap.PrimaryIndexTrigger = RawAxis1D.None;
  2537. axis1DMap.PrimaryHandTrigger = RawAxis1D.None;
  2538. axis1DMap.SecondaryIndexTrigger = RawAxis1D.None;
  2539. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  2540. }
  2541. public override void ConfigureAxis2DMap()
  2542. {
  2543. axis2DMap.None = RawAxis2D.None;
  2544. axis2DMap.PrimaryThumbstick = RawAxis2D.None;
  2545. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  2546. axis2DMap.SecondaryThumbstick = RawAxis2D.None;
  2547. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  2548. }
  2549. }
  2550. private class OVRControllerGamepadPC : OVRControllerBase
  2551. {
  2552. public OVRControllerGamepadPC()
  2553. {
  2554. controllerType = Controller.Gamepad;
  2555. }
  2556. public override void ConfigureButtonMap()
  2557. {
  2558. buttonMap.None = RawButton.None;
  2559. buttonMap.One = RawButton.A;
  2560. buttonMap.Two = RawButton.B;
  2561. buttonMap.Three = RawButton.X;
  2562. buttonMap.Four = RawButton.Y;
  2563. buttonMap.Start = RawButton.Start;
  2564. buttonMap.Back = RawButton.Back;
  2565. buttonMap.PrimaryShoulder = RawButton.LShoulder;
  2566. buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger;
  2567. buttonMap.PrimaryHandTrigger = RawButton.None;
  2568. buttonMap.PrimaryThumbstick = RawButton.LThumbstick;
  2569. buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp;
  2570. buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown;
  2571. buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft;
  2572. buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight;
  2573. buttonMap.PrimaryTouchpad = RawButton.None;
  2574. buttonMap.SecondaryShoulder = RawButton.RShoulder;
  2575. buttonMap.SecondaryIndexTrigger = RawButton.RIndexTrigger;
  2576. buttonMap.SecondaryHandTrigger = RawButton.None;
  2577. buttonMap.SecondaryThumbstick = RawButton.RThumbstick;
  2578. buttonMap.SecondaryThumbstickUp = RawButton.RThumbstickUp;
  2579. buttonMap.SecondaryThumbstickDown = RawButton.RThumbstickDown;
  2580. buttonMap.SecondaryThumbstickLeft = RawButton.RThumbstickLeft;
  2581. buttonMap.SecondaryThumbstickRight = RawButton.RThumbstickRight;
  2582. buttonMap.SecondaryTouchpad = RawButton.None;
  2583. buttonMap.DpadUp = RawButton.DpadUp;
  2584. buttonMap.DpadDown = RawButton.DpadDown;
  2585. buttonMap.DpadLeft = RawButton.DpadLeft;
  2586. buttonMap.DpadRight = RawButton.DpadRight;
  2587. buttonMap.Up = RawButton.LThumbstickUp;
  2588. buttonMap.Down = RawButton.LThumbstickDown;
  2589. buttonMap.Left = RawButton.LThumbstickLeft;
  2590. buttonMap.Right = RawButton.LThumbstickRight;
  2591. }
  2592. public override void ConfigureTouchMap()
  2593. {
  2594. touchMap.None = RawTouch.None;
  2595. touchMap.One = RawTouch.None;
  2596. touchMap.Two = RawTouch.None;
  2597. touchMap.Three = RawTouch.None;
  2598. touchMap.Four = RawTouch.None;
  2599. touchMap.PrimaryIndexTrigger = RawTouch.None;
  2600. touchMap.PrimaryThumbstick = RawTouch.None;
  2601. touchMap.PrimaryThumbRest = RawTouch.None;
  2602. touchMap.PrimaryTouchpad = RawTouch.None;
  2603. touchMap.SecondaryIndexTrigger = RawTouch.None;
  2604. touchMap.SecondaryThumbstick = RawTouch.None;
  2605. touchMap.SecondaryThumbRest = RawTouch.None;
  2606. touchMap.SecondaryTouchpad = RawTouch.None;
  2607. }
  2608. public override void ConfigureNearTouchMap()
  2609. {
  2610. nearTouchMap.None = RawNearTouch.None;
  2611. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  2612. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  2613. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  2614. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  2615. }
  2616. public override void ConfigureAxis1DMap()
  2617. {
  2618. axis1DMap.None = RawAxis1D.None;
  2619. axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger;
  2620. axis1DMap.PrimaryHandTrigger = RawAxis1D.None;
  2621. axis1DMap.SecondaryIndexTrigger = RawAxis1D.RIndexTrigger;
  2622. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  2623. }
  2624. public override void ConfigureAxis2DMap()
  2625. {
  2626. axis2DMap.None = RawAxis2D.None;
  2627. axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick;
  2628. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  2629. axis2DMap.SecondaryThumbstick = RawAxis2D.RThumbstick;
  2630. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  2631. }
  2632. }
  2633. private class OVRControllerGamepadMac : OVRControllerBase
  2634. {
  2635. /// <summary> An axis on the gamepad. </summary>
  2636. private enum AxisGPC
  2637. {
  2638. None = -1,
  2639. LeftXAxis = 0,
  2640. LeftYAxis,
  2641. RightXAxis,
  2642. RightYAxis,
  2643. LeftTrigger,
  2644. RightTrigger,
  2645. DPad_X_Axis,
  2646. DPad_Y_Axis,
  2647. Max,
  2648. };
  2649. /// <summary> A button on the gamepad. </summary>
  2650. public enum ButtonGPC
  2651. {
  2652. None = -1,
  2653. A = 0,
  2654. B,
  2655. X,
  2656. Y,
  2657. Up,
  2658. Down,
  2659. Left,
  2660. Right,
  2661. Start,
  2662. Back,
  2663. LStick,
  2664. RStick,
  2665. LeftShoulder,
  2666. RightShoulder,
  2667. Max
  2668. };
  2669. private bool initialized = false;
  2670. public OVRControllerGamepadMac()
  2671. {
  2672. controllerType = Controller.Gamepad;
  2673. initialized = OVR_GamepadController_Initialize();
  2674. }
  2675. ~OVRControllerGamepadMac()
  2676. {
  2677. if (!initialized)
  2678. return;
  2679. OVR_GamepadController_Destroy();
  2680. }
  2681. public override Controller Update()
  2682. {
  2683. if (!initialized)
  2684. {
  2685. return Controller.None;
  2686. }
  2687. OVRPlugin.ControllerState4 state = new OVRPlugin.ControllerState4();
  2688. bool result = OVR_GamepadController_Update();
  2689. if (result)
  2690. state.ConnectedControllers = (uint)Controller.Gamepad;
  2691. if (OVR_GamepadController_GetButton((int)ButtonGPC.A))
  2692. state.Buttons |= (uint)RawButton.A;
  2693. if (OVR_GamepadController_GetButton((int)ButtonGPC.B))
  2694. state.Buttons |= (uint)RawButton.B;
  2695. if (OVR_GamepadController_GetButton((int)ButtonGPC.X))
  2696. state.Buttons |= (uint)RawButton.X;
  2697. if (OVR_GamepadController_GetButton((int)ButtonGPC.Y))
  2698. state.Buttons |= (uint)RawButton.Y;
  2699. if (OVR_GamepadController_GetButton((int)ButtonGPC.Up))
  2700. state.Buttons |= (uint)RawButton.DpadUp;
  2701. if (OVR_GamepadController_GetButton((int)ButtonGPC.Down))
  2702. state.Buttons |= (uint)RawButton.DpadDown;
  2703. if (OVR_GamepadController_GetButton((int)ButtonGPC.Left))
  2704. state.Buttons |= (uint)RawButton.DpadLeft;
  2705. if (OVR_GamepadController_GetButton((int)ButtonGPC.Right))
  2706. state.Buttons |= (uint)RawButton.DpadRight;
  2707. if (OVR_GamepadController_GetButton((int)ButtonGPC.Start))
  2708. state.Buttons |= (uint)RawButton.Start;
  2709. if (OVR_GamepadController_GetButton((int)ButtonGPC.Back))
  2710. state.Buttons |= (uint)RawButton.Back;
  2711. if (OVR_GamepadController_GetButton((int)ButtonGPC.LStick))
  2712. state.Buttons |= (uint)RawButton.LThumbstick;
  2713. if (OVR_GamepadController_GetButton((int)ButtonGPC.RStick))
  2714. state.Buttons |= (uint)RawButton.RThumbstick;
  2715. if (OVR_GamepadController_GetButton((int)ButtonGPC.LeftShoulder))
  2716. state.Buttons |= (uint)RawButton.LShoulder;
  2717. if (OVR_GamepadController_GetButton((int)ButtonGPC.RightShoulder))
  2718. state.Buttons |= (uint)RawButton.RShoulder;
  2719. state.LThumbstick.x = OVR_GamepadController_GetAxis((int)AxisGPC.LeftXAxis);
  2720. state.LThumbstick.y = OVR_GamepadController_GetAxis((int)AxisGPC.LeftYAxis);
  2721. state.RThumbstick.x = OVR_GamepadController_GetAxis((int)AxisGPC.RightXAxis);
  2722. state.RThumbstick.y = OVR_GamepadController_GetAxis((int)AxisGPC.RightYAxis);
  2723. state.LIndexTrigger = OVR_GamepadController_GetAxis((int)AxisGPC.LeftTrigger);
  2724. state.RIndexTrigger = OVR_GamepadController_GetAxis((int)AxisGPC.RightTrigger);
  2725. if (state.LIndexTrigger >= AXIS_AS_BUTTON_THRESHOLD)
  2726. state.Buttons |= (uint)RawButton.LIndexTrigger;
  2727. if (state.LHandTrigger >= AXIS_AS_BUTTON_THRESHOLD)
  2728. state.Buttons |= (uint)RawButton.LHandTrigger;
  2729. if (state.LThumbstick.y >= AXIS_AS_BUTTON_THRESHOLD)
  2730. state.Buttons |= (uint)RawButton.LThumbstickUp;
  2731. if (state.LThumbstick.y <= -AXIS_AS_BUTTON_THRESHOLD)
  2732. state.Buttons |= (uint)RawButton.LThumbstickDown;
  2733. if (state.LThumbstick.x <= -AXIS_AS_BUTTON_THRESHOLD)
  2734. state.Buttons |= (uint)RawButton.LThumbstickLeft;
  2735. if (state.LThumbstick.x >= AXIS_AS_BUTTON_THRESHOLD)
  2736. state.Buttons |= (uint)RawButton.LThumbstickRight;
  2737. if (state.RIndexTrigger >= AXIS_AS_BUTTON_THRESHOLD)
  2738. state.Buttons |= (uint)RawButton.RIndexTrigger;
  2739. if (state.RHandTrigger >= AXIS_AS_BUTTON_THRESHOLD)
  2740. state.Buttons |= (uint)RawButton.RHandTrigger;
  2741. if (state.RThumbstick.y >= AXIS_AS_BUTTON_THRESHOLD)
  2742. state.Buttons |= (uint)RawButton.RThumbstickUp;
  2743. if (state.RThumbstick.y <= -AXIS_AS_BUTTON_THRESHOLD)
  2744. state.Buttons |= (uint)RawButton.RThumbstickDown;
  2745. if (state.RThumbstick.x <= -AXIS_AS_BUTTON_THRESHOLD)
  2746. state.Buttons |= (uint)RawButton.RThumbstickLeft;
  2747. if (state.RThumbstick.x >= AXIS_AS_BUTTON_THRESHOLD)
  2748. state.Buttons |= (uint)RawButton.RThumbstickRight;
  2749. previousState = currentState;
  2750. currentState = state;
  2751. return ((Controller)currentState.ConnectedControllers & controllerType);
  2752. }
  2753. public override void ConfigureButtonMap()
  2754. {
  2755. buttonMap.None = RawButton.None;
  2756. buttonMap.One = RawButton.A;
  2757. buttonMap.Two = RawButton.B;
  2758. buttonMap.Three = RawButton.X;
  2759. buttonMap.Four = RawButton.Y;
  2760. buttonMap.Start = RawButton.Start;
  2761. buttonMap.Back = RawButton.Back;
  2762. buttonMap.PrimaryShoulder = RawButton.LShoulder;
  2763. buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger;
  2764. buttonMap.PrimaryHandTrigger = RawButton.None;
  2765. buttonMap.PrimaryThumbstick = RawButton.LThumbstick;
  2766. buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp;
  2767. buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown;
  2768. buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft;
  2769. buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight;
  2770. buttonMap.PrimaryTouchpad = RawButton.None;
  2771. buttonMap.SecondaryShoulder = RawButton.RShoulder;
  2772. buttonMap.SecondaryIndexTrigger = RawButton.RIndexTrigger;
  2773. buttonMap.SecondaryHandTrigger = RawButton.None;
  2774. buttonMap.SecondaryThumbstick = RawButton.RThumbstick;
  2775. buttonMap.SecondaryThumbstickUp = RawButton.RThumbstickUp;
  2776. buttonMap.SecondaryThumbstickDown = RawButton.RThumbstickDown;
  2777. buttonMap.SecondaryThumbstickLeft = RawButton.RThumbstickLeft;
  2778. buttonMap.SecondaryThumbstickRight = RawButton.RThumbstickRight;
  2779. buttonMap.SecondaryTouchpad = RawButton.None;
  2780. buttonMap.DpadUp = RawButton.DpadUp;
  2781. buttonMap.DpadDown = RawButton.DpadDown;
  2782. buttonMap.DpadLeft = RawButton.DpadLeft;
  2783. buttonMap.DpadRight = RawButton.DpadRight;
  2784. buttonMap.Up = RawButton.LThumbstickUp;
  2785. buttonMap.Down = RawButton.LThumbstickDown;
  2786. buttonMap.Left = RawButton.LThumbstickLeft;
  2787. buttonMap.Right = RawButton.LThumbstickRight;
  2788. }
  2789. public override void ConfigureTouchMap()
  2790. {
  2791. touchMap.None = RawTouch.None;
  2792. touchMap.One = RawTouch.None;
  2793. touchMap.Two = RawTouch.None;
  2794. touchMap.Three = RawTouch.None;
  2795. touchMap.Four = RawTouch.None;
  2796. touchMap.PrimaryIndexTrigger = RawTouch.None;
  2797. touchMap.PrimaryThumbstick = RawTouch.None;
  2798. touchMap.PrimaryThumbRest = RawTouch.None;
  2799. touchMap.PrimaryTouchpad = RawTouch.None;
  2800. touchMap.SecondaryIndexTrigger = RawTouch.None;
  2801. touchMap.SecondaryThumbstick = RawTouch.None;
  2802. touchMap.SecondaryThumbRest = RawTouch.None;
  2803. touchMap.SecondaryTouchpad = RawTouch.None;
  2804. }
  2805. public override void ConfigureNearTouchMap()
  2806. {
  2807. nearTouchMap.None = RawNearTouch.None;
  2808. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  2809. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  2810. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  2811. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  2812. }
  2813. public override void ConfigureAxis1DMap()
  2814. {
  2815. axis1DMap.None = RawAxis1D.None;
  2816. axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger;
  2817. axis1DMap.PrimaryHandTrigger = RawAxis1D.None;
  2818. axis1DMap.SecondaryIndexTrigger = RawAxis1D.RIndexTrigger;
  2819. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  2820. }
  2821. public override void ConfigureAxis2DMap()
  2822. {
  2823. axis2DMap.None = RawAxis2D.None;
  2824. axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick;
  2825. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  2826. axis2DMap.SecondaryThumbstick = RawAxis2D.RThumbstick;
  2827. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  2828. }
  2829. public override void SetControllerVibration(float frequency, float amplitude)
  2830. {
  2831. int gpcNode = 0;
  2832. float gpcFrequency = frequency * 200.0f; //Map frequency from 0-1 CAPI range to 0-200 GPC range
  2833. float gpcStrength = amplitude;
  2834. OVR_GamepadController_SetVibration(gpcNode, gpcStrength, gpcFrequency);
  2835. }
  2836. private const string DllName = "OVRGamepad";
  2837. [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
  2838. private static extern bool OVR_GamepadController_Initialize();
  2839. [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
  2840. private static extern bool OVR_GamepadController_Destroy();
  2841. [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
  2842. private static extern bool OVR_GamepadController_Update();
  2843. [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
  2844. private static extern float OVR_GamepadController_GetAxis(int axis);
  2845. [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
  2846. private static extern bool OVR_GamepadController_GetButton(int button);
  2847. [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
  2848. private static extern bool OVR_GamepadController_SetVibration(int node, float strength, float frequency);
  2849. }
  2850. private class OVRControllerGamepadAndroid : OVRControllerBase
  2851. {
  2852. public OVRControllerGamepadAndroid()
  2853. {
  2854. controllerType = Controller.Gamepad;
  2855. }
  2856. public override void ConfigureButtonMap()
  2857. {
  2858. buttonMap.None = RawButton.None;
  2859. buttonMap.One = RawButton.A;
  2860. buttonMap.Two = RawButton.B;
  2861. buttonMap.Three = RawButton.X;
  2862. buttonMap.Four = RawButton.Y;
  2863. buttonMap.Start = RawButton.Start;
  2864. buttonMap.Back = RawButton.Back;
  2865. buttonMap.PrimaryShoulder = RawButton.LShoulder;
  2866. buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger;
  2867. buttonMap.PrimaryHandTrigger = RawButton.None;
  2868. buttonMap.PrimaryThumbstick = RawButton.LThumbstick;
  2869. buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp;
  2870. buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown;
  2871. buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft;
  2872. buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight;
  2873. buttonMap.PrimaryTouchpad = RawButton.None;
  2874. buttonMap.SecondaryShoulder = RawButton.RShoulder;
  2875. buttonMap.SecondaryIndexTrigger = RawButton.RIndexTrigger;
  2876. buttonMap.SecondaryHandTrigger = RawButton.None;
  2877. buttonMap.SecondaryThumbstick = RawButton.RThumbstick;
  2878. buttonMap.SecondaryThumbstickUp = RawButton.RThumbstickUp;
  2879. buttonMap.SecondaryThumbstickDown = RawButton.RThumbstickDown;
  2880. buttonMap.SecondaryThumbstickLeft = RawButton.RThumbstickLeft;
  2881. buttonMap.SecondaryThumbstickRight = RawButton.RThumbstickRight;
  2882. buttonMap.SecondaryTouchpad = RawButton.None;
  2883. buttonMap.DpadUp = RawButton.DpadUp;
  2884. buttonMap.DpadDown = RawButton.DpadDown;
  2885. buttonMap.DpadLeft = RawButton.DpadLeft;
  2886. buttonMap.DpadRight = RawButton.DpadRight;
  2887. buttonMap.Up = RawButton.LThumbstickUp;
  2888. buttonMap.Down = RawButton.LThumbstickDown;
  2889. buttonMap.Left = RawButton.LThumbstickLeft;
  2890. buttonMap.Right = RawButton.LThumbstickRight;
  2891. }
  2892. public override void ConfigureTouchMap()
  2893. {
  2894. touchMap.None = RawTouch.None;
  2895. touchMap.One = RawTouch.None;
  2896. touchMap.Two = RawTouch.None;
  2897. touchMap.Three = RawTouch.None;
  2898. touchMap.Four = RawTouch.None;
  2899. touchMap.PrimaryIndexTrigger = RawTouch.None;
  2900. touchMap.PrimaryThumbstick = RawTouch.None;
  2901. touchMap.PrimaryThumbRest = RawTouch.None;
  2902. touchMap.PrimaryTouchpad = RawTouch.None;
  2903. touchMap.SecondaryIndexTrigger = RawTouch.None;
  2904. touchMap.SecondaryThumbstick = RawTouch.None;
  2905. touchMap.SecondaryThumbRest = RawTouch.None;
  2906. touchMap.SecondaryTouchpad = RawTouch.None;
  2907. }
  2908. public override void ConfigureNearTouchMap()
  2909. {
  2910. nearTouchMap.None = RawNearTouch.None;
  2911. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  2912. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  2913. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  2914. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  2915. }
  2916. public override void ConfigureAxis1DMap()
  2917. {
  2918. axis1DMap.None = RawAxis1D.None;
  2919. axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger;
  2920. axis1DMap.PrimaryHandTrigger = RawAxis1D.None;
  2921. axis1DMap.SecondaryIndexTrigger = RawAxis1D.RIndexTrigger;
  2922. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  2923. }
  2924. public override void ConfigureAxis2DMap()
  2925. {
  2926. axis2DMap.None = RawAxis2D.None;
  2927. axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick;
  2928. axis2DMap.PrimaryTouchpad = RawAxis2D.None;
  2929. axis2DMap.SecondaryThumbstick = RawAxis2D.RThumbstick;
  2930. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  2931. }
  2932. }
  2933. private class OVRControllerTouchpad : OVRControllerBase
  2934. {
  2935. private OVRPlugin.Vector2f moveAmount;
  2936. private float maxTapMagnitude = 0.1f;
  2937. private float minMoveMagnitude = 0.15f;
  2938. public OVRControllerTouchpad()
  2939. {
  2940. controllerType = Controller.Touchpad;
  2941. }
  2942. public override Controller Update()
  2943. {
  2944. Controller res = base.Update();
  2945. if (GetDown(RawTouch.LTouchpad, OVRInput.Controller.Touchpad))
  2946. {
  2947. moveAmount = currentState.LTouchpad;
  2948. }
  2949. if (GetUp(RawTouch.LTouchpad, OVRInput.Controller.Touchpad))
  2950. {
  2951. moveAmount.x = previousState.LTouchpad.x - moveAmount.x;
  2952. moveAmount.y = previousState.LTouchpad.y - moveAmount.y;
  2953. Vector2 move = new Vector2(moveAmount.x, moveAmount.y);
  2954. float moveMag = move.magnitude;
  2955. if (moveMag < maxTapMagnitude)
  2956. {
  2957. // Emit Touchpad Tap
  2958. currentState.Buttons |= (uint)RawButton.Start;
  2959. currentState.Buttons |= (uint)RawButton.LTouchpad;
  2960. }
  2961. else if (moveMag >= minMoveMagnitude)
  2962. {
  2963. move.Normalize();
  2964. // Left/Right
  2965. if (Mathf.Abs(move.x) > Mathf.Abs(move.y))
  2966. {
  2967. if (move.x < 0.0f)
  2968. {
  2969. currentState.Buttons |= (uint)RawButton.DpadLeft;
  2970. }
  2971. else
  2972. {
  2973. currentState.Buttons |= (uint)RawButton.DpadRight;
  2974. }
  2975. }
  2976. // Up/Down
  2977. else
  2978. {
  2979. if (move.y < 0.0f)
  2980. {
  2981. currentState.Buttons |= (uint)RawButton.DpadDown;
  2982. }
  2983. else
  2984. {
  2985. currentState.Buttons |= (uint)RawButton.DpadUp;
  2986. }
  2987. }
  2988. }
  2989. }
  2990. return res;
  2991. }
  2992. public override void ConfigureButtonMap()
  2993. {
  2994. buttonMap.None = RawButton.None;
  2995. buttonMap.One = RawButton.LTouchpad;
  2996. buttonMap.Two = RawButton.Back;
  2997. buttonMap.Three = RawButton.None;
  2998. buttonMap.Four = RawButton.None;
  2999. buttonMap.Start = RawButton.Start;
  3000. buttonMap.Back = RawButton.Back;
  3001. buttonMap.PrimaryShoulder = RawButton.None;
  3002. buttonMap.PrimaryIndexTrigger = RawButton.None;
  3003. buttonMap.PrimaryHandTrigger = RawButton.None;
  3004. buttonMap.PrimaryThumbstick = RawButton.None;
  3005. buttonMap.PrimaryThumbstickUp = RawButton.None;
  3006. buttonMap.PrimaryThumbstickDown = RawButton.None;
  3007. buttonMap.PrimaryThumbstickLeft = RawButton.None;
  3008. buttonMap.PrimaryThumbstickRight = RawButton.None;
  3009. buttonMap.PrimaryTouchpad = RawButton.LTouchpad;
  3010. buttonMap.SecondaryShoulder = RawButton.None;
  3011. buttonMap.SecondaryIndexTrigger = RawButton.None;
  3012. buttonMap.SecondaryHandTrigger = RawButton.None;
  3013. buttonMap.SecondaryThumbstick = RawButton.None;
  3014. buttonMap.SecondaryThumbstickUp = RawButton.None;
  3015. buttonMap.SecondaryThumbstickDown = RawButton.None;
  3016. buttonMap.SecondaryThumbstickLeft = RawButton.None;
  3017. buttonMap.SecondaryThumbstickRight = RawButton.None;
  3018. buttonMap.SecondaryTouchpad = RawButton.None;
  3019. buttonMap.DpadUp = RawButton.DpadUp;
  3020. buttonMap.DpadDown = RawButton.DpadDown;
  3021. buttonMap.DpadLeft = RawButton.DpadLeft;
  3022. buttonMap.DpadRight = RawButton.DpadRight;
  3023. buttonMap.Up = RawButton.DpadUp;
  3024. buttonMap.Down = RawButton.DpadDown;
  3025. buttonMap.Left = RawButton.DpadLeft;
  3026. buttonMap.Right = RawButton.DpadRight;
  3027. }
  3028. public override void ConfigureTouchMap()
  3029. {
  3030. touchMap.None = RawTouch.None;
  3031. touchMap.One = RawTouch.LTouchpad;
  3032. touchMap.Two = RawTouch.None;
  3033. touchMap.Three = RawTouch.None;
  3034. touchMap.Four = RawTouch.None;
  3035. touchMap.PrimaryIndexTrigger = RawTouch.None;
  3036. touchMap.PrimaryThumbstick = RawTouch.None;
  3037. touchMap.PrimaryThumbRest = RawTouch.None;
  3038. touchMap.PrimaryTouchpad = RawTouch.LTouchpad;
  3039. touchMap.SecondaryIndexTrigger = RawTouch.None;
  3040. touchMap.SecondaryThumbstick = RawTouch.None;
  3041. touchMap.SecondaryThumbRest = RawTouch.None;
  3042. touchMap.SecondaryTouchpad = RawTouch.None;
  3043. }
  3044. public override void ConfigureNearTouchMap()
  3045. {
  3046. nearTouchMap.None = RawNearTouch.None;
  3047. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  3048. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  3049. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  3050. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  3051. }
  3052. public override void ConfigureAxis1DMap()
  3053. {
  3054. axis1DMap.None = RawAxis1D.None;
  3055. axis1DMap.PrimaryIndexTrigger = RawAxis1D.None;
  3056. axis1DMap.PrimaryHandTrigger = RawAxis1D.None;
  3057. axis1DMap.SecondaryIndexTrigger = RawAxis1D.None;
  3058. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  3059. }
  3060. public override void ConfigureAxis2DMap()
  3061. {
  3062. axis2DMap.None = RawAxis2D.None;
  3063. axis2DMap.PrimaryThumbstick = RawAxis2D.None;
  3064. axis2DMap.PrimaryTouchpad = RawAxis2D.LTouchpad;
  3065. axis2DMap.SecondaryThumbstick = RawAxis2D.None;
  3066. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  3067. }
  3068. }
  3069. private class OVRControllerLTrackedRemote : OVRControllerBase
  3070. {
  3071. private bool emitSwipe;
  3072. private OVRPlugin.Vector2f moveAmount;
  3073. private float minMoveMagnitude = 0.3f;
  3074. public OVRControllerLTrackedRemote()
  3075. {
  3076. controllerType = Controller.LTrackedRemote;
  3077. }
  3078. public override void ConfigureButtonMap()
  3079. {
  3080. buttonMap.None = RawButton.None;
  3081. buttonMap.One = RawButton.LTouchpad;
  3082. buttonMap.Two = RawButton.Back;
  3083. buttonMap.Three = RawButton.None;
  3084. buttonMap.Four = RawButton.None;
  3085. buttonMap.Start = RawButton.Start;
  3086. buttonMap.Back = RawButton.Back;
  3087. buttonMap.PrimaryShoulder = RawButton.None;
  3088. buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger;
  3089. buttonMap.PrimaryHandTrigger = RawButton.LHandTrigger;
  3090. buttonMap.PrimaryThumbstick = RawButton.None;
  3091. buttonMap.PrimaryThumbstickUp = RawButton.None;
  3092. buttonMap.PrimaryThumbstickDown = RawButton.None;
  3093. buttonMap.PrimaryThumbstickLeft = RawButton.None;
  3094. buttonMap.PrimaryThumbstickRight = RawButton.None;
  3095. buttonMap.PrimaryTouchpad = RawButton.LTouchpad;
  3096. buttonMap.SecondaryShoulder = RawButton.None;
  3097. buttonMap.SecondaryIndexTrigger = RawButton.None;
  3098. buttonMap.SecondaryHandTrigger = RawButton.None;
  3099. buttonMap.SecondaryThumbstick = RawButton.None;
  3100. buttonMap.SecondaryThumbstickUp = RawButton.None;
  3101. buttonMap.SecondaryThumbstickDown = RawButton.None;
  3102. buttonMap.SecondaryThumbstickLeft = RawButton.None;
  3103. buttonMap.SecondaryThumbstickRight = RawButton.None;
  3104. buttonMap.SecondaryTouchpad = RawButton.None;
  3105. buttonMap.DpadUp = RawButton.DpadUp;
  3106. buttonMap.DpadDown = RawButton.DpadDown;
  3107. buttonMap.DpadLeft = RawButton.DpadLeft;
  3108. buttonMap.DpadRight = RawButton.DpadRight;
  3109. buttonMap.Up = RawButton.DpadUp;
  3110. buttonMap.Down = RawButton.DpadDown;
  3111. buttonMap.Left = RawButton.DpadLeft;
  3112. buttonMap.Right = RawButton.DpadRight;
  3113. }
  3114. public override void ConfigureTouchMap()
  3115. {
  3116. touchMap.None = RawTouch.None;
  3117. touchMap.One = RawTouch.LTouchpad;
  3118. touchMap.Two = RawTouch.None;
  3119. touchMap.Three = RawTouch.None;
  3120. touchMap.Four = RawTouch.None;
  3121. touchMap.PrimaryIndexTrigger = RawTouch.LIndexTrigger;
  3122. touchMap.PrimaryThumbstick = RawTouch.None;
  3123. touchMap.PrimaryThumbRest = RawTouch.None;
  3124. touchMap.PrimaryTouchpad = RawTouch.LTouchpad;
  3125. touchMap.SecondaryIndexTrigger = RawTouch.None;
  3126. touchMap.SecondaryThumbstick = RawTouch.None;
  3127. touchMap.SecondaryThumbRest = RawTouch.None;
  3128. touchMap.SecondaryTouchpad = RawTouch.None;
  3129. }
  3130. public override void ConfigureNearTouchMap()
  3131. {
  3132. nearTouchMap.None = RawNearTouch.None;
  3133. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  3134. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  3135. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  3136. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  3137. }
  3138. public override void ConfigureAxis1DMap()
  3139. {
  3140. axis1DMap.None = RawAxis1D.None;
  3141. axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger;
  3142. axis1DMap.PrimaryHandTrigger = RawAxis1D.LHandTrigger;
  3143. axis1DMap.SecondaryIndexTrigger = RawAxis1D.None;
  3144. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  3145. }
  3146. public override void ConfigureAxis2DMap()
  3147. {
  3148. axis2DMap.None = RawAxis2D.None;
  3149. axis2DMap.PrimaryThumbstick = RawAxis2D.None;
  3150. axis2DMap.PrimaryTouchpad = RawAxis2D.LTouchpad;
  3151. axis2DMap.SecondaryThumbstick = RawAxis2D.None;
  3152. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  3153. }
  3154. public override Controller Update()
  3155. {
  3156. Controller res = base.Update();
  3157. if (GetDown(RawTouch.LTouchpad, OVRInput.Controller.LTrackedRemote))
  3158. {
  3159. emitSwipe = true;
  3160. moveAmount = currentState.LTouchpad;
  3161. }
  3162. if (GetDown(RawButton.LTouchpad, OVRInput.Controller.LTrackedRemote))
  3163. {
  3164. emitSwipe = false;
  3165. }
  3166. if (GetUp(RawTouch.LTouchpad, OVRInput.Controller.LTrackedRemote) && emitSwipe)
  3167. {
  3168. emitSwipe = false;
  3169. moveAmount.x = previousState.LTouchpad.x - moveAmount.x;
  3170. moveAmount.y = previousState.LTouchpad.y - moveAmount.y;
  3171. Vector2 move = new Vector2(moveAmount.x, moveAmount.y);
  3172. if (move.magnitude >= minMoveMagnitude)
  3173. {
  3174. move.Normalize();
  3175. // Left/Right
  3176. if (Mathf.Abs(move.x) > Mathf.Abs(move.y))
  3177. {
  3178. if (move.x < 0.0f)
  3179. {
  3180. currentState.Buttons |= (uint)RawButton.DpadLeft;
  3181. }
  3182. else
  3183. {
  3184. currentState.Buttons |= (uint)RawButton.DpadRight;
  3185. }
  3186. }
  3187. // Up/Down
  3188. else
  3189. {
  3190. if (move.y < 0.0f)
  3191. {
  3192. currentState.Buttons |= (uint)RawButton.DpadDown;
  3193. }
  3194. else
  3195. {
  3196. currentState.Buttons |= (uint)RawButton.DpadUp;
  3197. }
  3198. }
  3199. }
  3200. }
  3201. return res;
  3202. }
  3203. public override bool WasRecentered()
  3204. {
  3205. return (currentState.LRecenterCount != previousState.LRecenterCount);
  3206. }
  3207. public override byte GetRecenterCount()
  3208. {
  3209. return currentState.LRecenterCount;
  3210. }
  3211. public override byte GetBatteryPercentRemaining()
  3212. {
  3213. return currentState.LBatteryPercentRemaining;
  3214. }
  3215. }
  3216. private class OVRControllerRTrackedRemote : OVRControllerBase
  3217. {
  3218. private bool emitSwipe;
  3219. private OVRPlugin.Vector2f moveAmount;
  3220. private float minMoveMagnitude = 0.3f;
  3221. public OVRControllerRTrackedRemote()
  3222. {
  3223. controllerType = Controller.RTrackedRemote;
  3224. }
  3225. public override void ConfigureButtonMap()
  3226. {
  3227. buttonMap.None = RawButton.None;
  3228. buttonMap.One = RawButton.RTouchpad;
  3229. buttonMap.Two = RawButton.Back;
  3230. buttonMap.Three = RawButton.None;
  3231. buttonMap.Four = RawButton.None;
  3232. buttonMap.Start = RawButton.Start;
  3233. buttonMap.Back = RawButton.Back;
  3234. buttonMap.PrimaryShoulder = RawButton.None;
  3235. buttonMap.PrimaryIndexTrigger = RawButton.RIndexTrigger;
  3236. buttonMap.PrimaryHandTrigger = RawButton.RHandTrigger;
  3237. buttonMap.PrimaryThumbstick = RawButton.None;
  3238. buttonMap.PrimaryThumbstickUp = RawButton.None;
  3239. buttonMap.PrimaryThumbstickDown = RawButton.None;
  3240. buttonMap.PrimaryThumbstickLeft = RawButton.None;
  3241. buttonMap.PrimaryThumbstickRight = RawButton.None;
  3242. buttonMap.PrimaryTouchpad = RawButton.RTouchpad;
  3243. buttonMap.SecondaryShoulder = RawButton.None;
  3244. buttonMap.SecondaryIndexTrigger = RawButton.None;
  3245. buttonMap.SecondaryHandTrigger = RawButton.None;
  3246. buttonMap.SecondaryThumbstick = RawButton.None;
  3247. buttonMap.SecondaryThumbstickUp = RawButton.None;
  3248. buttonMap.SecondaryThumbstickDown = RawButton.None;
  3249. buttonMap.SecondaryThumbstickLeft = RawButton.None;
  3250. buttonMap.SecondaryThumbstickRight = RawButton.None;
  3251. buttonMap.SecondaryTouchpad = RawButton.None;
  3252. buttonMap.DpadUp = RawButton.DpadUp;
  3253. buttonMap.DpadDown = RawButton.DpadDown;
  3254. buttonMap.DpadLeft = RawButton.DpadLeft;
  3255. buttonMap.DpadRight = RawButton.DpadRight;
  3256. buttonMap.Up = RawButton.DpadUp;
  3257. buttonMap.Down = RawButton.DpadDown;
  3258. buttonMap.Left = RawButton.DpadLeft;
  3259. buttonMap.Right = RawButton.DpadRight;
  3260. }
  3261. public override void ConfigureTouchMap()
  3262. {
  3263. touchMap.None = RawTouch.None;
  3264. touchMap.One = RawTouch.RTouchpad;
  3265. touchMap.Two = RawTouch.None;
  3266. touchMap.Three = RawTouch.None;
  3267. touchMap.Four = RawTouch.None;
  3268. touchMap.PrimaryIndexTrigger = RawTouch.RIndexTrigger;
  3269. touchMap.PrimaryThumbstick = RawTouch.None;
  3270. touchMap.PrimaryThumbRest = RawTouch.None;
  3271. touchMap.PrimaryTouchpad = RawTouch.RTouchpad;
  3272. touchMap.SecondaryIndexTrigger = RawTouch.None;
  3273. touchMap.SecondaryThumbstick = RawTouch.None;
  3274. touchMap.SecondaryThumbRest = RawTouch.None;
  3275. touchMap.SecondaryTouchpad = RawTouch.None;
  3276. }
  3277. public override void ConfigureNearTouchMap()
  3278. {
  3279. nearTouchMap.None = RawNearTouch.None;
  3280. nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None;
  3281. nearTouchMap.PrimaryThumbButtons = RawNearTouch.None;
  3282. nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None;
  3283. nearTouchMap.SecondaryThumbButtons = RawNearTouch.None;
  3284. }
  3285. public override void ConfigureAxis1DMap()
  3286. {
  3287. axis1DMap.None = RawAxis1D.None;
  3288. axis1DMap.PrimaryIndexTrigger = RawAxis1D.RIndexTrigger;
  3289. axis1DMap.PrimaryHandTrigger = RawAxis1D.RHandTrigger;
  3290. axis1DMap.SecondaryIndexTrigger = RawAxis1D.None;
  3291. axis1DMap.SecondaryHandTrigger = RawAxis1D.None;
  3292. }
  3293. public override void ConfigureAxis2DMap()
  3294. {
  3295. axis2DMap.None = RawAxis2D.None;
  3296. axis2DMap.PrimaryThumbstick = RawAxis2D.None;
  3297. axis2DMap.PrimaryTouchpad = RawAxis2D.RTouchpad;
  3298. axis2DMap.SecondaryThumbstick = RawAxis2D.None;
  3299. axis2DMap.SecondaryTouchpad = RawAxis2D.None;
  3300. }
  3301. public override Controller Update()
  3302. {
  3303. Controller res = base.Update();
  3304. if (GetDown(RawTouch.RTouchpad, OVRInput.Controller.RTrackedRemote))
  3305. {
  3306. emitSwipe = true;
  3307. moveAmount = currentState.RTouchpad;
  3308. }
  3309. if (GetDown(RawButton.RTouchpad, OVRInput.Controller.RTrackedRemote))
  3310. {
  3311. emitSwipe = false;
  3312. }
  3313. if (GetUp(RawTouch.RTouchpad, OVRInput.Controller.RTrackedRemote) && emitSwipe)
  3314. {
  3315. emitSwipe = false;
  3316. moveAmount.x = previousState.RTouchpad.x - moveAmount.x;
  3317. moveAmount.y = previousState.RTouchpad.y - moveAmount.y;
  3318. Vector2 move = new Vector2(moveAmount.x, moveAmount.y);
  3319. if (move.magnitude >= minMoveMagnitude)
  3320. {
  3321. move.Normalize();
  3322. // Left/Right
  3323. if (Mathf.Abs(move.x) > Mathf.Abs(move.y))
  3324. {
  3325. if (move.x < 0.0f)
  3326. {
  3327. currentState.Buttons |= (uint)RawButton.DpadLeft;
  3328. }
  3329. else
  3330. {
  3331. currentState.Buttons |= (uint)RawButton.DpadRight;
  3332. }
  3333. }
  3334. // Up/Down
  3335. else
  3336. {
  3337. if (move.y < 0.0f)
  3338. {
  3339. currentState.Buttons |= (uint)RawButton.DpadDown;
  3340. }
  3341. else
  3342. {
  3343. currentState.Buttons |= (uint)RawButton.DpadUp;
  3344. }
  3345. }
  3346. }
  3347. }
  3348. return res;
  3349. }
  3350. public override bool WasRecentered()
  3351. {
  3352. return (currentState.RRecenterCount != previousState.RRecenterCount);
  3353. }
  3354. public override byte GetRecenterCount()
  3355. {
  3356. return currentState.RRecenterCount;
  3357. }
  3358. public override byte GetBatteryPercentRemaining()
  3359. {
  3360. return currentState.RBatteryPercentRemaining;
  3361. }
  3362. }
  3363. }