2021년 4학년 1학기 기업연계프로젝트2 컴퓨터소프트웨어공학과 <원광투어팀> 팀장 : 송유진 팀원 : 김나영, 이경희, 한유진
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

410 lines
19 KiB

5 years ago
  1. //========= Copyright 2016-2020, HTC Corporation. All rights reserved. ===========
  2. using UnityEngine;
  3. using HTC.UnityPlugin.Vive;
  4. #if UNITY_2017_2_OR_NEWER
  5. using UnityEngine.XR;
  6. #else
  7. using XRSettings = UnityEngine.VR.VRSettings;
  8. using XRDevice = UnityEngine.VR.VRDevice;
  9. #endif
  10. namespace HTC.UnityPlugin.VRModuleManagement
  11. {
  12. public sealed partial class UnityEngineVRModule : VRModule.ModuleBase
  13. {
  14. public override int moduleOrder { get { return (int)DefaultModuleOrder.UnityNativeVR; } }
  15. public override int moduleIndex { get { return (int)VRModuleSelectEnum.UnityNativeVR; } }
  16. #if !UNITY_2020_1_OR_NEWER
  17. private static KeyCode[] s_keyCodes = new KeyCode[]
  18. {
  19. KeyCode.JoystickButton0,
  20. KeyCode.JoystickButton1,
  21. KeyCode.JoystickButton2,
  22. KeyCode.JoystickButton3,
  23. KeyCode.JoystickButton4,
  24. KeyCode.JoystickButton5,
  25. KeyCode.JoystickButton6,
  26. KeyCode.JoystickButton7,
  27. KeyCode.JoystickButton8,
  28. KeyCode.JoystickButton9,
  29. KeyCode.JoystickButton10,
  30. KeyCode.JoystickButton11,
  31. KeyCode.JoystickButton12,
  32. KeyCode.JoystickButton13,
  33. KeyCode.JoystickButton14,
  34. KeyCode.JoystickButton15,
  35. KeyCode.JoystickButton16,
  36. KeyCode.JoystickButton17,
  37. KeyCode.JoystickButton18,
  38. KeyCode.JoystickButton19,
  39. };
  40. private static string[] s_axisNames = new string[]
  41. {
  42. "HTC_VIU_UnityAxis1",
  43. "HTC_VIU_UnityAxis2",
  44. "HTC_VIU_UnityAxis3",
  45. "HTC_VIU_UnityAxis4",
  46. "HTC_VIU_UnityAxis5",
  47. "HTC_VIU_UnityAxis6",
  48. "HTC_VIU_UnityAxis7",
  49. "HTC_VIU_UnityAxis8",
  50. "HTC_VIU_UnityAxis9",
  51. "HTC_VIU_UnityAxis10",
  52. "HTC_VIU_UnityAxis11",
  53. "HTC_VIU_UnityAxis12",
  54. "HTC_VIU_UnityAxis13",
  55. "HTC_VIU_UnityAxis14",
  56. "HTC_VIU_UnityAxis15",
  57. "HTC_VIU_UnityAxis16",
  58. "HTC_VIU_UnityAxis17",
  59. "HTC_VIU_UnityAxis18",
  60. "HTC_VIU_UnityAxis19",
  61. "HTC_VIU_UnityAxis20",
  62. "HTC_VIU_UnityAxis21",
  63. "HTC_VIU_UnityAxis22",
  64. "HTC_VIU_UnityAxis23",
  65. "HTC_VIU_UnityAxis24",
  66. "HTC_VIU_UnityAxis25",
  67. "HTC_VIU_UnityAxis26",
  68. "HTC_VIU_UnityAxis27",
  69. };
  70. public static bool GetUnityButton(int id)
  71. {
  72. return Input.GetKey(s_keyCodes[id]);
  73. }
  74. public static float GetUnityAxis(int id)
  75. {
  76. return Input.GetAxisRaw(s_axisNames[id - 1]);
  77. }
  78. #if UNITY_EDITOR
  79. public static int GetUnityAxisCount() { return s_axisNames.Length; }
  80. public static string GetUnityAxisNameByIndex(int index) { return s_axisNames[index]; }
  81. public static int GetUnityAxisIdByIndex(int index) { return index + 1; }
  82. #endif
  83. public override bool ShouldActiveModule() { return VIUSettings.activateUnityNativeVRModule && XRSettings.enabled; }
  84. public override void Update()
  85. {
  86. // set physics update rate to vr render rate
  87. if (VRModule.lockPhysicsUpdateRateToRenderFrequency && Time.timeScale > 0.0f)
  88. {
  89. // FIXME: VRDevice.refreshRate returns zero in Unity 5.6.0 or older version
  90. #if UNITY_5_6_OR_NEWER
  91. Time.fixedDeltaTime = 1f / XRDevice.refreshRate;
  92. #else
  93. Time.fixedDeltaTime = 1f / 90f;
  94. #endif
  95. }
  96. }
  97. private static void UpdateLeftControllerInput(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  98. {
  99. switch (currState.deviceModel)
  100. {
  101. case VRModuleDeviceModel.ViveCosmosControllerLeft:
  102. case VRModuleDeviceModel.ViveController:
  103. Update_L_Vive(prevState, currState);
  104. break;
  105. case VRModuleDeviceModel.OculusQuestControllerLeft:
  106. case VRModuleDeviceModel.OculusGoController:
  107. case VRModuleDeviceModel.OculusTouchLeft:
  108. Update_L_OculusTouch(prevState, currState);
  109. break;
  110. case VRModuleDeviceModel.KnucklesLeft:
  111. case VRModuleDeviceModel.IndexControllerLeft:
  112. Update_L_Knuckles(prevState, currState);
  113. break;
  114. case VRModuleDeviceModel.WMRControllerLeft:
  115. Update_L_MicrosoftMR(prevState, currState);
  116. break;
  117. }
  118. }
  119. private static void UpdateRightControllerInput(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  120. {
  121. switch (currState.deviceModel)
  122. {
  123. case VRModuleDeviceModel.ViveCosmosControllerRight:
  124. case VRModuleDeviceModel.ViveController:
  125. Update_R_Vive(prevState, currState);
  126. break;
  127. case VRModuleDeviceModel.OculusQuestControllerRight:
  128. case VRModuleDeviceModel.OculusGoController:
  129. case VRModuleDeviceModel.OculusTouchRight:
  130. Update_R_OculusTouch(prevState, currState);
  131. break;
  132. case VRModuleDeviceModel.KnucklesRight:
  133. case VRModuleDeviceModel.IndexControllerRight:
  134. Update_R_Knuckles(prevState, currState);
  135. break;
  136. case VRModuleDeviceModel.WMRControllerRight:
  137. Update_R_MicrosoftMR(prevState, currState);
  138. break;
  139. }
  140. }
  141. private static void Update_L_Vive(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  142. {
  143. var menuPress = GetUnityButton(2);
  144. var padPress = GetUnityButton(8);
  145. var triggerTouch = GetUnityButton(14);
  146. var padTouch = GetUnityButton(16);
  147. var padX = GetUnityAxis(1);
  148. var padY = GetUnityAxis(2);
  149. var trigger = GetUnityAxis(9);
  150. var grip = GetUnityAxis(11);
  151. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuPress);
  152. currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1.0f);
  153. currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
  154. currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
  155. currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
  156. currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
  157. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
  158. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
  159. currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
  160. }
  161. private static void Update_R_Vive(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  162. {
  163. var menuPress = GetUnityButton(0);
  164. var padPress = GetUnityButton(9);
  165. var triggerTouch = GetUnityButton(15);
  166. var padTouch = GetUnityButton(17);
  167. var padX = GetUnityAxis(4);
  168. var padY = GetUnityAxis(5);
  169. var trigger = GetUnityAxis(10);
  170. var grip = GetUnityAxis(12);
  171. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuPress);
  172. currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
  173. currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
  174. currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1.0f);
  175. currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
  176. currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
  177. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
  178. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
  179. currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
  180. }
  181. private static void Update_L_OculusTouch(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  182. {
  183. var startPress = GetUnityButton(6);
  184. var xPress = GetUnityButton(2);
  185. var yPress = GetUnityButton(3);
  186. var stickPress = GetUnityButton(8);
  187. var gripPress = GetUnityButton(4);
  188. var xTouch = GetUnityButton(12);
  189. var yTouch = GetUnityButton(13);
  190. var triggerTouch = GetUnityButton(14);
  191. var stickTouch = GetUnityButton(16);
  192. var stickX = GetUnityAxis(1);
  193. var stickY = GetUnityAxis(2);
  194. var trigger = GetUnityAxis(9);
  195. var grip = GetUnityAxis(11);
  196. currState.SetButtonPress(VRModuleRawButton.System, startPress);
  197. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, yPress);
  198. currState.SetButtonPress(VRModuleRawButton.A, xPress);
  199. currState.SetButtonPress(VRModuleRawButton.Touchpad, stickPress);
  200. currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
  201. currState.SetButtonPress(VRModuleRawButton.Grip, gripPress);
  202. currState.SetButtonPress(VRModuleRawButton.CapSenseGrip, gripPress);
  203. currState.SetButtonTouch(VRModuleRawButton.ApplicationMenu, yTouch);
  204. currState.SetButtonTouch(VRModuleRawButton.A, xTouch);
  205. currState.SetButtonTouch(VRModuleRawButton.Touchpad, stickTouch);
  206. currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
  207. currState.SetButtonTouch(VRModuleRawButton.Grip, grip >= 0.05f);
  208. currState.SetButtonTouch(VRModuleRawButton.CapSenseGrip, grip >= 0.05f);
  209. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, stickX);
  210. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -stickY);
  211. currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
  212. currState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
  213. }
  214. private static void Update_R_OculusTouch(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  215. {
  216. var aPress = GetUnityButton(0);
  217. var bPress = GetUnityButton(1);
  218. var stickPress = GetUnityButton(9);
  219. var gripPress = GetUnityButton(5);
  220. var aTouch = GetUnityButton(10);
  221. var bTouch = GetUnityButton(11);
  222. var triggerTouch = GetUnityButton(15);
  223. var stickTouch = GetUnityButton(17);
  224. var stickX = GetUnityAxis(4);
  225. var stickY = GetUnityAxis(5);
  226. var trigger = GetUnityAxis(10);
  227. var grip = GetUnityAxis(12);
  228. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, bPress);
  229. currState.SetButtonPress(VRModuleRawButton.A, aPress);
  230. currState.SetButtonPress(VRModuleRawButton.Touchpad, stickPress);
  231. currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
  232. currState.SetButtonPress(VRModuleRawButton.Grip, gripPress);
  233. currState.SetButtonPress(VRModuleRawButton.CapSenseGrip, gripPress);
  234. currState.SetButtonTouch(VRModuleRawButton.ApplicationMenu, bTouch);
  235. currState.SetButtonTouch(VRModuleRawButton.A, aTouch);
  236. currState.SetButtonTouch(VRModuleRawButton.Touchpad, stickTouch);
  237. currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
  238. currState.SetButtonTouch(VRModuleRawButton.Grip, grip >= 0.05f);
  239. currState.SetButtonTouch(VRModuleRawButton.CapSenseGrip, grip >= 0.05f);
  240. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, stickX);
  241. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -stickY);
  242. currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
  243. currState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
  244. }
  245. private static void Update_L_Knuckles(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  246. {
  247. var innerPress = GetUnityButton(2);
  248. var outerPress = GetUnityButton(3);
  249. var padPress = GetUnityButton(8);
  250. var triggerTouch = GetUnityButton(14);
  251. var padTouch = GetUnityButton(16);
  252. var padX = GetUnityAxis(1);
  253. var padY = GetUnityAxis(2);
  254. var trigger = GetUnityAxis(9);
  255. var grip = GetUnityAxis(11);
  256. var index = GetUnityAxis(20);
  257. var middle = GetUnityAxis(22);
  258. var ring = GetUnityAxis(24);
  259. var pinky = GetUnityAxis(26);
  260. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, outerPress);
  261. currState.SetButtonPress(VRModuleRawButton.A, innerPress);
  262. currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
  263. currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
  264. currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1.0f);
  265. currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
  266. currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
  267. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
  268. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
  269. currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
  270. currState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
  271. currState.SetAxisValue(VRModuleRawAxis.IndexCurl, index);
  272. currState.SetAxisValue(VRModuleRawAxis.MiddleCurl, middle);
  273. currState.SetAxisValue(VRModuleRawAxis.RingCurl, ring);
  274. currState.SetAxisValue(VRModuleRawAxis.PinkyCurl, pinky);
  275. }
  276. private static void Update_R_Knuckles(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  277. {
  278. var innerPress = GetUnityButton(0);
  279. var outerPress = GetUnityButton(1);
  280. var padPress = GetUnityButton(9);
  281. var triggerTouch = GetUnityButton(15);
  282. var padTouch = GetUnityButton(17);
  283. var padX = GetUnityAxis(4);
  284. var padY = GetUnityAxis(5);
  285. var trigger = GetUnityAxis(10);
  286. var grip = GetUnityAxis(12);
  287. var index = GetUnityAxis(21);
  288. var middle = GetUnityAxis(23);
  289. var ring = GetUnityAxis(25);
  290. var pinky = GetUnityAxis(27);
  291. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, outerPress);
  292. currState.SetButtonPress(VRModuleRawButton.A, innerPress);
  293. currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
  294. currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
  295. currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1.0f);
  296. currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
  297. currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
  298. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
  299. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
  300. currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
  301. currState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
  302. currState.SetAxisValue(VRModuleRawAxis.IndexCurl, index);
  303. currState.SetAxisValue(VRModuleRawAxis.MiddleCurl, middle);
  304. currState.SetAxisValue(VRModuleRawAxis.RingCurl, ring);
  305. currState.SetAxisValue(VRModuleRawAxis.PinkyCurl, pinky);
  306. }
  307. private static void Update_L_MicrosoftMR(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  308. {
  309. var menuPress = GetUnityButton(2);
  310. var padPress = GetUnityButton(8);
  311. var triggerPress = GetUnityButton(14);
  312. var padTouch = GetUnityButton(16);
  313. var stickX = GetUnityAxis(1);
  314. var stickY = GetUnityAxis(2);
  315. var trigger = GetUnityAxis(9);
  316. var grip = GetUnityAxis(11);
  317. var padX = GetUnityAxis(17);
  318. var padY = GetUnityAxis(18);
  319. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuPress);
  320. currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
  321. currState.SetButtonPress(VRModuleRawButton.Trigger, triggerPress);
  322. currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1f);
  323. currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
  324. currState.SetButtonTouch(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.25f, 0.20f));
  325. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
  326. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
  327. currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
  328. currState.SetAxisValue(VRModuleRawAxis.JoystickX, stickX);
  329. currState.SetAxisValue(VRModuleRawAxis.JoystickY, -stickY);
  330. }
  331. private static void Update_R_MicrosoftMR(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
  332. {
  333. var menuPress = GetUnityButton(0);
  334. var padPress = GetUnityButton(9);
  335. var triggerPress = GetUnityButton(15);
  336. var padTouch = GetUnityButton(17);
  337. var stickX = GetUnityAxis(4);
  338. var stickY = GetUnityAxis(5);
  339. var trigger = GetUnityAxis(10);
  340. var grip = GetUnityAxis(12);
  341. var padX = GetUnityAxis(19);
  342. var padY = GetUnityAxis(20);
  343. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuPress);
  344. currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
  345. currState.SetButtonPress(VRModuleRawButton.Trigger, triggerPress);
  346. currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1f);
  347. currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
  348. currState.SetButtonTouch(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.25f, 0.20f));
  349. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
  350. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
  351. currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
  352. currState.SetAxisValue(VRModuleRawAxis.JoystickX, stickX);
  353. currState.SetAxisValue(VRModuleRawAxis.JoystickY, -stickY);
  354. }
  355. #endif
  356. }
  357. }