From 0d673e5bbc03a948b1b2b090cb421076ce7b24ed Mon Sep 17 00:00:00 2001 From: NotAKidoS <37721153+NotAKidOnSteam@users.noreply.github.com> Date: Sat, 24 Jun 2023 14:10:12 -0500 Subject: [PATCH] [PlaySpaceScaleFix] Add comments cause I forget ez --- PlaySpaceScaleFix/HarmonyPatches.cs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/PlaySpaceScaleFix/HarmonyPatches.cs b/PlaySpaceScaleFix/HarmonyPatches.cs index 6c5e6cc..94d6d60 100644 --- a/PlaySpaceScaleFix/HarmonyPatches.cs +++ b/PlaySpaceScaleFix/HarmonyPatches.cs @@ -7,6 +7,16 @@ namespace NAK.PlaySpaceScaleFix.HarmonyPatches; class PlayerSetupPatches { + /** + + Store vrCamera position before vrRig is scaled. + Use new vrCamera position after vrRig is scaled to get an offset. + + Use offset on _PlayerLocal object to keep player in place. + Calculate scale difference, use to scale the avatars local position to keep avatar in place. + + **/ + [HarmonyPrefix] [HarmonyPatch(typeof(PlayerSetup), nameof(PlayerSetup.SetPlaySpaceScale))] static void Prefix_PlayerSetup_SetPlaySpaceScale(ref PlayerSetup __instance, ref Vector3 __state) @@ -19,9 +29,11 @@ class PlayerSetupPatches [HarmonyPatch(typeof(PlayerSetup), nameof(PlayerSetup.SetPlaySpaceScale))] static void Postfix_PlayerSetup_SetPlaySpaceScale(ref PlayerSetup __instance, ref Vector3 __state) { + // DesktopVRSwitch might allow an offset other than 0,0,0 for the vrCamera in Desktop + // Safest to just not run this patch if in Desktop, as Desktop doesn't have an offset at all anyways if (!PlaySpaceScaleFix.EntryEnabled.Value || !MetaPort.Instance.isUsingVr) return; - + Vector3 newPosition = __instance.vrCamera.transform.position; newPosition.y = __instance.transform.position.y; @@ -33,8 +45,10 @@ class PlayerSetupPatches // Scale avatar local position to keep avatar in place if (__instance._avatar != null) { - Vector3 scaleDifference = __instance.DivideVectors(__instance._avatar.transform.localScale, __instance.lastScale); - __instance._avatar.transform.localPosition = Vector3.Scale(__instance._avatar.transform.localPosition, scaleDifference); + // This calculation done in PlayerSetup.CheckUpdateAvatarScaleToPlaySpaceRelation already, but using Initial scale. + // We only need difference between last and current scale for scaling the localposition. + Vector3 scaleDifferenceNotInitial = __instance.DivideVectors(__instance._avatar.transform.localScale, __instance.lastScale); + __instance._avatar.transform.localPosition = Vector3.Scale(__instance._avatar.transform.localPosition, scaleDifferenceNotInitial); } } } \ No newline at end of file