Skip to content

Commit

Permalink
Support configurable gaze target in SteamVR
Browse files Browse the repository at this point in the history
Fixes #39
  • Loading branch information
fredemmott committed Mar 12, 2022
1 parent a6476c3 commit 64b5656
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 38 deletions.
1 change: 1 addition & 0 deletions src/app/app-common/CMakeLists.txt
Expand Up @@ -14,6 +14,7 @@ target_link_libraries(
OpenKneeboard-DXResources
OpenKneeboard-GameEvent
OpenKneeboard-GetSystemColor
OpenKneeboard-RayIntersectsRect
OpenKneeboard-RuntimeFiles
OpenKneeboard-scope_guard
OpenKneeboard-SHM
Expand Down
74 changes: 36 additions & 38 deletions src/app/app-common/OpenVROverlay.cpp
Expand Up @@ -19,6 +19,7 @@
*/
#include <DirectXTK/SimpleMath.h>
#include <OpenKneeboard/OpenVROverlay.h>
#include <OpenKneeboard/RayIntersectsRect.h>
#include <OpenKneeboard/SHM.h>
#include <OpenKneeboard/config.h>
#include <OpenKneeboard/dprint.h>
Expand Down Expand Up @@ -138,6 +139,18 @@ void OpenVROverlay::Tick() {
}
}

auto snapshot = p->mSHM.MaybeGet();
if (!snapshot) {
return;
}

const auto config = snapshot.GetConfig();
const auto& vrConf = config.vr;

const auto aspectRatio = float(config.imageWidth) / config.imageHeight;
p->mWidth = vrConf.height * aspectRatio;
p->mZoomedWidth = p->mWidth * vrConf.zoomScale;

vr::TrackedDevicePose_t hmdPose {
.bPoseIsValid = false,
.bDeviceIsConnected = false,
Expand All @@ -155,51 +168,36 @@ void OpenVROverlay::Tick() {
);
// clang-format on

auto translation = m.Translation();
auto rotation = Vector3::TransformNormal(Vector3::Forward, m);

vr::VROverlayIntersectionParams_t params {
.vSource = {translation.x, translation.y, translation.z},
.vDirection = {rotation.x, rotation.y, rotation.z},
.eOrigin = vr::TrackingUniverseStanding,
};

vr::VROverlayIntersectionResults_t results;
auto zoomed = p->mIVROverlay->ComputeOverlayIntersection(
p->mOverlay, &params, &results);

if (
zoomed != p->mZoomed
&& p->mSequenceNumber == p->mSHM.GetSequenceNumber()) {
CHECK(
SetOverlayWidthInMeters,
p->mOverlay,
zoomed ? p->mZoomedWidth : p->mWidth);
}
p->mZoomed = zoomed;
}

if (p->mSHM.GetSequenceNumber() == p->mSequenceNumber) {
return;
}

auto snapshot = p->mSHM.MaybeGet();
if (!snapshot) {
return;
Vector3 hmdPosition {m.Translation()};
Quaternion hmdOrientation {Quaternion::CreateFromRotationMatrix(m)};

Vector3 rectPosition {vrConf.x, vrConf.floorY, vrConf.z};
auto rectOrientation
= Quaternion::CreateFromAxisAngle(Vector3::UnitX, vrConf.rx)
* Quaternion::CreateFromAxisAngle(Vector3::UnitY, vrConf.ry)
* Quaternion::CreateFromAxisAngle(Vector3::UnitZ, vrConf.rz);

p->mZoomed = RayIntersectsRect(
hmdPosition,
hmdOrientation,
rectPosition,
rectOrientation,
{
(p->mZoomed ? p->mZoomedWidth : p->mWidth) * vrConf.gazeTargetHorizontalScale,
vrConf.height * (p->mZoomed ? vrConf.zoomScale : 1) * vrConf.gazeTargetVerticalScale
}
);
}

const auto config = snapshot.GetConfig();
const auto& vrConf = config.vr;

const auto aspectRatio = float(config.imageWidth) / config.imageHeight;
p->mWidth = vrConf.height * aspectRatio;
p->mZoomedWidth = p->mWidth * vrConf.zoomScale;

CHECK(
SetOverlayWidthInMeters,
p->mOverlay,
p->mZoomed ? p->mZoomedWidth : p->mWidth);

if (p->mSequenceNumber == snapshot.GetSequenceNumber()) {
return;
}

// clang-format off
auto transform =
Matrix::CreateRotationX(vrConf.rx)
Expand Down
1 change: 1 addition & 0 deletions src/app/app-winui3/CMakeLists.txt
Expand Up @@ -21,6 +21,7 @@ set(
OpenKneeboard-DXResources
OpenKneeboard-GameEvent
OpenKneeboard-GetSystemColor
OpenKneeboard-RayIntersectsRect
OpenKneeboard-RuntimeFiles
OpenKneeboard-SHM
OpenKneeboard-UTF8
Expand Down

0 comments on commit 64b5656

Please sign in to comment.