Exemplo n.º 1
0
    void UpdateView()
    {
        if (inViewTransitioning)//The camera is sitll in transitioning
        {
            switch (cameraTranstioningType)
            {
            case CameraTransitioningType.MovementTransition:
                if (LerpCameraOneFrame(10f))
                {
                    inViewTransitioning = false;
                }
                else
                {
                    return;
                }
                break;

            case CameraTransitioningType.MoveInFadeOutTransition:
                switch (maskFadingStatus)
                {
                case MaskFadingStatus.Normal:
                    maskFadingStatus = MaskFadingStatus.FadingOut;
                    fadeTimer        = 0f;
                    return;

                case MaskFadingStatus.FadingOut:
                    fadeTimer += Time.deltaTime;
                    if (fadeTimer < 0.5f)
                    {
                        cameraMask.color = Color.Lerp(new Color(0, 0, 0, 0), new Color(0, 0, 0, 1), fadeTimer / 0.5f);
                        LerpCameraOneFrame(4f);
                    }
                    else
                    {
                        cameraMask.color = new Color(0, 0, 0, 1);
                        maskFadingStatus = MaskFadingStatus.Dark;
                        if (OnCameraDarkend != null)
                        {
                            OnCameraDarkend();
                        }
                        if (currentViewParameter.initialPosition != null)
                        {
                            transform.position = currentViewParameter.initialPosition.Value;
                        }
                        if (currentViewParameter.initialRotation != null)
                        {
                            transform.rotation = currentViewParameter.initialRotation.Value;
                        }
                        ownedCamera.transform.localPosition = new Vector3(-currentViewParameter.cameraXOffset, 0f, -currentViewParameter.cameraZOffset);
                        if (currentViewParameter.viewContentType == ViewContentType.Model3DView)
                        {
                            ownedCamera.cullingMask = modelViewMask;
                        }
                        else
                        {
                            ownedCamera.cullingMask = panoramaMask;
                        }
                        ownedCamera.fieldOfView = 60f;
                    }
                    return;

                case MaskFadingStatus.Dark:
                    if (currentViewParameter.FadeInFlag == null || currentViewParameter.FadeInFlag())
                    {
                        maskFadingStatus = MaskFadingStatus.FadingIn;
                        fadeTimer        = 0f;
                    }
                    return;

                case MaskFadingStatus.FadingIn:
                    fadeTimer += Time.deltaTime;
                    if (fadeTimer < 0.5f)
                    {
                        cameraMask.color = Color.Lerp(new Color(0, 0, 0, 1), new Color(0, 0, 0, 0), fadeTimer / 0.5f);
                    }
                    else
                    {
                        cameraMask.color    = new Color(0, 0, 0, 0);
                        maskFadingStatus    = MaskFadingStatus.Normal;
                        inViewTransitioning = false;
                        break;
                    }
                    return;

                default: break;
                }
                break;

            case CameraTransitioningType.FadeInMoveOutTranstion:
                switch (maskFadingStatus)
                {
                case MaskFadingStatus.Normal:
                    maskFadingStatus = MaskFadingStatus.FadingOut;
                    fadeTimer        = 0f;
                    return;

                case MaskFadingStatus.FadingOut:
                    fadeTimer += Time.deltaTime;
                    if (fadeTimer < 0.5f)
                    {
                        cameraMask.color = Color.Lerp(new Color(0, 0, 0, 0), new Color(0, 0, 0, 1), fadeTimer / 0.5f);
                    }
                    else
                    {
                        cameraMask.color = new Color(0, 0, 0, 1);
                        maskFadingStatus = MaskFadingStatus.Dark;
                        if (OnCameraDarkend != null)
                        {
                            OnCameraDarkend();
                        }
                        if (currentViewParameter.viewContentType == ViewContentType.Model3DView)
                        {
                            ownedCamera.cullingMask = modelViewMask;
                        }
                        else
                        {
                            ownedCamera.cullingMask = panoramaMask;
                        }
                    }
                    return;

                case MaskFadingStatus.Dark:
                    if (currentViewParameter.FadeInFlag == null || currentViewParameter.FadeInFlag())
                    {
                        maskFadingStatus = MaskFadingStatus.FadingIn;
                        fadeTimer        = 0f;
                    }
                    return;

                case MaskFadingStatus.FadingIn:
                    fadeTimer += Time.deltaTime;
                    var lerpStable = LerpCameraOneFrame(8f);
                    if (fadeTimer < 0.5f)
                    {
                        cameraMask.color = Color.Lerp(new Color(0, 0, 0, 1), new Color(0, 0, 0, 0), fadeTimer / 0.5f);
                    }
                    else if (lerpStable)
                    {
                        cameraMask.color    = new Color(0, 0, 0, 0);
                        maskFadingStatus    = MaskFadingStatus.Normal;
                        inViewTransitioning = false;
                        break;
                    }
                    return;

                default: break;
                }
                break;

            case CameraTransitioningType.FadeoutFadeinTranstioning:
                switch (maskFadingStatus)
                {
                case MaskFadingStatus.Normal:
                    maskFadingStatus = MaskFadingStatus.FadingOut;
                    fadeTimer        = 0f;
                    return;

                case MaskFadingStatus.FadingOut:
                    fadeTimer += Time.deltaTime;
                    if (fadeTimer < 0.5f)
                    {
                        cameraMask.color = Color.Lerp(new Color(0, 0, 0, 0), new Color(0, 0, 0, 1), fadeTimer / 0.5f);
                    }
                    else
                    {
                        cameraMask.color = new Color(0, 0, 0, 1);
                        maskFadingStatus = MaskFadingStatus.Dark;
                        if (OnCameraDarkend != null)
                        {
                            OnCameraDarkend();
                        }
                        if (currentViewParameter.initialPosition != null)
                        {
                            transform.position = currentViewParameter.initialPosition.Value;
                        }
                        if (currentViewParameter.initialRotation != null)
                        {
                            transform.rotation = currentViewParameter.initialRotation.Value;
                        }

                        //Reset all camera status
                        ownedCamera.transform.localPosition = new Vector3(-currentViewParameter.cameraXOffset, 0f, -currentViewParameter.cameraZOffset);
                        if (currentViewParameter.viewContentType == ViewContentType.Model3DView)
                        {
                            ownedCamera.cullingMask = modelViewMask;
                        }
                        else
                        {
                            ownedCamera.cullingMask = panoramaMask;
                        }
                        ownedCamera.fieldOfView = 60f;
                    }
                    return;

                case MaskFadingStatus.Dark:
                    if (currentViewParameter.FadeInFlag == null || currentViewParameter.FadeInFlag())
                    {
                        maskFadingStatus = MaskFadingStatus.FadingIn;

                        fadeTimer = 0f;
                    }
                    return;

                case MaskFadingStatus.FadingIn:
                    fadeTimer += Time.deltaTime;
                    if (fadeTimer < 0.5f)
                    {
                        cameraMask.color = Color.Lerp(new Color(0, 0, 0, 1), new Color(0, 0, 0, 0), fadeTimer / 0.5f);
                    }
                    else
                    {
                        cameraMask.color    = new Color(0, 0, 0, 0);
                        maskFadingStatus    = MaskFadingStatus.Normal;
                        inViewTransitioning = false;
                        break;
                    }
                    return;

                default: break;
                }
                break;

            default: break;
            }
        }

        //is a scale operation
        if (currentViewParameter.cameraScaleMode != CameraScaleMode.None && !viewFreezed)
        {
            if (lastScaleInput > 1f || currentScaleInput > 1f)
            {
                moveSpeedX = 0f;
                moveSpeedY = 0f;
            }

            if (lastScaleInput > 1f && currentScaleInput > 1f)
            {
                float deltaScale = currentScaleInput - lastScaleInput;
                switch (currentViewParameter.cameraScaleMode)
                {
                case CameraScaleMode.ScaleFov:
                    ownedCamera.fieldOfView -= 0.04f * deltaScale;
                    ownedCamera.fieldOfView  = Mathf.Clamp(ownedCamera.fieldOfView, 30f, 60f);
                    break;

                case CameraScaleMode.MoveCamera:
                    Vector3 t = ownedCamera.transform.localPosition;
                    t.z += 0.02f * deltaScale;
                    t.z  = Mathf.Clamp(t.z, -currentViewParameter.cameraZOffset, -currentViewParameter.cameraZOffset * 0.65f);
                    ownedCamera.transform.localPosition = t;
                    break;

                default: break;
                }
                return;
            }
            else if (lastScaleInput > 1f || currentScaleInput > 1f)
            {
                return;
            }
        }

        if (currentViewParameter.viewContentType == ViewContentType.PanoramaView)//Panorama view
        {
            if (touched)
            {
                float boost = 1.5f;
                moveX = -deltaXThisFrame * (ownedCamera.fieldOfView / 60f) * boost / 4;
                moveY = -deltaYThisFrame * (ownedCamera.fieldOfView / 60f) * boost / 4;
            }
            else
            {
                float delta = 1 + lnLamda * Time.deltaTime + (lnLamda * Time.deltaTime) * (lnLamda * Time.deltaTime) / 2f;//Taylor equation for f(x)=c^x
                moveSpeedX = delta * moveSpeedX;
                moveSpeedY = delta * moveSpeedY;
                if (Mathf.Abs(moveSpeedX) < 0.01f)
                {
                    moveSpeedX = 0;
                }

                if (Mathf.Abs(moveSpeedY) < 0.01f)
                {
                    moveSpeedY = 0f;
                }

                moveX = -moveSpeedX * Time.deltaTime / 4;
                moveY = -moveSpeedY * Time.deltaTime / 4;
            }
        }
        else//model view
        {
            if (deltaXThisFrame == 0f && deltaYThisFrame == 0f)
            {
                return;
            }
            moveX = deltaXThisFrame;
            moveY = deltaYThisFrame;
        }

        //Camera movement control
        Vector3 eulerAngles = transform.rotation.eulerAngles;

        if (!viewFreezed)
        {
            if (currentViewParameter.viewMode == CameraViewMode.HorizontalFreeView)
            {
                eulerAngles += new Vector3(0, moveX, 0);
            }
            if (currentViewParameter.viewMode == CameraViewMode.FreeView)
            {
                eulerAngles += new Vector3(-moveY, moveX, 0);
                float x = eulerAngles.x;
                if (x > 270)
                {
                    x -= 360f;
                }
                x             = Mathf.Clamp(x, -60f, 60f);
                eulerAngles.x = x;
            }
            if (currentViewParameter.viewMode == CameraViewMode.HorizontalHalfFreeView)
            {
                eulerAngles += new Vector3(-moveY, moveX, 0);
                float t = eulerAngles.x;
                if (t > 270)
                {
                    t -= 360f;
                }
                t             = Mathf.Clamp(t, 5f, 60f);
                eulerAngles.x = t;
            }
            if (currentViewParameter.viewMode == CameraViewMode.HorizontalSlideView)
            {
                Vector3 dif = transform.position - initialPosition.Value;
                dif  += new Vector3(-moveX * slideViewSensitivity / 9f, 0, 0);
                dif.x = Mathf.Clamp(dif.x, -slideViewRange, slideViewRange);
                transform.position = initialPosition.Value + dif;
            }
            transform.rotation = Quaternion.Euler(eulerAngles);
        }
    }