using System;
using System.Collections;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.EventSystems;
//using UnityEngine.InputSystem.UI;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
using UnityEngine.UI;
using UnityEngine.Video;
using Random = UnityEngine.Random;
namespace Beyond
{
public class MenuScroll : MonoBehaviour
{
private const float dimAlpha = 0.5f;
private const string bgColorName = "_BaseColor";
///
/// Input that is used to pass touch/click events from/to 3D scroll
///
/// [
///
// public UVInputModule m_uvInputModule;
// public StandaloneInputModule playerInput;
public EventSystem eventSystem;
///
/// Animates scroll opening and closing
///
public Animator m_scrollAnimator;
///
/// Canvas used to render 2D scroll elements
///
public Canvas m_canvas;
// public Camera m_CanvasCamera;
public Camera m_CanvasCamera;
public Camera m_ScrollCamera;
private Camera m_mainCamera;
public bool m_burnIn = false;
public bool m_isOpen = false;
public float m_burnInDelay = 0.23f;
public float m_moveInTime = 0.85f;
public float m_bgFadeDuration = 0.35f;
public const float m_defaultBurnTime = 0.25f;
public float openCloseBurnTime = 0.8f;
private const float constantDeltaTime = 0.01666667f;
public float m_burnThreshold;
public bool m_dimElements = false;
[Tooltip("Motion curve for first move in")]
public AnimationCurve m_MotionCurve;
public AnimationCurve m_BurnInOutCurve, m_BurnChangeCurve;
private AnimationCurve m_CurrentBurnCurve;
public Vector3 m_startPositionShift = new Vector3(-3f, 0f, 0f);
private Vector3 m_startPosition;
private Vector3 m_endPosition;
private Transform m_scrollTransform;
//this material is used to animate page effect
public Material m_scrollMat;
[SerializeField] private Texture openCloseTexture, changeTexture;
private Material m_bgScrollMat;
[SerializeField] private Renderer m_bgRenderer;
private Volume m_volume;
public VolumeProfile m_volumeProfile;
private VolumeProfile m_defaultProfile;
public event Action OnOpened, OnClosed, OnNewCanvaBurnStart, OnNewCanvaBurnEnd, OnNewCanvaBurnMiddle;
public SubmenuElementsContainer m_currentlyOpenedElementsContainer;
public GameObject m_currentCanva;
[SerializeField] private Texture m_RTTexture;
private void ActivateObjects(bool activate)
{
m_canvas.gameObject.SetActive(activate);
m_CanvasCamera.gameObject.SetActive(activate);
m_ScrollCamera.gameObject.SetActive(activate);
if (m_volume && m_volumeProfile != null)
m_volume.profile = activate ? m_volumeProfile : m_defaultProfile;
}
private void BlockUI(bool block)
{
Debug.Log("MenuScroll: BlockUI " + block);
HideUI.InvokeSetActiveUI(!block);
/*
if (m_uvInputModule != null)
{
Debug.Log("MenuScroll: Enable UV input module ");
m_uvInputModule.enabled = block;
}
if (playerInput)
{
playerInput.enabled = !block;
Debug.Log("MenuScroll: block player input ");
}
*/
}
protected virtual void OnScrollOpened()
{
}
protected virtual void OnScrollClosed()
{
}
public void SetupCamera()
{
m_mainCamera = Camera.main;
/*
var mainCameraData = m_mainCamera.GetUniversalAdditionalCameraData();
mainCameraData.cameraStack.Add(m_ScrollCamera);
var scrollCameraData = m_ScrollCamera.GetUniversalAdditionalCameraData();
scrollCameraData.renderType = CameraRenderType.Overlay;
*/
}
public void DisableMainCamera(bool disable)
{
m_mainCamera.enabled = !disable;
/*
var scrollCameraData = m_ScrollCamera.GetUniversalAdditionalCameraData();
if (disable)
{
scrollCameraData.renderType = CameraRenderType.Base;
m_mainCamera.enabled = false;
}
else
{
scrollCameraData.renderType = CameraRenderType.Overlay;
//var mainCameraData = Camera.main.GetUniversalAdditionalCameraData();
//mainCameraData.cameraStack.Add(m_ScrollCamera);
m_mainCamera.enabled = true;
}
*/
}
public void OpenScroll()
{
StartCoroutine(OpenScrollCoroutine());
}
[Button]
public void OpenCloseScroll(bool open)
{
if (open)
StartCoroutine(OpenAndBurnIn());
else
StartCoroutine(CloseAndBurnOut());
}
private IEnumerator OpenScrollCoroutine()
{
yield return StartCoroutine(OpenAndBurnIn());
}
private IEnumerator OpenScrollCoroutine(SubmenuElementsContainer canvaToEnable)
{
m_currentlyOpenedElementsContainer = canvaToEnable;
List interactables = m_currentlyOpenedElementsContainer.interactableCanvas;
if (m_dimElements)
{
interactables.ForEach(group => group.alpha = dimAlpha);
}
yield return StartCoroutine(OpenScrollCoroutine());
if (m_dimElements)
{
interactables.ForEach(group => group.alpha = 1f);
}
}
private IEnumerator OpenAndBurnIn()
{
BlockUI(true);
ActivateObjects(true);
SetBurnInTh(0f);
OnOpened?.Invoke();
eventSystem.enabled = false;
float time = 0f;
float val = 0f;
while (time < m_moveInTime)
{
time += constantDeltaTime;
val = time / m_moveInTime;
val = m_MotionCurve.Evaluate(val);
float bgVal = time / m_bgFadeDuration;
m_bgScrollMat.SetColor(bgColorName, new Color(0, 0, 0, bgVal));
m_scrollTransform.localPosition = m_startPosition - m_startPositionShift * val;
yield return new WaitForSecondsRealtime(constantDeltaTime);
}
//Camera.main.enabled = false;
m_scrollAnimator.SetBool("Open", true);
yield return new WaitForSecondsRealtime(m_burnInDelay);
m_scrollMat.SetTexture("Texture2D_37fb532d63a84494b37265ae923f74c5", openCloseTexture);
//cant change scale, because the burn effect will go outside paper
SetNoiseDefaultScale();
m_CurrentBurnCurve = m_BurnInOutCurve;
yield return StartCoroutine(BurnInCoroutine(0, openCloseBurnTime));
DisableMainCamera(true);
//Wait until
m_isOpen = true;
eventSystem.enabled = true;
OnScrollOpened();
yield return true;
}
private IEnumerator BurnInCoroutine(float startingTime = 0f, float burnTime = m_defaultBurnTime)
{
Player.Instance.PlayChangePageSound();
float time = startingTime;
//
//Start Coroutine play burn in effect
while (time < burnTime)
{
time += constantDeltaTime;
float val = m_CurrentBurnCurve.Evaluate(time / burnTime);
SetBurnInTh(val);
yield return new WaitForSecondsRealtime(constantDeltaTime);
}
}
public void CloseScroll()
{
StartCoroutine(CloseScrollCoroutine());
}
private IEnumerator CloseScrollCoroutine()
{
yield return StartCoroutine(CloseAndBurnOut());
}
private IEnumerator CloseScrollCoroutine(SubmenuElementsContainer canvaToEnable)
{
m_currentlyOpenedElementsContainer = canvaToEnable;
List interactables = m_currentlyOpenedElementsContainer.interactableCanvas;
if (m_dimElements)
{
interactables.ForEach(group => group.alpha = dimAlpha);
}
yield return StartCoroutine(CloseScrollCoroutine());
if (m_dimElements)
{
interactables.ForEach(group => group.alpha = 1f);
}
}
private IEnumerator CloseAndBurnOut()
{
float time = 0f;
m_isOpen = false;
eventSystem.enabled = false;
if (m_dimElements)
{
List interactables = m_currentlyOpenedElementsContainer.interactableCanvas;
interactables.ForEach(group => group.alpha = 0.5f);
}
SetNoiseDefaultScale();
m_CurrentBurnCurve = m_BurnInOutCurve;
m_scrollAnimator.SetBool("Open", false);
m_scrollMat.SetTexture("Texture2D_37fb532d63a84494b37265ae923f74c5", openCloseTexture);
yield return StartCoroutine(BurnOutCoroutine(0, openCloseBurnTime));
DisableMainCamera(false);
time = 0f;
float fadeStartTime = m_moveInTime - m_bgFadeDuration;
float val = 0;
while (time < m_moveInTime)
{
time += constantDeltaTime;
val = m_MotionCurve.Evaluate(1.0f - time / m_moveInTime);
float bgVal = 1f;
if (time > (fadeStartTime))
{
bgVal = (1f - (time - fadeStartTime) / m_bgFadeDuration);
}
m_bgScrollMat.SetColor(bgColorName, new Color(0, 0, 0, bgVal));
m_scrollTransform.localPosition = m_startPosition - m_startPositionShift * val;
yield return new WaitForSecondsRealtime(constantDeltaTime);
}
BlockUI(false);
ActivateObjects(false);
Resources.UnloadUnusedAssets();
OnScrollClosed();
OnClosed?.Invoke();
eventSystem.enabled = true;
yield return true;
}
private IEnumerator BurnOutCoroutine(float shift = 0f, float burnTime = m_defaultBurnTime)
{
Player.Instance.PlayChangePageSound();
float time = 0f;
while (time < burnTime)
{
time += constantDeltaTime;
float val = m_CurrentBurnCurve.Evaluate(1.0f - time / burnTime);
SetBurnInTh(val);
yield return new WaitForSecondsRealtime(constantDeltaTime);
}
}
private void SetBurnInTh(float burnTh)
{
m_scrollMat.SetFloat("_Threshold", burnTh);
}
private void SetNoiseRandomScale()
{
SetNoiseScale(Random.Range(0.5f, 2.0f));
}
private void SetNoiseDefaultScale()
{
SetNoiseScale(1f);
}
private void SetNoiseScale(float scale)
{
m_scrollMat.SetFloat("_NoiseScale", scale);
}
public IEnumerator ChangeVisibleCanvaCoroutine(SubmenuElementsContainer submenuToDisable, SubmenuElementsContainer submenuToEnable)
{
m_currentlyOpenedElementsContainer = submenuToEnable;
List interactablesToEnable = submenuToEnable.interactableCanvas;
List interactablesToDisable = submenuToDisable.interactableCanvas;
if (m_dimElements)
{
interactablesToEnable.ForEach(group => group.alpha = 0.5f);
interactablesToDisable.ForEach(group => group.alpha = 0.5f);
}
yield return StartCoroutine(ChangeVisibleCanvaCoroutine(submenuToDisable.parentObject, submenuToEnable.parentObject));
if (m_dimElements)
{
interactablesToEnable.ForEach(group => group.alpha = 1f);
}
}
public void ChangeVisibleCanva(GameObject submenuToDisable, GameObject submenuToEnable)
{
StartCoroutine(ChangeVisibleCanvaCoroutine(submenuToDisable, submenuToEnable));
}
public IEnumerator ChangeVisibleCanvaCoroutine(GameObject submenuToDisable, GameObject submenuToEnable)
{
SetNoiseRandomScale();
m_CurrentBurnCurve = m_BurnChangeCurve;
// m_uvInputModule.enabled = false;
eventSystem.enabled = false;
OnNewCanvaBurnStart?.Invoke();
m_scrollMat.SetTexture("Texture2D_37fb532d63a84494b37265ae923f74c5", changeTexture);
yield return StartCoroutine(BurnOutCoroutine(0.1f));
submenuToDisable.SetActive(false);
OnNewCanvaBurnMiddle?.Invoke();
submenuToEnable.SetActive(true);
yield return StartCoroutine(BurnInCoroutine(0.1f));
OnNewCanvaBurnEnd?.Invoke();
// m_uvInputModule.enabled = true;
eventSystem.enabled = true;
// canvaToEnable.GetComponent().alpha = 1f;
m_currentCanva = submenuToEnable;
}
protected virtual void Awake()
{
m_RTTexture.width = Screen.width;
m_RTTexture.height = Screen.height;
if (!m_scrollAnimator)
{
m_scrollAnimator = transform.GetComponentInChildren();
}
m_scrollAnimator.SetBool("Open", false);
m_scrollTransform = m_scrollAnimator.transform.parent;
if (m_scrollMat == null)
m_scrollMat = m_scrollAnimator.transform.GetComponentInChildren().material;
if (m_bgScrollMat == null)
m_bgScrollMat = m_bgRenderer.material;
if (m_volume == null)
m_volume = GameObject.FindObjectOfType();
if (m_volume != null)
m_defaultProfile = m_volume.profile;
}
protected virtual void Start()
{
m_endPosition = m_scrollTransform.localPosition;
m_startPosition = m_endPosition + m_startPositionShift;
m_scrollTransform.localPosition = m_startPosition;
/*
var camera = Camera.main;
if (camera != null)
{
var cameraData = camera.GetUniversalAdditionalCameraData();
if (cameraData.cameraStack.Count == 0)
cameraData.cameraStack.Add(m_ScrollCamera);
}
*/
SetupCamera();
m_ScrollCamera.gameObject.SetActive(false);
m_CanvasCamera.gameObject.SetActive(false);
}
}
}