Exemplo n.º 1
0
        //remade the whole function because the original function would otherwise throw an exception
        internal static void CameraRigController_SetCameraState(On.RoR2.CameraRigController.orig_SetCameraState orig, CameraRigController self, CameraState cameraState)
        {
            if (Main.FirstPerson.Value)
            {
                if (Run.instance)
                {
                    if (self.cameraMode == CameraRigController.CameraMode.PlayerBasic)
                    {
                        var characterbody     = self?.localUserViewer?.cachedBody;
                        var characterposition = characterbody?.corePosition;
                        if (characterposition.HasValue)
                        {
                            var direction = characterbody.GetComponent <CharacterDirection>();
                            var offset    = Vector3.zero;
                            if (direction)
                            {
                                offset = direction.transform.up * 0.1f * Main.Height.Value + direction.forward * 0.1f * Main.forwards.Value;
                            }

                            cameraState.position = (Vector3)characterposition + offset;
                        }
                    }
                }
            }
            currentstate(cameraState, self);
            float   d        = (self.localUserViewer == null) ? 1f : self.localUserViewer.userProfile.screenShakeScale;
            Vector3 position = cameraState.position;

            if (shouldShake)
            {
                shake(self, cameraState);
            }
            Vector3 vector    = self.rawScreenShakeDisplacement * d;
            Vector3 position2 = position + vector;

            if (vector != Vector3.zero)
            {
                Vector3 origin    = position;
                Vector3 direction = vector;
                if (Physics.SphereCast(origin, self.sceneCam.nearClipPlane, direction, out RaycastHit raycastHit, vector.magnitude, LayerIndex.world.mask, QueryTriggerInteraction.Ignore))
                {
                    position2 = position + vector.normalized * raycastHit.distance;
                }
            }
            self.transform.SetPositionAndRotation(position2, cameraState.rotation);
            fov(self, cameraState);
            if (self.sceneCam)
            {
                self.sceneCam.fieldOfView = cameraState.fov;
            }
        }
Exemplo n.º 2
0
        private static void SetCameraStateOverride(On.RoR2.CameraRigController.orig_SetCameraState orig, CameraRigController self, CameraState cameraState)
        {
            if (Run.instance)
            {
                if (self.cameraMode is RoR2.CameraModes.CameraModePlayerBasic)
                {
                    if (ModConfig.InitialFirstPersonValue)
                    {
                        if (!VRCameraWrapper.instance)
                        {
                            GameObject wrapperObject = new GameObject("VR Camera Rig");
                            VRCameraWrapper.instance = wrapperObject.AddComponent <VRCameraWrapper>();
                            VRCameraWrapper.instance.Init(self);
                        }

                        if (!self.cameraMode.IsSpectating(self) && self.cameraModeContext.targetInfo.isViewerControlled && self.targetBody)
                        {
                            VRCameraWrapper.instance.UpdateRotation(cameraState);
                            cameraState.rotation = self.sceneCam.transform.rotation;
                        }

                        if (self.targetBody.IsLocalBody())
                        {
                            if (!cachedCameraTargetTransform)
                            {
                                if (!ModConfig.InitialRoomscaleValue)
                                {
                                    ChildLocator childLocator = self.targetBody.modelLocator.modelTransform.GetComponent <ChildLocator>();
                                    if (childLocator)
                                    {
                                        cachedCameraTargetTransform = childLocator.FindChild("VRCamera");
                                    }
                                }

                                if (!cachedCameraTargetTransform)
                                {
                                    cachedCameraTargetTransform = new GameObject("VRCamera").transform;
                                    cachedCameraTargetTransform.SetParent(self.targetBody.transform);
                                    cachedCameraTargetTransform.localPosition = Vector3.zero;
                                    cachedCameraTargetTransform.localRotation = Quaternion.identity;

                                    CapsuleCollider collider = self.targetBody.GetComponent <CapsuleCollider>();

                                    if (collider)
                                    {
                                        if (ModConfig.InitialRoomscaleValue)
                                        {
                                            cachedCameraTargetTransform.Translate(collider.center + new Vector3(0, -collider.height / 2, 0), Space.Self);
                                        }
                                        else
                                        {
                                            cachedCameraTargetTransform.Translate(collider.center + new Vector3(0, collider.height / 2, 0), Space.Self);
                                        }
                                        VRCameraWrapper.instance.transform.localScale = Vector3.one * (collider.height / ModConfig.PlayerHeight.Value);
                                    }
                                }
                            }

                            VRCameraWrapper.instance.transform.position = self.hasOverride ? cameraState.position : cachedCameraTargetTransform.position;
                        }
                    }
                }

                if (!self.targetBody.IsLocalBody() && (SceneCatalog.mostRecentSceneDef.sceneType == SceneType.Stage || SceneCatalog.mostRecentSceneDef.sceneType == SceneType.Intermission) && Run.instance.livingPlayerCount > 0)
                {
                    if (!spectatorCamera)
                    {
                        Camera cameraReference = Camera.main;

                        bool cameraReferenceEnabled = cameraReference.enabled;
                        if (cameraReferenceEnabled)
                        {
                            cameraReference.enabled = false;
                        }
                        bool cameraReferenceActive = cameraReference.gameObject.activeSelf;
                        if (cameraReferenceActive)
                        {
                            cameraReference.gameObject.SetActive(false);
                        }

                        spectatorCamera = GameObject.Instantiate(cameraReference.gameObject, null);

                        Component[] components = spectatorCamera.GetComponents <Component>();

                        foreach (Component component in components)
                        {
                            if (!(component is Transform) && !(component is Camera) && !(component is PostProcessLayer) && !(component is RoR2.PostProcess.SobelCommandBuffer && !(component is ThreeEyedGames.DecaliciousRenderer)))
                            {
                                Component.Destroy(component);
                            }
                        }

                        spectatorCameraComponent = spectatorCamera.GetComponent <Camera>();
                        spectatorCameraComponent.stereoTargetEye = StereoTargetEyeMask.None;
                        spectatorCameraComponent.targetTexture   = spectatorCameraPrefab.GetComponent <Camera>().targetTexture;

                        if (cameraReferenceActive != cameraReference.gameObject.activeSelf)
                        {
                            cameraReference.gameObject.SetActive(cameraReferenceActive);
                        }
                        if (cameraReferenceEnabled != cameraReference.enabled)
                        {
                            cameraReference.enabled = cameraReferenceEnabled;
                        }

                        spectatorCamera.SetActive(true);
                        spectatorCameraComponent.enabled = true;
                        UnityEngine.XR.XRDevice.DisableAutoXRCameraTracking(spectatorCameraComponent, true);
                    }

                    if (!spectatorScreen)
                    {
                        spectatorScreen = GameObject.Instantiate(spectatorScreenPrefab, null);
                        Utils.SetLayerRecursive(spectatorScreen, LayerIndex.ui.intVal);
                        spectatorScreen.transform.rotation = Quaternion.Euler(new Vector3(0, self.uiCam.transform.eulerAngles.y, 0));
                        spectatorScreen.transform.position = self.uiCam.transform.position + spectatorScreen.transform.forward * 2;
                    }

                    spectatorCamera.transform.position   = cameraState.position;
                    spectatorCamera.transform.rotation   = cameraState.rotation;
                    spectatorCameraComponent.fieldOfView = cameraState.fov;
                }
                else
                {
                    if (spectatorCamera)
                    {
                        GameObject.Destroy(spectatorCamera);
                    }

                    if (spectatorScreen)
                    {
                        GameObject.Destroy(spectatorScreen);
                    }
                }
            }

            orig(self, cameraState);
        }