Skip to content

Instantly share code, notes, and snippets.

@fredemmott
Last active December 5, 2024 16:44
Show Gist options
  • Select an option

  • Save fredemmott/497b03882525c8e70eefe9579da42969 to your computer and use it in GitHub Desktop.

Select an option

Save fredemmott/497b03882525c8e70eefe9579da42969 to your computer and use it in GitHub Desktop.
diff --git a/src/injectables/OpenXRKneeboard.cpp b/src/injectables/OpenXRKneeboard.cpp
index 0c3f6d51..5cdbb322 100644
--- a/src/injectables/OpenXRKneeboard.cpp
+++ b/src/injectables/OpenXRKneeboard.cpp
@@ -50,6 +50,9 @@
#include <openxr/openxr_platform.h>
#include <openxr/openxr_reflection.h>
+// From OpenXR v1.1 SDK for XrPosef_Multiply
+#include "xr_linear.h"
+
namespace OpenKneeboard {
namespace {
@@ -109,9 +112,7 @@ static inline std::string_view xrresult_to_string(XrResult code) {
switch (code) {
#define XR_RESULT_CASE(enum_name, value) \
case enum_name: \
- return { \
- #enum_name \
- }; \
+ return {#enum_name}; \
XR_LIST_ENUM_XrResult(XR_RESULT_CASE)
#undef XR_RESULT_CASE
default:
@@ -370,18 +371,26 @@ XrResult OpenXRKneeboard::xrEndFrame(
SHM::SHARED_TEXTURE_IS_PREMULTIPLIED,
"Use premultiplied alpha in shared texture, or pass "
"XR_COMPOSITION_LAYER_UNPREMULTIPLIED_ALPHA_BIT");
+
+ XrSpaceLocation localInView {XR_TYPE_SPACE_LOCATION};
+ OPENKNEEBOARD_ALWAYS_ASSERT(XR_SUCCEEDED(gNext->xrLocateSpace(
+ mLocalSpace, mViewSpace, frameEndInfo->displayTime, &localInView)));
+ const auto kneeboardInLocal = this->GetXrPosef(params.mKneeboardPose);
+ XrPosef kneeboardInView {};
+ XrPosef_Multiply(&kneeboardInView, &localInView.pose, &kneeboardInLocal);
+
addedXRLayers.push_back({
.type = XR_TYPE_COMPOSITION_LAYER_QUAD,
.next = nullptr,
.layerFlags = XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT,
- .space = mLocalSpace,
+ .space = mViewSpace,
.eyeVisibility = XR_EYE_VISIBILITY_BOTH,
.subImage = XrSwapchainSubImage {
.swapchain = mSwapchain,
.imageRect = destRect.StaticCast<int, XrRect2Di>(),
.imageArrayIndex = 0,
},
- .pose = this->GetXrPosef(params.mKneeboardPose),
+ .pose = kneeboardInView,
.size = { params.mKneeboardSize.x, params.mKneeboardSize.y },
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment