protected override void PostPipelineStageCallback(CinemachineVirtualCameraBase vcam, CinemachineCore.Stage stage, ref CameraState state, float deltaTime) { CinemachineCollider.VcamExtraState vcamExtraState = null; if (stage == CinemachineCore.Stage.Body) { vcamExtraState = base.GetExtraState <CinemachineCollider.VcamExtraState>(vcam); vcamExtraState.targetObscured = false; vcamExtraState.colliderDisplacement = 0f; vcamExtraState.debugResolutionPath = null; } if (stage == CinemachineCore.Stage.Body && this.m_AvoidObstacles) { Vector3 vector = this.PreserveLignOfSight(ref state, ref vcamExtraState); if (this.m_Damping > 0f && deltaTime >= 0f) { Vector3 vector2 = vector - vcamExtraState.m_previousDisplacement; vector2 = Damper.Damp(vector2, this.m_Damping, deltaTime); vector = vcamExtraState.m_previousDisplacement + vector2; } vcamExtraState.m_previousDisplacement = vector; state.PositionCorrection += vector; vcamExtraState.colliderDisplacement += vector.magnitude; } if (stage == CinemachineCore.Stage.Aim) { vcamExtraState = base.GetExtraState <CinemachineCollider.VcamExtraState>(vcam); vcamExtraState.targetObscured = this.CheckForTargetObstructions(state); if (vcamExtraState.targetObscured) { state.ShotQuality *= 0.2f; } if (vcamExtraState.colliderDisplacement > 0f) { state.ShotQuality *= 0.8f; } float num = 0f; if (this.m_OptimalTargetDistance > 0f && state.HasLookAt) { float num2 = Vector3.Magnitude(state.ReferenceLookAt - state.FinalPosition); if (num2 <= this.m_OptimalTargetDistance) { float num3 = this.m_OptimalTargetDistance / 2f; if (num2 >= num3) { num = 0.2f * (num2 - num3) / (this.m_OptimalTargetDistance - num3); } } else { num2 -= this.m_OptimalTargetDistance; float num4 = this.m_OptimalTargetDistance * 3f; if (num2 < num4) { num = 0.2f * (1f - num2 / num4); } } state.ShotQuality *= 1f + num; } } }
private Vector3 PreserveLignOfSight(ref CameraState state, ref CinemachineCollider.VcamExtraState extra) { Vector3 result = Vector3.zero; if (state.HasLookAt) { Vector3 correctedPosition = state.CorrectedPosition; Vector3 referenceLookAt = state.ReferenceLookAt; Vector3 vector = correctedPosition; Vector3 vector2 = vector - referenceLookAt; float magnitude = vector2.magnitude; float num = Mathf.Max(this.m_MinimumDistanceFromTarget, 0.0001f); if (magnitude > num) { vector2.Normalize(); float num2 = magnitude - num; if (this.m_DistanceLimit > 0.0001f) { num2 = Mathf.Min(this.m_DistanceLimit, num2); } Ray ray = new Ray(vector - num2 * vector2, vector2); num2 += 0.001f; RaycastHit obstacle; if (num2 > 0.0001f && this.RaycastIgnoreTag(ray, out obstacle, num2)) { float distance = Mathf.Max(0f, obstacle.distance - 0.001f); vector = ray.GetPoint(distance); extra.AddPointToDebugPath(vector); if (this.m_Strategy != CinemachineCollider.ResolutionStrategy.PullCameraForward) { vector = this.PushCameraBack(vector, vector2, obstacle, referenceLookAt, new Plane(state.ReferenceUp, correctedPosition), magnitude, this.m_MaximumEffort, ref extra); } } } if (this.m_CameraRadius > 0.0001f) { vector += this.RespectCameraRadius(vector, state.ReferenceLookAt); } else if (this.mCameraColliderGameObject != null) { this.CleanupCameraCollider(); } result = vector - correctedPosition; } return(result); }
private Vector3 PushCameraBack(Vector3 currentPos, Vector3 pushDir, RaycastHit obstacle, Vector3 lookAtPos, Plane startPlane, float targetDistance, int iterations, ref CinemachineCollider.VcamExtraState extra) { Vector3 vector = Vector3.zero; if (!this.GetWalkingDirection(currentPos, pushDir, obstacle, ref vector)) { return(currentPos); } Ray ray = new Ray(currentPos, vector); float num = this.GetPushBackDistance(ray, startPlane, targetDistance, lookAtPos); if (num <= 0.0001f) { return(currentPos); } float num2 = this.ClampRayToBounds(ray, num, obstacle.collider.bounds); num = Mathf.Min(num, num2 + 0.001f); RaycastHit obstacle2; Vector3 vector2; if (this.RaycastIgnoreTag(ray, out obstacle2, num)) { float distance = obstacle2.distance - 0.001f; vector2 = ray.GetPoint(distance); extra.AddPointToDebugPath(vector2); if (iterations > 1) { vector2 = this.PushCameraBack(vector2, vector, obstacle2, lookAtPos, startPlane, targetDistance, iterations - 1, ref extra); } return(vector2); } vector2 = ray.GetPoint(num); vector = vector2 - lookAtPos; float magnitude = vector.magnitude; RaycastHit raycastHit; if (magnitude < 0.0001f || this.RaycastIgnoreTag(new Ray(lookAtPos, vector), out raycastHit, magnitude - 0.001f)) { return(currentPos); } ray = new Ray(vector2, vector); extra.AddPointToDebugPath(vector2); num = this.GetPushBackDistance(ray, startPlane, targetDistance, lookAtPos); if (num > 0.0001f) { if (!this.RaycastIgnoreTag(ray, out obstacle2, num)) { vector2 = ray.GetPoint(num); extra.AddPointToDebugPath(vector2); } else { float distance2 = obstacle2.distance - 0.001f; vector2 = ray.GetPoint(distance2); extra.AddPointToDebugPath(vector2); if (iterations > 1) { vector2 = this.PushCameraBack(vector2, vector, obstacle2, lookAtPos, startPlane, targetDistance, iterations - 1, ref extra); } } } return(vector2); }