diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 0cb3ba60b7..638e1fd1fc 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -65,6 +65,9 @@ struct UserSettings { // Controls ConfigVar enableTurboKeybind; + + // VR + ConfigVar vrCamera; } game; }; diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index b2a5709736..d2d7fa1aac 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -23,6 +23,10 @@ #include #include +#if TARGET_PC +#include "dusk/settings.h" +#endif + #if DEBUG #include "d/d_debug_pad.h" #include "d/d_debug_camera.h" @@ -1355,6 +1359,20 @@ bool dCamera_c::Run() { clrFlag(0x1000); mTagCamTool.Clr(); field_0x89c.Clr(); + +#if TARGET_PC + if (dusk::getSettings().game.vrCamera && link != nullptr) { + MtxP headMtx = link->getHeadMtx(); + cXyz headForward(headMtx[0][0], headMtx[1][0], headMtx[2][0]); + + // place eye slightly in front of Link's eye position, looking forward + static constexpr f32 EYE_FORWARD_OFFSET = 20.0f; + static constexpr f32 CENTER_DISTANCE = 200.0f; + mEye = mViewCache.mEye = link->eyePos + headForward * EYE_FORWARD_OFFSET; + mCenter = mViewCache.mCenter = mEye + headForward * CENTER_DISTANCE; + } +#endif + return sp0F; } diff --git a/src/dusk/imgui/ImGuiMenuEnhancements.cpp b/src/dusk/imgui/ImGuiMenuEnhancements.cpp index e9404e2476..119cd14143 100644 --- a/src/dusk/imgui/ImGuiMenuEnhancements.cpp +++ b/src/dusk/imgui/ImGuiMenuEnhancements.cpp @@ -136,6 +136,15 @@ namespace dusk { ImGui::EndMenu(); } + if (ImGui::BeginMenu("VR")) { + config::ImGuiCheckbox("VR Camera", getSettings().game.vrCamera); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Places the camera at Link's eyes, facing where his head points"); + } + + ImGui::EndMenu(); + } + ImGui::EndMenu(); } } diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 32c6a5beb4..24838a9691 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -53,6 +53,8 @@ UserSettings g_userSettings = { // Controls .enableTurboKeybind {"game.enableTurboKeybind", true}, + + .vrCamera {"game.vrCamera", false} }, }; @@ -95,6 +97,7 @@ void registerSettings() { Register(g_userSettings.game.midnasLamentNonStop); Register(g_userSettings.game.enableTurboKeybind); Register(g_userSettings.game.fastSpinner); + Register(g_userSettings.game.vrCamera); } // Transient settings