From 566c7ee801ca1960b3bb11d034629d2f2f2c9de6 Mon Sep 17 00:00:00 2001 From: nightfallstorm <109926124+Nightfallstorm@users.noreply.github.com> Date: Tue, 16 Apr 2024 19:52:15 -0400 Subject: [PATCH] RE BSOpenVR --- include/RE/B/BSOpenVR.h | 28 +++++----- include/RE/B/BSVRInterface.h | 94 +++++++++++++++++++++++++--------- include/RE/J/JournalMenu.h | 8 ++- include/RE/N/NiAVObject.h | 2 +- include/RE/P/PlayerCharacter.h | 8 +-- include/RE/T/TESCameraState.h | 7 ++- include/RE/U/UI.h | 6 +++ 7 files changed, 108 insertions(+), 45 deletions(-) diff --git a/include/RE/B/BSOpenVR.h b/include/RE/B/BSOpenVR.h index 4bd370526..eec5fb2da 100644 --- a/include/RE/B/BSOpenVR.h +++ b/include/RE/B/BSOpenVR.h @@ -48,10 +48,10 @@ namespace RE void Unk_11(void) override; // 11 - { return 0; } void Unk_12(void) override; // 12 void Unk_13() override; // 13 - void Unk_14(void) override; // 14 + NiPointer* GetControllerNode(RE::NiPointer& a_out, Hand a_hand) override; // 14 void Unk_15(void) override; // 15 - { return 0; } HMDDeviceType GetHMDDeviceType() override; // 16 - { return hmdDeviceType; } - void Unk_17(void) override; // 17 + NiPointer* CreateControllerNode(RE::NiPointer& a_out, Hand a_hand) override; // 17 static BSOpenVR* GetSingleton(); @@ -62,18 +62,18 @@ namespace RE static vr::IVRSystem* GetIVRSystem(); // members - vr::IVRSystem* vrSystem; // 208 - void* unk210; // 210 - std::uint64_t unk218; // 218 - std::uint64_t unk220; // 220 - std::uint64_t unk228; // 228 - RE::NiPointer unk230; // 230 - name is SIMPLE_NORMAL_MAP - Unk238 unk238[4]; // 238 - std::uint64_t unk338; // 380 - std::uint64_t unk340[9]; // 340 - RE::NiPointer unk388[2]; // 388 - HMDDeviceType hmdDeviceType; // 398 - Set by comparing TrackedSystemName to "lighthouse", "oculus" and "holographic". Defaults to "lighthouse" if none match - NiTransform eyeToHeadTransform[2]; // 39C - 0 is left eye, 1 is right eye + vr::IVRSystem* vrSystem; // 208 + void* unk210; // 210 + std::uint64_t unk218; // 218 + std::uint64_t unk220; // 220 + std::uint64_t unk228; // 228 + NiPointer unk230; // 230 - name is SIMPLE_NORMAL_MAP + Unk238 unk238[4]; // 238 + std::uint64_t unk338; // 380 + std::uint64_t unk340[9]; // 340 + NiPointer controllerNodes[Hand::kTotal]; // 388 - Cloned for PlayerCharacter's LeftValveIndexControllerNode/RightValveIndexControllerNode + HMDDeviceType hmdDeviceType; // 398 - Set by comparing TrackedSystemName to "lighthouse", "oculus" and "holographic". Defaults to "lighthouse" if none match + NiTransform eyeToHeadTransform[2]; // 39C - 0 is left eye, 1 is right eye private: KEEP_FOR_RE() }; diff --git a/include/RE/B/BSVRInterface.h b/include/RE/B/BSVRInterface.h index f4943a3b3..64105aa12 100644 --- a/include/RE/B/BSVRInterface.h +++ b/include/RE/B/BSVRInterface.h @@ -3,6 +3,8 @@ #ifdef SKYRIMVR # include "RE/B/BSTEvent.h" +# include "RE/N/NiNode.h" +# include "RE/N/NiSmartPointer.h" # include "RE/N/NiTransform.h" # include "openvr.h" @@ -27,6 +29,52 @@ namespace RE kHolographics // used for sDriverWindowsMR:VR? }; + enum Hand : std::uint32_t + { + kLeft, + kRight, + kTotal + }; + + struct Unk118 + { +# pragma pack(push, 4) + struct PoseTransform + { + // Status based on openvr's ETrackingResult. Calibrated/uninitialized = kNotRunning + enum class TrackingStatus : std::uint32_t + { + kNotRunning, + kRunningOk, + kOutOfRange + }; + + TrackingStatus poseStatus; // 00 + NiTransform renderPoseTransform; // 04 + NiTransform gamePoseTransform; // 38 + }; + static_assert(sizeof(PoseTransform) == 0x6C); +# pragma pack(pop) + + // members + Unk118* unk00; // 00 + Unk118* unk08; // 08 + Unk118* unk10; // 10 + std::uint8_t unk18; // 18 + bool unk19; // 19 + std::uint16_t unk1A; // 18 + std::uint32_t poseIndex; // 1C + PoseTransform* poseTransform; // 20 + std::uint64_t unk28; // 28 + std::uint64_t unk30; // 30 + std::uint64_t unk38; // 38 + std::uint64_t unk40; // 40 + std::uint64_t unk48; // 48 + std::uint64_t unk50; // 50 + NiTransform unk58; // 58 + }; + static_assert(sizeof(Unk118) == 0x90); + struct Unk190 { // members @@ -58,7 +106,7 @@ namespace RE virtual void GetProjectionRaw(vr::EVREye eEye, float* pfLeft, float* pfRight, float* pfTop, float* pfBottom); // 08 virtual NiTransform* GetEyeToHeadTransform(NiTransform& a_out, bool getRightEye); // 09 virtual NiTransform* Unk_0A(NiTransform& a_out, bool getRightController, bool a_unk1); // 0A - virtual void Unk_0B(void); // 0B + virtual void Unk_0B(void); // 0B - Processes events? virtual vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForHMD(); // 0C virtual vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForHand(bool getRightHand); // 0D virtual void TriggerHapticPulse(bool doRightController, float duration); // 0E @@ -67,32 +115,32 @@ namespace RE virtual void Unk_11(void); // 11 virtual void Unk_12(void); // 12 virtual void Unk_13(void); // 13 - virtual void Unk_14(void); // 14 + virtual RE::NiPointer* GetControllerNode(RE::NiPointer& a_out, Hand a_hand); // 14 virtual void Unk_15(void); // 15 virtual HMDDeviceType GetHMDDeviceType(); // 16 - virtual void Unk_17(void); // 17 + virtual RE::NiPointer* CreateControllerNode(RE::NiPointer& a_out, Hand a_hand); // 17 // members - std::uint8_t unk110; // 110 - void* unk118; // 118 - std::uint64_t unk120; // 120 - NiTransform unk128; // 128 - NiTransform unk15C; // 15C - Unk190* unk190; // 190 - std::uint64_t unk198; // 198 - std::uint64_t unk1A0; // 1A0 - std::uint64_t unk1A8; // 1A8 - vr::IVROverlay* ivrOverlay; // 1B0 - std::uint64_t unk1B8; // 1B8 - std::uint64_t unk1C0; // 1C0 - std::uint64_t unk1C8; // 1C8 - std::uint64_t unk1D0; // 1D0 - std::uint64_t unk1D8; // 1D8 - std::uint64_t unk1E0; // 1E0 - std::uint64_t unk1E8; // 1E8 - std::uint64_t unk1F0; // 1F0 - vr::VROverlayHandle_t unk1F8; // 1F8 - current overlay handle? Used in 2D overlay menus like JournalMenu - std::byte unk200; // 200 + std::uint8_t unk110; // 110 + Unk118* unk118; // 118 - Possibily a data structure for storing pose data? + std::uint64_t unk120; // 120 + NiTransform renderTransform; // 128 - Headset pose render transform + NiTransform gameTransform; // 15C - Headset pose game transform + Unk190* unk190; // 190 + std::uint64_t unk198; // 198 + std::uint64_t unk1A0; // 1A0 + std::uint64_t unk1A8; // 1A8 + vr::IVROverlay* ivrOverlay; // 1B0 + std::uint64_t unk1B8; // 1B8 + std::uint64_t unk1C0; // 1C0 + std::uint64_t unk1C8; // 1C8 + std::uint64_t unk1D0; // 1D0 + std::uint64_t unk1D8; // 1D8 + std::uint64_t unk1E0; // 1E0 + std::uint64_t unk1E8; // 1E8 + std::uint64_t unk1F0; // 1F0 + vr::VROverlayHandle_t unk1F8; // 1F8 - current overlay handle? Used in 2D overlay menus like JournalMenu + bool isHeadsetTrackingOk; // 200 - Headset is active and skyrim is receiving tracking data private: KEEP_FOR_RE() }; diff --git a/include/RE/J/JournalMenu.h b/include/RE/J/JournalMenu.h index e8a30d778..04ede86e4 100644 --- a/include/RE/J/JournalMenu.h +++ b/include/RE/J/JournalMenu.h @@ -46,13 +46,17 @@ namespace RE Journal_SystemTab systemTab; // 98 std::uint64_t unkD0; // D0 std::uint64_t unkD8; // D8 - std::uint64_t unkE0; // E0 + bool unkE0; // E0 +#ifdef SKYRIMVR + std::uint64_t unkF8; // F8 + std::uint64_t unk100; // 100 +#endif private: KEEP_FOR_RE() }; #ifndef SKYRIMVR static_assert(sizeof(JournalMenu) == 0xE8); #else - //static_assert(sizeof(JournalMenu) == 0x108); + static_assert(sizeof(JournalMenu) == 0x108); #endif } diff --git a/include/RE/N/NiAVObject.h b/include/RE/N/NiAVObject.h index 99a21bf3a..45c14f6ea 100644 --- a/include/RE/N/NiAVObject.h +++ b/include/RE/N/NiAVObject.h @@ -103,7 +103,7 @@ namespace RE // add virtual void UpdateControllers(NiUpdateData& a_data); // 25 #ifdef SKYRIMVR - virtual void Unk_VRFunc(void); + virtual void ApplyLocalTransformToWorld(); #endif virtual void PerformOp(PerformOpFunc& a_func); // 26 virtual void AttachProperty(NiAlphaProperty* a_property); // 27 - { return; } diff --git a/include/RE/P/PlayerCharacter.h b/include/RE/P/PlayerCharacter.h index 78a3a4a2a..dd5612df7 100644 --- a/include/RE/P/PlayerCharacter.h +++ b/include/RE/P/PlayerCharacter.h @@ -684,7 +684,8 @@ namespace RE NiPointer PrimaryMagicOffsetNode; // 538 NiPointer PrimaryMagicAimNode; // 540 NiPointer PrimaryStaffMagicOffsetNode; // 548 - std::uint64_t unk550; // 550 + std::uint32_t unk550; // 550 - left hand for something? + std::uint32_t unk554; // 554 - right hand for something? NiPointer CrosshairParent; // 558 NiPointer CrosshairSecondaryParent; // 560 NiPointer TargetLockParent; // 568 @@ -699,7 +700,8 @@ namespace RE std::uint32_t unk5B0; // 5B0 std::uint32_t unk5B4; // 5B4 std::uint64_t unk5B8; // 5B8 - std::uint64_t unk5C0; // 5C0 + std::uint32_t unk5C0; // 5C0 + std::uint32_t unk5C4; // 5C4 NiPointer BowAimNode; // 5C8 NiPointer BowRotationNode; // 5D0 NiPointer ArrowSnapNode; // 5D8 @@ -708,7 +710,7 @@ namespace RE std::uint64_t unk5F0; // 5F0 NiPointer ArrowHoldOffsetNode; // 5F8 NiPointer ArrowHoldNode; // 600 - std::uint64_t unk608; // 608 + NiPointer unk608; // 608 float unkFloat610; // 610 std::uint32_t unk614; // 614 std::uint64_t unk618; // 618 diff --git a/include/RE/T/TESCameraState.h b/include/RE/T/TESCameraState.h index d34f3a775..9361a3f77 100644 --- a/include/RE/T/TESCameraState.h +++ b/include/RE/T/TESCameraState.h @@ -21,8 +21,11 @@ namespace RE virtual ~TESCameraState(); // 00 // add - virtual void Begin(); // 01 - { return; } - virtual void End(); // 02 - { return; } + virtual void Begin(); // 01 - { return; } + virtual void End(); // 02 - { return; } +#ifdef SKYRIMVR + virtual void Unk_03(); // 03 - Directly calls Update +#endif virtual void Update(BSTSmartPointer& a_nextState); // 03 virtual void GetRotation(NiQuaternion& a_rotation); // 04 virtual void GetTranslation(NiPoint3& a_translation); // 05 diff --git a/include/RE/U/UI.h b/include/RE/U/UI.h index e81b412c1..059f0bf02 100644 --- a/include/RE/U/UI.h +++ b/include/RE/U/UI.h @@ -134,11 +134,17 @@ namespace RE bool closingAllMenus; // 1C1 std::uint16_t pad1C2; // 1C2 std::uint32_t pad1C4; // 1C4 +#ifdef SKYRIMVR + std::uint32_t unk1C8; // 1C8 + std::uint32_t unk1CA; // 1CA +#endif private: KEEP_FOR_RE() }; #ifndef SKYRIMVR static_assert(sizeof(UI) == 0x1C8); +#else + static_assert(sizeof(UI) == 0x1D0); #endif template