Esempio n. 1
0
    public Vector2 GetCameraPosition()
    {
        CinemachineVirtualCamera vcam = cam.virtualCam;

        Cinemachine.CameraState state = vcam.State;
        return(state.CorrectedPosition);
    }
    static int get_State(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            Cinemachine.CinemachineVirtualCamera obj = (Cinemachine.CinemachineVirtualCamera)o;
            Cinemachine.CameraState ret = obj.State;
            ToLua.PushValue(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o, "attempt to index State on a nil value"));
        }
    }
    protected override void PostPipelineStageCallback(CinemachineVirtualCameraBase vcam, CinemachineCore.Stage stage, ref Cinemachine.CameraState state, float deltaTime)
    {
        if (!Application.isPlaying || stage != CinemachineCore.Stage.Finalize)
        {
            return;
        }

        if (segmentCamera)
        {
            segmentCamera.background.UpdateBackgroundPosition(state.CorrectedPosition);
        }
    }
        /// <summary>Callback to do the collision resolution and shot evaluation</summary>
        protected override void PostPipelineStageCallback(
            CinemachineVirtualCameraBase vcam,
            CinemachineCore.Stage stage, ref CameraState state, float deltaTime)
        {
            VcamExtraState extra = null;

            if (stage == CinemachineCore.Stage.Body)
            {
                extra = GetExtraState <VcamExtraState>(vcam);
                extra.targetObscured       = false;
                extra.colliderDisplacement = 0;
                if (extra.debugResolutionPath != null)
                {
                    extra.debugResolutionPath.RemoveRange(0, extra.debugResolutionPath.Count);
                }
            }

            // Move the body before the Aim is calculated
            if (stage == CinemachineCore.Stage.Body)
            {
                if (m_AvoidObstacles)
                {
                    Vector3 displacement = Vector3.zero;
                    displacement = PreserveLignOfSight(ref state, ref extra);
                    if (m_MinimumOcclusionTime > Epsilon)
                    {
                        float now = Time.timeSinceLevelLoad;
                        if (displacement.sqrMagnitude < Epsilon)
                        {
                            extra.occlusionStartTime = 0;
                        }
                        else
                        {
                            if (extra.occlusionStartTime <= 0)
                            {
                                extra.occlusionStartTime = now;
                            }
                            if (now - extra.occlusionStartTime < m_MinimumOcclusionTime)
                            {
                                displacement = extra.m_previousDisplacement;
                            }
                        }
                    }

                    // Apply distance smoothing
                    if (m_SmoothingTime > Epsilon)
                    {
                        Vector3 pos      = state.CorrectedPosition + displacement;
                        Vector3 dir      = pos - state.ReferenceLookAt;
                        float   distance = dir.magnitude;
                        if (distance > Epsilon)
                        {
                            dir /= distance;
                            if (!displacement.AlmostZero())
                            {
                                extra.UpdateDistanceSmoothing(distance, m_SmoothingTime);
                            }
                            distance      = extra.ApplyDistanceSmoothing(distance, m_SmoothingTime);
                            displacement += (state.ReferenceLookAt + dir * distance) - pos;
                        }
                    }

                    float damping = m_Damping;
                    if (displacement.AlmostZero())
                    {
                        extra.ResetDistanceSmoothing(m_SmoothingTime);
                    }
                    else
                    {
                        damping = m_DampingWhenOccluded;
                    }
                    if (damping > 0 && deltaTime >= 0)
                    {
                        Vector3 delta = displacement - extra.m_previousDisplacement;
                        delta        = Damper.Damp(delta, damping, deltaTime);
                        displacement = extra.m_previousDisplacement + delta;
                    }
                    extra.m_previousDisplacement = displacement;
                    Vector3 correction = RespectCameraRadius(state.CorrectedPosition + displacement, ref state);
                    if (damping > 0 && deltaTime >= 0)
                    {
                        Vector3 delta = correction - extra.m_previousDisplacementCorrection;
                        delta      = Damper.Damp(delta, damping, deltaTime);
                        correction = extra.m_previousDisplacementCorrection + delta;
                    }
                    displacement += correction;
                    extra.m_previousDisplacementCorrection = correction;
                    state.PositionCorrection   += displacement;
                    extra.colliderDisplacement += displacement.magnitude;
                }
            }
            // Rate the shot after the aim was set
            if (stage == CinemachineCore.Stage.Aim)
            {
                extra = GetExtraState <VcamExtraState>(vcam);
                extra.targetObscured = IsTargetOffscreen(state) || CheckForTargetObstructions(state);

                // GML these values are an initial arbitrary attempt at rating quality
                if (extra.targetObscured)
                {
                    state.ShotQuality *= 0.2f;
                }
                if (extra.colliderDisplacement > 0)
                {
                    state.ShotQuality *= 0.8f;
                }

                float       nearnessBoost = 0;
                const float kMaxNearBoost = 0.2f;
                if (m_OptimalTargetDistance > 0 && state.HasLookAt)
                {
                    float distance = Vector3.Magnitude(state.ReferenceLookAt - state.FinalPosition);
                    if (distance <= m_OptimalTargetDistance)
                    {
                        float threshold = m_OptimalTargetDistance / 2;
                        if (distance >= threshold)
                        {
                            nearnessBoost = kMaxNearBoost * (distance - threshold)
                                            / (m_OptimalTargetDistance - threshold);
                        }
                    }
                    else
                    {
                        distance -= m_OptimalTargetDistance;
                        float threshold = m_OptimalTargetDistance * 3;
                        if (distance < threshold)
                        {
                            nearnessBoost = kMaxNearBoost * (1f - (distance / threshold));
                        }
                    }
                    state.ShotQuality *= (1f + nearnessBoost);
                }
            }
        }