OpenXRVkSpace.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <OpenXRVk/OpenXRVkSpace.h>
  9. #include <OpenXRVk/OpenXRVkUtils.h>
  10. #include <AzCore/Debug/Trace.h>
  11. namespace OpenXRVk
  12. {
  13. XR::Ptr<Space> Space::Create()
  14. {
  15. return aznew Space;
  16. }
  17. AZ::RHI::ResultCode Space::InitInternal()
  18. {
  19. return AZ::RHI::ResultCode::Success;
  20. }
  21. void Space::CreateVisualizedSpaces(XrSession xrSession)
  22. {
  23. AZ_Assert(xrSession != XR_NULL_HANDLE, "XR session is null");
  24. for (uint32_t i = 0; i < static_cast<uint32_t>(SpaceType::Count); i++)
  25. {
  26. XrReferenceSpaceCreateInfo referenceSpaceCreateInfo = GetXrReferenceSpaceCreateInfo(static_cast<SpaceType>(i));
  27. XrSpace space;
  28. XrResult result = xrCreateReferenceSpace(xrSession, &referenceSpaceCreateInfo, &space);
  29. if (IsSuccess(result))
  30. {
  31. m_xrSpaces.push_back(space);
  32. }
  33. else
  34. {
  35. AZ_Warning("OpenXrVK", false, "Failed to create reference space %s with error %d", ToString(static_cast<SpaceType>(i)).data(), result);
  36. }
  37. }
  38. }
  39. XrReferenceSpaceCreateInfo Space::GetXrReferenceSpaceCreateInfo(SpaceType spaceType)
  40. {
  41. XrReferenceSpaceCreateInfo referenceSpaceCreateInfo{ XR_TYPE_REFERENCE_SPACE_CREATE_INFO };
  42. referenceSpaceCreateInfo.poseInReferenceSpace = Identity();
  43. switch (spaceType)
  44. {
  45. case SpaceType::View:
  46. {
  47. //Track the view origin used to generate view transforms for the primary viewer (or centroid of
  48. //view origins if stereo), with +Y up, +X to the right, and -Z forward.
  49. referenceSpaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_VIEW;
  50. break;
  51. }
  52. case SpaceType::ViewFront:
  53. {
  54. // Track view head-locked 5m in front of device.
  55. referenceSpaceCreateInfo.poseInReferenceSpace = Translation({ 0.f, 0.f, -5.f }),
  56. referenceSpaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_VIEW;
  57. break;
  58. }
  59. case SpaceType::Local:
  60. {
  61. //Track center Local space which is world-locked origin, gravity-aligned to exclude
  62. //pitch and roll, with +Y up, +X to the right, and -Z forward.
  63. referenceSpaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_LOCAL;
  64. break;
  65. }
  66. case SpaceType::Stage:
  67. {
  68. //Track center Stage space which is defined flat, rectangular space that is empty and can be walked around on.
  69. referenceSpaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_STAGE;
  70. break;
  71. }
  72. case SpaceType::StageLeft:
  73. {
  74. //Track Left Stage space which is basically the center stage translated to the left and down by 5m.
  75. referenceSpaceCreateInfo.poseInReferenceSpace = RotateCCWAboutYAxis(0.f, { -5.f, 0.f, -5.f });
  76. referenceSpaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_STAGE;
  77. break;
  78. }
  79. case SpaceType::StageRight:
  80. {
  81. //Track Right Stage space which is basically the center stage translated to the right and down by 5m.
  82. referenceSpaceCreateInfo.poseInReferenceSpace = RotateCCWAboutYAxis(0.f, { 5.f, 0.f, -5.f });
  83. referenceSpaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_STAGE;
  84. break;
  85. }
  86. case SpaceType::StageLeftRotated:
  87. {
  88. //Track Left Rotated Stage space which is basically the center stage translated and Rotated by 60 deg (i.e pi/3). Remove if not used in future
  89. referenceSpaceCreateInfo.poseInReferenceSpace = RotateCCWAboutYAxis(AZ::Constants::Pi / 3.f, { -5.f, 0.5f, -5.f });
  90. referenceSpaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_STAGE;
  91. break;
  92. }
  93. case SpaceType::StageRightRotated:
  94. {
  95. //Track Right Rotated Stage space which is basically the center stage translated and Rotated by 60 deg (i.e pi/3). Remove if not used in future
  96. referenceSpaceCreateInfo.poseInReferenceSpace = RotateCCWAboutYAxis(-AZ::Constants::Pi / 3.f, { 5.f, 0.5f, -5.f });
  97. referenceSpaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_STAGE;
  98. break;
  99. }
  100. default:
  101. {
  102. AZ_Assert(false, "Unknown reference space type '%s'", ToString(static_cast<SpaceType>(spaceType)).data());
  103. }
  104. }
  105. return referenceSpaceCreateInfo;
  106. }
  107. XrPosef Space::Identity()
  108. {
  109. XrPosef t{};
  110. t.orientation.w = 1;
  111. return t;
  112. }
  113. XrPosef Space::Translation(const XrVector3f& translation)
  114. {
  115. XrPosef t = Identity();
  116. t.position = translation;
  117. return t;
  118. }
  119. XrPosef Space::RotateCCWAboutYAxis(float radians, XrVector3f translation)
  120. {
  121. XrPosef t = Identity();
  122. t.orientation.x = 0.f;
  123. t.orientation.y = AZStd::sin(radians * 0.5f);
  124. t.orientation.z = 0.f;
  125. t.orientation.w = AZStd::cos(radians * 0.5f);
  126. t.position = translation;
  127. return t;
  128. }
  129. XrSpace Space::GetXrSpace(SpaceType spaceType) const
  130. {
  131. return m_xrSpaces[static_cast<uint32_t>(spaceType)];
  132. }
  133. void Space::ShutdownInternal()
  134. {
  135. for (XrSpace& space : m_xrSpaces)
  136. {
  137. if (space != XR_NULL_HANDLE)
  138. {
  139. xrDestroySpace(space);
  140. }
  141. }
  142. m_xrSpaces.clear();
  143. }
  144. }