Skip to content

Commit 13009fa

Browse files
committed
wip Roomscale: rotate player with HMD
1 parent 76ff5cc commit 13009fa

File tree

7 files changed

+79
-1
lines changed

7 files changed

+79
-1
lines changed

Code/Player.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,17 @@ void CPlayer::Update(SEntityUpdateContext& ctx, int updateSlot)
10131013
UpdateSounds(ctx.fFrameTime);
10141014
}
10151015

1016+
void CPlayer::ProcessRoomscaleMovement()
1017+
{
1018+
float hmdYaw = gVR->GetHmdYawOffset();
1019+
CMovementRequest mv;
1020+
mv.AddDeltaRotation(Ang3(0, 0, hmdYaw));
1021+
if (m_pMovementController->RequestMovement(mv))
1022+
{
1023+
gVR->UpdateReferenceYaw(hmdYaw);
1024+
}
1025+
}
1026+
10161027
void CPlayer::UpdateSounds(float fFrameTime)
10171028
{
10181029
if(IsClient())
@@ -1311,6 +1322,9 @@ void CPlayer::PrePhysicsUpdate()
13111322
}
13121323
}
13131324
}
1325+
1326+
if (m_linkStats.CanRotate() && g_pGameCVars->vr_enable_motion_controllers)
1327+
ProcessRoomscaleMovement();
13141328
}
13151329

13161330
bool client(IsClient());

Code/Player.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ class CPlayer :
369369
virtual void SetAuthority( bool auth );
370370
virtual void SerializeXML( XmlNodeRef& node, bool bLoading );
371371
virtual void Update(SEntityUpdateContext& ctx, int updateSlot);
372+
void ProcessRoomscaleMovement();
372373
virtual void PrePhysicsUpdate();
373374
virtual void UpdateView(SViewParams &viewParams);
374375
virtual void PostUpdateView(SViewParams &viewParams);

Code/PlayerMovement.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "PlayerInput.h"
1111
#include "GameActions.h"
1212
#include "NetInputChainDebug.h"
13+
#include "VR/VRManager.h"
1314

1415
#undef CALL_PLAYER_EVENT_LISTENERS
1516
#define CALL_PLAYER_EVENT_LISTENERS(func) \

Code/VR/OpenXRRuntime.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,13 @@ Matrix34 OpenXRRuntime::GetRenderEyeTransform(int eye) const
361361
return OpenXRToCrysis(m_renderViews[eye].pose.orientation, m_renderViews[eye].pose.position);
362362
}
363363

364+
Matrix44 OpenXRRuntime::GetHmdTransform() const
365+
{
366+
Matrix44 hmdTransform = GetRenderEyeTransform(0);
367+
hmdTransform = (hmdTransform + GetRenderEyeTransform(1)) * .5f;
368+
return hmdTransform;
369+
}
370+
364371
void OpenXRRuntime::GetFov(int eye, float& tanl, float& tanr, float& tant, float& tanb) const
365372
{
366373
tanl = tanf(m_renderViews[eye].fov.angleLeft);

Code/VR/OpenXRRuntime.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class OpenXRRuntime
2020
void Update();
2121

2222
Matrix34 GetRenderEyeTransform(int eye) const;
23+
Matrix44 GetHmdTransform() const;
2324
void GetFov(int eye, float& tanl, float& tanr, float& tant, float& tanb) const;
2425
Vec2i GetRecommendedRenderSize() const;
2526

Code/VR/VRManager.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ void VRManager::ModifyViewCamera(int eye, CCamera& cam)
245245
if (isCutscene)
246246
{
247247
maxDiff = g_pGameCVars->vr_cutscenes_angle_snap * g_PI / 180.f;
248+
if (g_pGameCVars->vr_cutscenes_2d)
249+
maxDiff = 0;
248250
if (yawDiff > maxDiff || yawDiff < -maxDiff)
249251
m_prevViewYaw = angles.z;
250252
}
@@ -272,7 +274,7 @@ void VRManager::ModifyViewCamera(int eye, CCamera& cam)
272274
Matrix34 viewMat;
273275
viewMat.SetRotationXYZ(angles, position);
274276

275-
Matrix34 eyeMat = gXR->GetRenderEyeTransform(eye);
277+
Matrix34 eyeMat = gVR->GetEyeTransform(eye);
276278
viewMat = viewMat * eyeMat;
277279

278280
cam.SetMatrix(viewMat);
@@ -368,6 +370,46 @@ RectF VRManager::GetEffectiveRenderLimits(int eye)
368370
return result;
369371
}
370372

373+
Matrix33 VRManager::GetReferenceTransform() const
374+
{
375+
Ang3 refAngles(0, 0, m_referenceYaw);
376+
return Matrix33::CreateRotationXYZ(refAngles).GetTransposed();
377+
}
378+
379+
Vec3 VRManager::GetHmdOffset() const
380+
{
381+
Vec3 position = gXR->GetHmdTransform().GetTranslation();
382+
return GetReferenceTransform() * (position - m_referencePosition);
383+
}
384+
385+
float VRManager::GetHmdYawOffset() const
386+
{
387+
Ang3 angles(gXR->GetHmdTransform());
388+
return angles.z - m_referenceYaw;
389+
}
390+
391+
void VRManager::UpdateReferenceOffset(const Vec3& offset)
392+
{
393+
// added offset is in player space, convert back to raw HMD space
394+
Vec3 rawOffset = GetReferenceTransform().GetTransposed() * offset;
395+
rawOffset.z = 0;
396+
m_referencePosition += rawOffset;
397+
}
398+
399+
void VRManager::UpdateReferenceYaw(float yaw)
400+
{
401+
m_referenceYaw += yaw;
402+
}
403+
404+
Matrix34 VRManager::GetEyeTransform(int eye) const
405+
{
406+
Matrix34 rawEye = gXR->GetRenderEyeTransform(eye);
407+
Vec3 position = GetReferenceTransform() * (rawEye.GetTranslation() - m_referencePosition);
408+
Ang3 angles(rawEye);
409+
angles.z -= m_referenceYaw;
410+
return Matrix34::CreateRotationXYZ(angles, position);
411+
}
412+
371413
void VRManager::InitDevice(IDXGISwapChain* swapchain)
372414
{
373415
m_hudTexture.Reset();

Code/VR/VRManager.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ class VRManager
3939

4040
RectF GetEffectiveRenderLimits(int eye);
4141

42+
Matrix33 GetReferenceTransform() const;
43+
Vec3 GetHmdOffset() const;
44+
float GetHmdYawOffset() const;
45+
46+
void UpdateReferenceOffset(const Vec3& offset);
47+
void UpdateReferenceYaw(float yaw);
48+
49+
Matrix34 GetEyeTransform(int eye) const;
50+
4251
private:
4352
bool m_initialized = false;
4453
ComPtr<ID3D10Device1> m_device;
@@ -59,6 +68,9 @@ class VRManager
5968
void CreateHUDTexture();
6069
void CreateSharedTexture(ComPtr<ID3D10Texture2D>& texture, ComPtr<ID3D11Texture2D>& texture11, int width, int height);
6170
void CopyBackbufferToTexture(ID3D10Texture2D *target);
71+
72+
Vec3 m_referencePosition;
73+
float m_referenceYaw = 0;
6274
};
6375

6476
extern VRManager* gVR;

0 commit comments

Comments
 (0)