Skip to content

Commit ba4f70d

Browse files
committed
Add Riding height offset; Cleanup Settings
1 parent c49eb6f commit ba4f70d

3 files changed

Lines changed: 115 additions & 72 deletions

File tree

src/hooking/camera.cpp

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ static glm::mat4 calculateProjectionMatrix(float nearZ, float farZ, const XrFovf
7474
static glm::fvec3 ApplyCameraModeEyePosPolicy(glm::fvec3 eyePos, CameraMode cameraMode) {
7575
if (cameraMode == CameraMode::ORIGINAL) {
7676
eyePos.y = 0.0f;
77+
78+
auto gameState = VRManager::instance().XR->m_gameState.load();
79+
if (gameState.is_riding_mount) {
80+
eyePos.y += GetSettings().GetOriginalRidingVerticalOffset();
81+
}
7782
}
7883

7984
return eyePos;
@@ -177,23 +182,25 @@ void CemuHooks::hook_UpdateCameraForGameplay(PPCInterpreter_t* hCPU) {
177182
s_wsCameraPosition = oldCameraPosition;
178183
s_wsCameraRotation = glm::quat_cast(glm::inverse(existingGameMtx));
179184

180-
// rebase the rotation to the player position
181-
if (IsFirstPerson()) {
182-
// check if player is swimming
183-
Player actor;
184-
readMemory(s_playerAddress, &actor);
185+
// check if player is swimming
186+
Player actor;
187+
readMemory(s_playerAddress, &actor);
185188

186-
PlayerMoveBitFlags moveBits = actor.moveBitFlags.getLE();
187-
s_isSwimming = HAS_FLAG(moveBits, PlayerMoveBitFlags::IS_SWIMMING_OR_CLIMBING | PlayerMoveBitFlags::IS_SWIMMING);
188-
s_isCrouching = HAS_FLAG(moveBits, PlayerMoveBitFlags::IS_CROUCHING);
189+
PlayerMoveBitFlags moveBits = actor.moveBitFlags.getLE();
190+
s_isSwimming = HAS_FLAG(moveBits, PlayerMoveBitFlags::IS_SWIMMING_OR_CLIMBING | PlayerMoveBitFlags::IS_SWIMMING);
191+
s_isCrouching = HAS_FLAG(moveBits, PlayerMoveBitFlags::IS_CROUCHING);
189192

190-
// Todo: move those and their hooks in controls.cpp ?
191-
auto gameState = VRManager::instance().XR->m_gameState.load();
192-
// Unreliable flag, need to investigate
193-
gameState.is_climbing = HAS_FLAG(moveBits, PlayerMoveBitFlags::IS_SWIMMING_OR_CLIMBING | PlayerMoveBitFlags::IS_CLIMBING_WALL) || s_isLadderClimbing == 2;
194-
gameState.is_riding_mount = (s_isRiding == 2 || s_isRidingSandSeal == 2) ? true : false;
195-
gameState.is_paragliding = HAS_FLAG(moveBits, PlayerMoveBitFlags::IS_GLIDER_ACTIVE);
196-
VRManager::instance().XR->m_gameState.store(gameState);
193+
// Todo: move those and their hooks in controls.cpp ?
194+
auto gameState = VRManager::instance().XR->m_gameState.load();
195+
// Unreliable flag, need to investigate
196+
gameState.is_climbing = HAS_FLAG(moveBits, PlayerMoveBitFlags::IS_SWIMMING_OR_CLIMBING | PlayerMoveBitFlags::IS_CLIMBING_WALL) || s_isLadderClimbing == 2;
197+
gameState.is_riding_mount = (s_isRiding == 2 || s_isRidingSandSeal == 2) ? true : false;
198+
gameState.is_paragliding = HAS_FLAG(moveBits, PlayerMoveBitFlags::IS_GLIDER_ACTIVE);
199+
VRManager::instance().XR->m_gameState.store(gameState);
200+
201+
// rebase the rotation to the player position
202+
if (IsFirstPerson()) {
203+
197204

198205
auto now = std::chrono::steady_clock::now();
199206
std::chrono::milliseconds crouchLerpDuration{ 150 };
@@ -244,19 +251,21 @@ void CemuHooks::hook_UpdateCameraForGameplay(PPCInterpreter_t* hCPU) {
244251
if (s_isLadderClimbing > 0) {
245252
s_isLadderClimbing--;
246253
}
247-
if (s_isRiding > 0) {
248-
s_isRiding--;
249-
}
250-
if (s_isRidingSandSeal > 0) {
251-
s_isRidingSandSeal--;
252-
}
254+
253255

254256
s_wasCrouching = s_isCrouching;
255257

256258
glm::mat4 playerMtx4 = glm::inverse(glm::translate(glm::identity<glm::mat4>(), playerPos) * glm::mat4(s_wsCameraRotation));
257259
existingGameMtx = playerMtx4;
258260
}
259261

262+
if (s_isRiding > 0) {
263+
s_isRiding--;
264+
}
265+
if (s_isRidingSandSeal > 0) {
266+
s_isRidingSandSeal--;
267+
}
268+
260269
// current VR headset camera matrix
261270
auto viewsOpt = VRManager::instance().XR->GetRenderer()->GetMiddlePose();
262271
if (!viewsOpt) {
@@ -1122,7 +1131,7 @@ void CemuHooks::hook_PlayerIsRiding(PPCInterpreter_t* hCPU) {
11221131
hCPU->instructionPointer = hCPU->sprNew.LR;
11231132

11241133
bool isRiding = hCPU->gpr[3] == 1;
1125-
if (isRiding && IsFirstPerson()) {
1134+
if (isRiding && (IsFirstPerson() || GetSettings().GetCameraMode() == CameraMode::ORIGINAL)) {
11261135
s_isRiding = 2;
11271136
}
11281137
}
@@ -1131,7 +1140,7 @@ void CemuHooks::hook_PlayerIsRidingSandSeal(PPCInterpreter_t* hCPU) {
11311140
hCPU->instructionPointer = hCPU->sprNew.LR;
11321141

11331142
bool isRiding = hCPU->gpr[3] == 1;
1134-
if (isRiding && IsFirstPerson()) {
1143+
if (isRiding && (IsFirstPerson() || GetSettings().GetCameraMode() == CameraMode::ORIGINAL)) {
11351144
s_isRidingSandSeal = 2;
11361145
}
11371146
}

src/rendering/vulkan_imgui.cpp

Lines changed: 60 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ void RND_Renderer::ImGuiOverlay::Render(long frameIdx, bool renderBackground) {
374374
};
375375

376376
if (renderBackground || CemuHooks::UseBlackBarsDuringEvents()) {
377-
const bool shouldCrop3DTo16_9 = GetSettings().cropFlatTo16x9 == 1;
377+
const bool shouldCrop3DTo16_9 = GetSettings().ShouldFlatPreviewBeCroppedTo16x9();
378378

379379
bool shouldRender3DBackground = VRManager::instance().XR->GetRenderer()->IsRendering3D(frameIdx) || CemuHooks::UseBlackBarsDuringEvents();
380380
bool shouldRenderHUDWithAlpha = shouldRender3DBackground && !CemuHooks::UseBlackBarsDuringEvents();
@@ -738,8 +738,16 @@ void RND_Renderer::ImGuiOverlay::DrawHelpMenu() {
738738
ImGui::PopStyleColor();
739739
if (cameraMode == CameraMode::THIRD_PERSON || cameraMode == CameraMode::ORIGINAL) {
740740
DrawSettingRow("Camera Distance", [&]() {
741-
settings.thirdPlayerDistance.AddSliderToGUI(&changed, 0.5f, 0.65f);
741+
settings.thirdPlayerDistance.AddSliderToGUI(&changed, 0.5f, 1.0f);
742742
});
743+
744+
if (cameraMode == CameraMode::ORIGINAL) {
745+
DrawSettingRow("Riding Vertical Offset", [&]() {
746+
settings.originalRidingVerticalOffset.AddToGUI(&changed, windowWidth.x, 0.0f, 1.0f, [](float value) {
747+
return std::format("{:+.2f}m", value);
748+
});
749+
});
750+
}
743751
}
744752
else {
745753
DrawSettingRow("Height Offset", [&]() {
@@ -784,9 +792,11 @@ void RND_Renderer::ImGuiOverlay::DrawHelpMenu() {
784792
});
785793
}
786794

787-
DrawSettingRow("Black Bars In Third-Person Cutscenes", [&]() {
788-
settings.useBlackBarsForCutscenes.AddToGUI(&changed);
789-
});
795+
if (cameraMode != CameraMode::ORIGINAL) {
796+
DrawSettingRow("Black Bars In Third-Person Cutscenes", [&]() {
797+
settings.useBlackBarsForCutscenes.AddToGUI(&changed);
798+
});
799+
}
790800

791801
DrawSettingRow("Stereo Depth In Cutscenes", [&]() {
792802
settings.cutsceneStereoDepthScale.AddToGUI(&changed, windowWidth.x, 0.0f, 1.5f, [](float value) { return std::format("{:.2f}x", value); });
@@ -797,13 +807,50 @@ void RND_Renderer::ImGuiOverlay::DrawHelpMenu() {
797807
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyleColorVec4(ImGuiCol_HeaderActive));
798808
ImGui::Text("UI");
799809
ImGui::PopStyleColor();
800-
DrawSettingRow("UI Follows Where You Look", [&]() {
801-
settings.uiFollowsGaze.AddToGUI(&changed);
802-
});
810+
if (cameraMode != CameraMode::ORIGINAL) {
811+
DrawSettingRow("UI Follows Where You Look", [&]() {
812+
settings.uiFollowsGaze.AddToGUI(&changed);
813+
});
814+
}
803815

804816
ImGui::Spacing();
805817
DrawLayerSettingsRow("Menu/HUD Distance & Size", &changed, settings.hudDistance, settings.hudSize);
806818

819+
ImGui::Spacing();
820+
DrawSettingRow("Enable 3D Static Reticle", [&]() {
821+
settings.enableStaticReticle.AddToGUI(&changed);
822+
});
823+
824+
if (settings.enableStaticReticle.Get()) {
825+
DrawSettingRow("Reticle 3D Separation", [&]() {
826+
settings.staticReticlePixelOffsetPx.AddToGUI(&changed, windowWidth.x, 0.0f, 500.0f, [](float value) { return std::format("{:.1f} px", value); });
827+
});
828+
829+
DrawSettingRow("Reticle Radius", [&]() {
830+
settings.staticReticleRadiusPx.AddToGUI(&changed, windowWidth.x, 1.0f, 64.0f, [](float value) { return std::format("{:.1f} px", value); });
831+
});
832+
833+
DrawSettingRow("Reticle Thickness", [&]() {
834+
settings.staticReticleThicknessPx.AddToGUI(&changed, windowWidth.x, 1.0f, 8.0f, [](float value) { return std::format("{:.1f} px", value); });
835+
});
836+
837+
DrawSettingRow("Reticle Opacity", [&]() {
838+
settings.staticReticleOpacity.AddToGUI(&changed, windowWidth.x, 0.1f, 1.0f, [](float value) { return std::format("{:.2f}", value); });
839+
});
840+
841+
DrawSettingRow("Reticle Color R", [&]() {
842+
settings.staticReticleColorR.AddToGUI(&changed, windowWidth.x, 0.0f, 1.0f, [](float value) { return std::format("{:.2f}", value); });
843+
});
844+
845+
DrawSettingRow("Reticle Color G", [&]() {
846+
settings.staticReticleColorG.AddToGUI(&changed, windowWidth.x, 0.0f, 1.0f, [](float value) { return std::format("{:.2f}", value); });
847+
});
848+
849+
DrawSettingRow("Reticle Color B", [&]() {
850+
settings.staticReticleColorB.AddToGUI(&changed, windowWidth.x, 0.0f, 1.0f, [](float value) { return std::format("{:.2f}", value); });
851+
});
852+
}
853+
807854
ImGui::Spacing();
808855
if (cameraMode == CameraMode::FIRST_PERSON) {
809856
ImGui::Separator();
@@ -823,9 +870,11 @@ void RND_Renderer::ImGuiOverlay::DrawHelpMenu() {
823870
}
824871

825872
if (ImGui::CollapsingHeader("Advanced Settings")) {
826-
DrawSettingRow("Crop VR Image To 16:9 For Cemu Window", [&]() {
827-
settings.cropFlatTo16x9.AddToGUI(&changed);
828-
});
873+
if (cameraMode != CameraMode::ORIGINAL) {
874+
DrawSettingRow("Crop VR Image To 16:9 For Cemu Window", [&]() {
875+
settings.cropFlatTo16x9.AddToGUI(&changed);
876+
});
877+
}
829878

830879
DrawSettingRow("Show Debugging Overlays (for developers)", [&]() {
831880
settings.enableDebugOverlay.AddToGUI(&changed);
@@ -837,40 +886,6 @@ void RND_Renderer::ImGuiOverlay::DrawHelpMenu() {
837886
});
838887
}
839888

840-
DrawSettingRow("Enable 3D Static Reticle", [&]() {
841-
settings.enableStaticReticle.AddToGUI(&changed);
842-
});
843-
844-
if (settings.enableStaticReticle.Get()) {
845-
DrawSettingRow("Reticle 3D Separation", [&]() {
846-
settings.staticReticlePixelOffsetPx.AddToGUI(&changed, windowWidth.x, 0.0f, 500.0f, [](float value) { return std::format("{:.1f} px", value); });
847-
});
848-
849-
DrawSettingRow("Reticle Radius", [&]() {
850-
settings.staticReticleRadiusPx.AddToGUI(&changed, windowWidth.x, 1.0f, 64.0f, [](float value) { return std::format("{:.1f} px", value); });
851-
});
852-
853-
DrawSettingRow("Reticle Thickness", [&]() {
854-
settings.staticReticleThicknessPx.AddToGUI(&changed, windowWidth.x, 1.0f, 8.0f, [](float value) { return std::format("{:.1f} px", value); });
855-
});
856-
857-
DrawSettingRow("Reticle Opacity", [&]() {
858-
settings.staticReticleOpacity.AddToGUI(&changed, windowWidth.x, 0.1f, 1.0f, [](float value) { return std::format("{:.2f}", value); });
859-
});
860-
861-
DrawSettingRow("Reticle Color R", [&]() {
862-
settings.staticReticleColorR.AddToGUI(&changed, windowWidth.x, 0.0f, 1.0f, [](float value) { return std::format("{:.2f}", value); });
863-
});
864-
865-
DrawSettingRow("Reticle Color G", [&]() {
866-
settings.staticReticleColorG.AddToGUI(&changed, windowWidth.x, 0.0f, 1.0f, [](float value) { return std::format("{:.2f}", value); });
867-
});
868-
869-
DrawSettingRow("Reticle Color B", [&]() {
870-
settings.staticReticleColorB.AddToGUI(&changed, windowWidth.x, 0.0f, 1.0f, [](float value) { return std::format("{:.2f}", value); });
871-
});
872-
}
873-
874889
if (VRManager::instance().XR->m_capabilities.isOculusLinkRuntime) {
875890
DrawSettingRow("Angular Velocity Fixer", [&]() {
876891
settings.buggyAngularVelocity.AddComboToGUI(&changed, ModSettings::toDisplayString);

src/utils/mod_settings.h

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,8 @@ struct ModSettings {
650650
// playing mode settings
651651
EnumSetting<CameraMode> cameraMode = EnumSetting<CameraMode>("CameraMode", CameraMode::FIRST_PERSON, ModSettings::toString, { CameraMode::FIRST_PERSON, CameraMode::THIRD_PERSON, CameraMode::ORIGINAL });
652652
EnumSetting<PlayMode> playMode = EnumSetting<PlayMode>("PlayMode", PlayMode::STANDING, ModSettings::toString, { PlayMode::STANDING, PlayMode::SEATED });
653-
FloatSetting<float> thirdPlayerDistance = FloatSetting<float>("ThirdPlayerDistance", 0.5f, 0.0f);
653+
FloatSetting<float> thirdPlayerDistance = FloatSetting<float>("ThirdPlayerDistance", 0.5f, 0.0f, 1.0f);
654+
FloatSetting<float> originalRidingVerticalOffset = FloatSetting<float>("OriginalRidingVerticalOffset", 0.4f, 0.0f, 1.0f);
654655
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 });
655656
FloatSetting<float> gameplayStereoDepthScale = FloatSetting<float>("GameplayStereoDepthScale", kDefaultGameplayStereoDepthScale, 0.0f, 3.0f);
656657
FloatSetting<float> cutsceneStereoDepthScale = FloatSetting<float>("CutsceneStereoDepthScale", kDefaultCutsceneStereoDepthScale, 0.0f, 1.5f);
@@ -689,6 +690,7 @@ struct ModSettings {
689690
&cameraMode,
690691
&playMode,
691692
&thirdPlayerDistance,
693+
&originalRidingVerticalOffset,
692694
&cutsceneCameraMode,
693695
&gameplayStereoDepthScale,
694696
&cutsceneStereoDepthScale,
@@ -721,7 +723,12 @@ struct ModSettings {
721723
CameraMode GetCameraMode() const { return cameraMode; }
722724

723725
PlayMode GetPlayMode() const { return playMode; }
724-
bool DoesUIFollowGaze() const { return uiFollowsGaze; }
726+
bool DoesUIFollowGaze() const {
727+
if (GetCameraMode() == CameraMode::ORIGINAL) {
728+
return false;
729+
}
730+
return uiFollowsGaze;
731+
}
725732
bool IsLeftHanded() const { return leftHanded; }
726733
float GetPlayerHeightOffset() const {
727734
// disable height offset in third-person-style modes
@@ -740,8 +747,19 @@ struct ModSettings {
740747
}
741748
float GetGameplayStereoDepthScale() const { return gameplayStereoDepthScale; }
742749
float GetCutsceneStereoDepthScale() const { return cutsceneStereoDepthScale; }
743-
bool UseBlackBarsForCutscenes() const { return useBlackBarsForCutscenes; }
744-
bool ShouldFlatPreviewBeCroppedTo16x9() const { return cropFlatTo16x9 == 1; }
750+
float GetOriginalRidingVerticalOffset() const { return originalRidingVerticalOffset; }
751+
bool UseBlackBarsForCutscenes() const {
752+
if (GetCameraMode() == CameraMode::ORIGINAL) {
753+
return false;
754+
}
755+
return useBlackBarsForCutscenes;
756+
}
757+
bool ShouldFlatPreviewBeCroppedTo16x9() const {
758+
if (GetCameraMode() == CameraMode::ORIGINAL) {
759+
return true;
760+
}
761+
return cropFlatTo16x9 == 1;
762+
}
745763

746764
bool ShowDebugOverlay() const { return enableDebugOverlay; }
747765
AngularVelocityFixerMode AngularVelocityFixer_GetMode() const { return buggyAngularVelocity; }
@@ -753,6 +771,7 @@ struct ModSettings {
753771
std::string ToString() const {
754772
std::string buffer = "";
755773
std::format_to(std::back_inserter(buffer), " - Camera Mode: {}\n", toDisplayString(GetCameraMode()));
774+
std::format_to(std::back_inserter(buffer), " - Original Riding Vertical Offset: {:.2f}m\n", GetOriginalRidingVerticalOffset());
756775
std::format_to(std::back_inserter(buffer), " - Left Handed: {}\n", IsLeftHanded() ? "Yes" : "No");
757776
std::format_to(std::back_inserter(buffer), " - GUI Follow Setting: {}\n", DoesUIFollowGaze() ? "Follow Looking Direction" : "Fixed");
758777
std::format_to(std::back_inserter(buffer), " - Player Height: {} meters\n", GetPlayerHeightOffset());

0 commit comments

Comments
 (0)