Skip to content

Commit fb3c6a3

Browse files
committed
Add Auto-Depth for cutscenes/events
1 parent 219786e commit fb3c6a3

3 files changed

Lines changed: 40 additions & 0 deletions

File tree

src/hooking/camera.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,25 @@ static glm::fvec3 ApplyCameraModeEyeOffsetPolicy(const glm::fquat& baseYaw, cons
9595
return baseYaw * eyePos;
9696
}
9797

98+
static float GetStereoDepthScaleForCurrentContext() {
99+
if (CemuHooks::HasActiveCutscene()) {
100+
return GetSettings().GetCutsceneStereoDepthScale();
101+
}
102+
103+
return GetSettings().GetGameplayStereoDepthScale();
104+
}
105+
106+
static glm::fvec3 ApplyStereoDepthScalePolicy(const glm::fvec3& eyePos) {
107+
auto middlePoseOpt = VRManager::instance().XR->GetRenderer()->GetMiddlePose();
108+
if (!middlePoseOpt.has_value()) {
109+
return eyePos;
110+
}
111+
112+
const glm::fvec3 middleEyePos = glm::fvec3(middlePoseOpt.value()[3]);
113+
const float depthScale = GetStereoDepthScaleForCurrentContext();
114+
return middleEyePos + (eyePos - middleEyePos) * depthScale;
115+
}
116+
98117
static void SetLookAtCameraVectorsFromPose(BESeadLookAtCamera& camera, const glm::vec3& position, const glm::fquat& rotation) {
99118
const glm::vec3 forward = glm::normalize(rotation * glm::fvec3(0.0f, 0.0f, -1.0f));
100119
const glm::vec3 up = glm::normalize(rotation * glm::fvec3(0.0f, 1.0f, 0.0f));
@@ -379,6 +398,7 @@ void CemuHooks::hook_GetRenderCamera(PPCInterpreter_t* hCPU) {
379398
glm::fquat eyeRot = ToGLM(currPoseOpt.value().orientation);
380399

381400
CameraMode cameraMode = GetSettings().GetCameraMode();
401+
eyePos = ApplyStereoDepthScalePolicy(eyePos);
382402
eyePos = ApplyCameraModeEyePosPolicy(eyePos, cameraMode);
383403

384404
glm::vec3 newPos = basePos + ApplyCameraModeEyeOffsetPolicy(baseYaw, baseRot, eyePos, cameraMode);
@@ -608,6 +628,7 @@ void CemuHooks::hook_ModifyProjectionUsingCamera(PPCInterpreter_t* hCPU) {
608628
glm::fquat eyeRot = ToGLM(currPoseOpt.value().orientation);
609629

610630
CameraMode cameraMode = GetSettings().GetCameraMode();
631+
eyePos = ApplyStereoDepthScalePolicy(eyePos);
611632
eyePos = ApplyCameraModeEyePosPolicy(eyePos, cameraMode);
612633

613634
glm::vec3 newPos = basePos + ApplyCameraModeEyeOffsetPolicy(baseYaw, baseRot, eyePos, cameraMode);
@@ -714,6 +735,7 @@ std::pair<glm::vec3, glm::fquat> CemuHooks::CalculateVRWorldPose(const BESeadLoo
714735
glm::fquat eyeRot = ToGLM(currPoseOpt.value().orientation);
715736

716737
CameraMode cameraMode = GetSettings().GetCameraMode();
738+
eyePos = ApplyStereoDepthScalePolicy(eyePos);
717739
eyePos = ApplyCameraModeEyePosPolicy(eyePos, cameraMode);
718740

719741
glm::vec3 newPos = basePos + ApplyCameraModeEyeOffsetPolicy(baseYaw, baseRot, eyePos, cameraMode);

src/rendering/vulkan_imgui.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,10 @@ void RND_Renderer::ImGuiOverlay::DrawHelpMenu() {
768768
//});
769769
}
770770

771+
DrawSettingRow("Stereo Depth In Gameplay", [&]() {
772+
settings.gameplayStereoDepthScale.AddToGUI(&changed, windowWidth.x, 0.0f, 3.0f, [](float value) { return std::format("{:.2f}x", value); });
773+
});
774+
771775
ImGui::Spacing();
772776
ImGui::Separator();
773777
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyleColorVec4(ImGuiCol_HeaderActive));
@@ -784,6 +788,10 @@ void RND_Renderer::ImGuiOverlay::DrawHelpMenu() {
784788
settings.useBlackBarsForCutscenes.AddToGUI(&changed);
785789
});
786790

791+
DrawSettingRow("Stereo Depth In Cutscenes", [&]() {
792+
settings.cutsceneStereoDepthScale.AddToGUI(&changed, windowWidth.x, 0.0f, 1.5f, [](float value) { return std::format("{:.2f}x", value); });
793+
});
794+
787795
ImGui::Spacing();
788796
ImGui::Separator();
789797
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyleColorVec4(ImGuiCol_HeaderActive));

src/utils/mod_settings.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,8 @@ struct ModSettings {
640640

641641
static constexpr float kDefaultAxisThreshold = 0.5f;
642642
static constexpr float kDefaultStickDeadzone = 0.15f;
643+
static constexpr float kDefaultGameplayStereoDepthScale = 1.0f;
644+
static constexpr float kDefaultCutsceneStereoDepthScale = 0.25f;
643645
static constexpr float kDefaultReticlePixelOffsetPx = 100.0f;
644646
static constexpr float kDefaultReticleRadiusPx = 15.0f;
645647
static constexpr float kDefaultReticleThicknessPx = 2.0f;
@@ -650,6 +652,8 @@ struct ModSettings {
650652
EnumSetting<PlayMode> playMode = EnumSetting<PlayMode>("PlayMode", PlayMode::STANDING, ModSettings::toString, { PlayMode::STANDING, PlayMode::SEATED });
651653
FloatSetting<float> thirdPlayerDistance = FloatSetting<float>("ThirdPlayerDistance", 0.5f, 0.0f);
652654
EnumSetting<EventMode> cutsceneCameraMode = EnumSetting<EventMode>("CutsceneCameraMode", EventMode::FOLLOW_DEFAULT_EVENT_SETTINGS, ModSettings::toString, { EventMode::ALWAYS_FIRST_PERSON, EventMode::FOLLOW_DEFAULT_EVENT_SETTINGS, EventMode::ALWAYS_THIRD_PERSON });
655+
FloatSetting<float> gameplayStereoDepthScale = FloatSetting<float>("GameplayStereoDepthScale", kDefaultGameplayStereoDepthScale, 0.0f, 3.0f);
656+
FloatSetting<float> cutsceneStereoDepthScale = FloatSetting<float>("CutsceneStereoDepthScale", kDefaultCutsceneStereoDepthScale, 0.0f, 1.5f);
653657
BoolSetting useBlackBarsForCutscenes = BoolSetting("UseBlackBarsForCutscenes", false);
654658

655659
// first-person settings
@@ -686,6 +690,8 @@ struct ModSettings {
686690
&playMode,
687691
&thirdPlayerDistance,
688692
&cutsceneCameraMode,
693+
&gameplayStereoDepthScale,
694+
&cutsceneStereoDepthScale,
689695
&useBlackBarsForCutscenes,
690696
&playerHeightOffset,
691697
&leftHanded,
@@ -732,6 +738,8 @@ struct ModSettings {
732738
}
733739
return cutsceneCameraMode;
734740
}
741+
float GetGameplayStereoDepthScale() const { return gameplayStereoDepthScale; }
742+
float GetCutsceneStereoDepthScale() const { return cutsceneStereoDepthScale; }
735743
bool UseBlackBarsForCutscenes() const { return useBlackBarsForCutscenes; }
736744
bool ShouldFlatPreviewBeCroppedTo16x9() const { return cropFlatTo16x9 == 1; }
737745

@@ -758,6 +766,8 @@ struct ModSettings {
758766
std::format_to(std::back_inserter(buffer), " - Static Reticle Opacity: {:.2f}\n", staticReticleOpacity.Get());
759767
std::format_to(std::back_inserter(buffer), " - Static Reticle Color: ({:.2f}, {:.2f}, {:.2f})\n", staticReticleColorR.Get(), staticReticleColorG.Get(), staticReticleColorB.Get());
760768
std::format_to(std::back_inserter(buffer), " - Cutscene Camera Mode: {}\n", toDisplayString(GetCutsceneCameraMode()));
769+
std::format_to(std::back_inserter(buffer), " - Stereo Depth (Gameplay): {:.2f}x\n", GetGameplayStereoDepthScale());
770+
std::format_to(std::back_inserter(buffer), " - Stereo Depth (Cutscenes): {:.2f}x\n", GetCutsceneStereoDepthScale());
761771
std::format_to(std::back_inserter(buffer), " - Show Black Bars for Third-Person Cutscenes: {}\n", UseBlackBarsForCutscenes() ? "Yes" : "No");
762772
std::format_to(std::back_inserter(buffer), " - Performance Overlay: {}\n", toDisplayString(performanceOverlay));
763773
std::format_to(std::back_inserter(buffer), " - Performance Overlay Frequency: {} Hz\n", performanceOverlayFrequency.Get());

0 commit comments

Comments
 (0)