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.

450 lines
17 KiB

5 years ago
  1. //========= Copyright 2016-2020, HTC Corporation. All rights reserved. ===========
  2. using HTC.UnityPlugin.Utility;
  3. #if VIU_GOOGLEVR && UNITY_5_6_OR_NEWER
  4. using UnityEngine;
  5. using HTC.UnityPlugin.Vive;
  6. #if UNITY_2017_2_OR_NEWER
  7. using UnityEngine.XR;
  8. #else
  9. using XRSettings = UnityEngine.VR.VRSettings;
  10. using XRDevice = UnityEngine.VR.VRDevice;
  11. using XRNode = UnityEngine.VR.VRNode;
  12. using InputTracking = UnityEngine.VR.InputTracking;
  13. #endif
  14. #endif
  15. namespace HTC.UnityPlugin.VRModuleManagement
  16. {
  17. public partial class VRModule : SingletonBehaviour<VRModule>
  18. {
  19. public static readonly bool isGoogleVRPluginDetected =
  20. #if VIU_GOOGLEVR
  21. true;
  22. #else
  23. false;
  24. #endif
  25. public static readonly bool isGoogleVRSupported =
  26. #if VIU_GOOGLEVR_SUPPORT
  27. true;
  28. #else
  29. false;
  30. #endif
  31. }
  32. public sealed class GoogleVRModule : VRModule.ModuleBase
  33. {
  34. public override int moduleOrder { get { return (int)DefaultModuleOrder.DayDream; } }
  35. public override int moduleIndex { get { return (int)VRModuleSelectEnum.DayDream; } }
  36. #if VIU_GOOGLEVR && UNITY_5_6_OR_NEWER
  37. private const uint HEAD_INDEX = 0u;
  38. private uint m_rightIndex = INVALID_DEVICE_INDEX;
  39. private uint m_leftIndex = INVALID_DEVICE_INDEX;
  40. public override uint GetRightControllerDeviceIndex() { return m_rightIndex; }
  41. public override uint GetLeftControllerDeviceIndex() { return m_leftIndex; }
  42. public override bool ShouldActiveModule()
  43. {
  44. return VIUSettings.activateGoogleVRModule && XRSettings.enabled && XRSettings.loadedDeviceName == "daydream";
  45. }
  46. public override void Update()
  47. {
  48. UpdateDeviceInput();
  49. ProcessDeviceInputChanged();
  50. }
  51. public override void BeforeRenderUpdate()
  52. {
  53. FlushDeviceState();
  54. UpdateConnectedDevices();
  55. ProcessConnectedDeviceChanged();
  56. UpdateDevicePose();
  57. ProcessDevicePoseChanged();
  58. }
  59. #if VIU_GOOGLEVR_1_150_0_NEWER
  60. private const uint RIGHT_HAND_INDEX = 1u;
  61. private const uint LEFT_HAND_INDEX = 2u;
  62. private GvrControllerInputDevice m_rightDevice;
  63. private GvrControllerInputDevice m_leftDevice;
  64. private GvrArmModel m_rightArm;
  65. private GvrArmModel m_leftArm;
  66. public override void OnActivated()
  67. {
  68. EnsureDeviceStateLength(3);
  69. if (Object.FindObjectOfType<GvrHeadset>() == null)
  70. {
  71. VRModule.Instance.gameObject.AddComponent<GvrHeadset>();
  72. }
  73. if (Object.FindObjectOfType<GvrControllerInput>() == null)
  74. {
  75. VRModule.Instance.gameObject.AddComponent<GvrControllerInput>();
  76. }
  77. m_rightDevice = GvrControllerInput.GetDevice(GvrControllerHand.Dominant);
  78. m_leftDevice = GvrControllerInput.GetDevice(GvrControllerHand.Dominant);
  79. var armModels = VRModule.Instance.GetComponents<GvrArmModel>();
  80. if (armModels != null && armModels.Length >= 1)
  81. {
  82. m_rightArm = armModels[0];
  83. }
  84. else
  85. {
  86. m_rightArm = VRModule.Instance.GetComponent<GvrArmModel>();
  87. if (m_rightArm == null)
  88. {
  89. m_rightArm = VRModule.Instance.gameObject.AddComponent<GvrArmModel>();
  90. }
  91. }
  92. m_rightArm.ControllerInputDevice = m_rightDevice;
  93. if (armModels != null && armModels.Length >= 2)
  94. {
  95. m_leftArm = armModels[1];
  96. }
  97. else
  98. {
  99. m_leftArm = VRModule.Instance.GetComponent<GvrArmModel>();
  100. if (m_leftArm == null)
  101. {
  102. m_leftArm = VRModule.Instance.gameObject.AddComponent<GvrArmModel>();
  103. }
  104. }
  105. m_leftArm.ControllerInputDevice = m_leftDevice;
  106. }
  107. // update connected devices
  108. private void UpdateConnectedDevices()
  109. {
  110. IVRModuleDeviceState prevState;
  111. IVRModuleDeviceStateRW currState;
  112. EnsureValidDeviceState(HEAD_INDEX, out prevState, out currState);
  113. if (!XRDevice.isPresent)
  114. {
  115. if (prevState.isConnected)
  116. {
  117. currState.Reset();
  118. }
  119. }
  120. else
  121. {
  122. if (!prevState.isConnected)
  123. {
  124. currState.isConnected = true;
  125. currState.deviceClass = VRModuleDeviceClass.HMD;
  126. currState.serialNumber = XRDevice.model + " HMD";
  127. currState.modelNumber = XRDevice.model + " HMD";
  128. currState.deviceModel = VRModuleDeviceModel.DaydreamHMD;
  129. currState.renderModelName = string.Empty;
  130. }
  131. }
  132. EnsureValidDeviceState(RIGHT_HAND_INDEX, out prevState, out currState);
  133. if (m_rightDevice.State != GvrConnectionState.Connected)
  134. {
  135. if (prevState.isConnected)
  136. {
  137. currState.Reset();
  138. m_rightIndex = INVALID_DEVICE_INDEX;
  139. }
  140. }
  141. else
  142. {
  143. if (!prevState.isConnected)
  144. {
  145. currState.isConnected = true;
  146. currState.deviceClass = VRModuleDeviceClass.Controller;
  147. currState.serialNumber = XRDevice.model + " Controller Right";
  148. currState.modelNumber = XRDevice.model + " Controller Right";
  149. currState.deviceModel = VRModuleDeviceModel.DaydreamController;
  150. currState.renderModelName = string.Empty;
  151. currState.input2DType = VRModuleInput2DType.TouchpadOnly;
  152. m_rightIndex = RIGHT_HAND_INDEX;
  153. }
  154. }
  155. EnsureValidDeviceState(LEFT_HAND_INDEX, out prevState, out currState);
  156. if (m_leftDevice.State != GvrConnectionState.Connected)
  157. {
  158. if (prevState.isConnected)
  159. {
  160. currState.Reset();
  161. m_leftIndex = INVALID_DEVICE_INDEX;
  162. }
  163. }
  164. else
  165. {
  166. if (!prevState.isConnected)
  167. {
  168. currState.isConnected = true;
  169. currState.deviceClass = VRModuleDeviceClass.Controller;
  170. currState.serialNumber = XRDevice.model + " Controller Left";
  171. currState.modelNumber = XRDevice.model + " Controller Left";
  172. currState.deviceModel = VRModuleDeviceModel.DaydreamController;
  173. currState.renderModelName = string.Empty;
  174. currState.input2DType = VRModuleInput2DType.TouchpadOnly;
  175. m_leftIndex = RIGHT_HAND_INDEX;
  176. }
  177. }
  178. }
  179. private void UpdateDevicePose()
  180. {
  181. IVRModuleDeviceState prevState;
  182. IVRModuleDeviceStateRW currState;
  183. EnsureValidDeviceState(HEAD_INDEX, out prevState, out currState);
  184. if (currState.isConnected)
  185. {
  186. currState.position = InputTracking.GetLocalPosition(XRNode.Head);
  187. currState.rotation = InputTracking.GetLocalRotation(XRNode.Head);
  188. currState.isPoseValid = currState.pose != RigidPose.identity;
  189. }
  190. EnsureValidDeviceState(RIGHT_HAND_INDEX, out prevState, out currState);
  191. if (currState.isConnected)
  192. {
  193. currState.position = m_rightArm.ControllerPositionFromHead;
  194. currState.rotation = m_rightArm.ControllerRotationFromHead;
  195. currState.isPoseValid = m_rightDevice.Orientation != Quaternion.identity;
  196. }
  197. EnsureValidDeviceState(LEFT_HAND_INDEX, out prevState, out currState);
  198. if (currState.isConnected)
  199. {
  200. currState.position = m_leftArm.ControllerPositionFromHead;
  201. currState.rotation = m_leftArm.ControllerRotationFromHead;
  202. currState.isPoseValid = m_leftDevice.Orientation != Quaternion.identity;
  203. }
  204. }
  205. private void UpdateDeviceInput()
  206. {
  207. IVRModuleDeviceState prevState;
  208. IVRModuleDeviceStateRW currState;
  209. EnsureValidDeviceState(RIGHT_HAND_INDEX, out prevState, out currState);
  210. if (currState.isConnected)
  211. {
  212. var appPressed = m_rightDevice.GetButton(GvrControllerButton.App);
  213. var systemPressed = m_rightDevice.GetButton(GvrControllerButton.System);
  214. var padPressed = m_rightDevice.GetButton(GvrControllerButton.TouchPadButton);
  215. var padTouched = m_rightDevice.GetButton(GvrControllerButton.TouchPadTouch);
  216. var padAxis = m_rightDevice.TouchPos;
  217. currState.SetButtonPress(VRModuleRawButton.Touchpad, padPressed);
  218. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, appPressed);
  219. currState.SetButtonPress(VRModuleRawButton.System, systemPressed);
  220. currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouched);
  221. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padAxis.x);
  222. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, padAxis.y);
  223. if (VIUSettings.daydreamSyncPadPressToTrigger)
  224. {
  225. currState.SetButtonPress(VRModuleRawButton.Trigger, padPressed);
  226. currState.SetButtonTouch(VRModuleRawButton.Trigger, padTouched);
  227. currState.SetAxisValue(VRModuleRawAxis.Trigger, padPressed ? 1f : 0f);
  228. }
  229. }
  230. EnsureValidDeviceState(LEFT_HAND_INDEX, out prevState, out currState);
  231. if (currState.isConnected)
  232. {
  233. var appPressed = m_leftDevice.GetButton(GvrControllerButton.App);
  234. var systemPressed = m_leftDevice.GetButton(GvrControllerButton.System);
  235. var padPressed = m_leftDevice.GetButton(GvrControllerButton.TouchPadButton);
  236. var padTouched = m_leftDevice.GetButton(GvrControllerButton.TouchPadTouch);
  237. var padAxis = m_leftDevice.TouchPos;
  238. currState.SetButtonPress(VRModuleRawButton.Touchpad, padPressed);
  239. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, appPressed);
  240. currState.SetButtonPress(VRModuleRawButton.System, systemPressed);
  241. currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouched);
  242. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padAxis.x);
  243. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, padAxis.y);
  244. if (VIUSettings.daydreamSyncPadPressToTrigger)
  245. {
  246. currState.SetButtonPress(VRModuleRawButton.Trigger, padPressed);
  247. currState.SetButtonTouch(VRModuleRawButton.Trigger, padTouched);
  248. currState.SetAxisValue(VRModuleRawAxis.Trigger, padPressed ? 1f : 0f);
  249. }
  250. }
  251. }
  252. #else
  253. public const uint CONTROLLER_INDEX = 1u;
  254. private GvrArmModel m_gvrArmModel;
  255. public override void OnActivated()
  256. {
  257. EnsureDeviceStateLength(2);
  258. if (Object.FindObjectOfType<GvrHeadset>() == null)
  259. {
  260. VRModule.Instance.gameObject.AddComponent<GvrHeadset>();
  261. }
  262. if (Object.FindObjectOfType<GvrControllerInput>() == null)
  263. {
  264. VRModule.Instance.gameObject.AddComponent<GvrControllerInput>();
  265. }
  266. m_gvrArmModel = VRModule.Instance.GetComponent<GvrArmModel>();
  267. if (m_gvrArmModel == null)
  268. {
  269. m_gvrArmModel = VRModule.Instance.gameObject.AddComponent<GvrArmModel>();
  270. }
  271. }
  272. // update connected devices
  273. private void UpdateConnectedDevices()
  274. {
  275. IVRModuleDeviceState prevState;
  276. IVRModuleDeviceStateRW currState;
  277. EnsureValidDeviceState(HEAD_INDEX, out prevState, out currState);
  278. if (!XRDevice.isPresent)
  279. {
  280. if (prevState.isConnected)
  281. {
  282. currState.Reset();
  283. }
  284. }
  285. else
  286. {
  287. if (!prevState.isConnected)
  288. {
  289. currState.isConnected = true;
  290. currState.deviceClass = VRModuleDeviceClass.HMD;
  291. currState.serialNumber = XRDevice.model + " HMD";
  292. currState.modelNumber = XRDevice.model + " HMD";
  293. currState.deviceModel = VRModuleDeviceModel.DaydreamHMD;
  294. currState.renderModelName = string.Empty;
  295. }
  296. }
  297. var controllerRoleChanged = false;
  298. EnsureValidDeviceState(CONTROLLER_INDEX, out prevState, out currState);
  299. if (GvrControllerInput.State != GvrConnectionState.Connected)
  300. {
  301. if (prevState.isConnected)
  302. {
  303. currState.Reset();
  304. }
  305. }
  306. else
  307. {
  308. if (!prevState.isConnected)
  309. {
  310. currState.isConnected = true;
  311. currState.deviceClass = VRModuleDeviceClass.Controller;
  312. currState.serialNumber = XRDevice.model + " Controller";
  313. currState.modelNumber = XRDevice.model + " Controller";
  314. currState.deviceModel = VRModuleDeviceModel.DaydreamController;
  315. currState.renderModelName = string.Empty;
  316. }
  317. switch (GvrSettings.Handedness)
  318. {
  319. case GvrSettings.UserPrefsHandedness.Right:
  320. controllerRoleChanged = !VRModule.IsValidDeviceIndex(m_rightIndex) && m_leftIndex == CONTROLLER_INDEX;
  321. m_rightIndex = CONTROLLER_INDEX;
  322. m_leftIndex = INVALID_DEVICE_INDEX;
  323. break;
  324. case GvrSettings.UserPrefsHandedness.Left:
  325. controllerRoleChanged = m_rightIndex == CONTROLLER_INDEX && !VRModule.IsValidDeviceIndex(m_leftIndex);
  326. m_rightIndex = INVALID_DEVICE_INDEX;
  327. m_leftIndex = CONTROLLER_INDEX;
  328. break;
  329. case GvrSettings.UserPrefsHandedness.Error:
  330. default:
  331. Debug.LogError("GvrSettings.Handedness error");
  332. break;
  333. }
  334. }
  335. if (controllerRoleChanged)
  336. {
  337. InvokeControllerRoleChangedEvent();
  338. }
  339. }
  340. private void UpdateDevicePose()
  341. {
  342. IVRModuleDeviceState prevState;
  343. IVRModuleDeviceStateRW currState;
  344. EnsureValidDeviceState(HEAD_INDEX, out prevState, out currState);
  345. if (currState.isConnected)
  346. {
  347. currState.position = InputTracking.GetLocalPosition(XRNode.Head);
  348. currState.rotation = InputTracking.GetLocalRotation(XRNode.Head);
  349. currState.isPoseValid = currState.pose != RigidPose.identity;
  350. }
  351. EnsureValidDeviceState(CONTROLLER_INDEX, out prevState, out currState);
  352. if (currState.isConnected)
  353. {
  354. currState.position = m_gvrArmModel.ControllerPositionFromHead;
  355. currState.rotation = m_gvrArmModel.ControllerRotationFromHead;
  356. currState.isPoseValid = GvrControllerInput.Orientation != Quaternion.identity;
  357. }
  358. }
  359. private void UpdateDeviceInput()
  360. {
  361. IVRModuleDeviceState prevState;
  362. IVRModuleDeviceStateRW currState;
  363. EnsureValidDeviceState(CONTROLLER_INDEX, out prevState, out currState);
  364. if (currState.isConnected)
  365. {
  366. var appPressed = GvrControllerInput.AppButton;
  367. var homePressed = GvrControllerInput.HomeButtonState;
  368. var padPressed = GvrControllerInput.ClickButton;
  369. var padTouched = GvrControllerInput.IsTouching;
  370. var padAxis = GvrControllerInput.TouchPosCentered;
  371. currState.SetButtonPress(VRModuleRawButton.Touchpad, padPressed);
  372. currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, appPressed);
  373. currState.SetButtonPress(VRModuleRawButton.System, homePressed);
  374. currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouched);
  375. currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padAxis.x);
  376. currState.SetAxisValue(VRModuleRawAxis.TouchpadY, padAxis.y);
  377. if (VIUSettings.daydreamSyncPadPressToTrigger)
  378. {
  379. currState.SetButtonPress(VRModuleRawButton.Trigger, padPressed);
  380. currState.SetButtonTouch(VRModuleRawButton.Trigger, padTouched);
  381. currState.SetAxisValue(VRModuleRawAxis.Trigger, padPressed ? 1f : 0f);
  382. }
  383. }
  384. }
  385. #endif
  386. #endif
  387. }
  388. }