using Fort23.Core; using Fort23.Mono.Test; using Fort23.UTool; using UnityEngine; using UnityEngine.Events; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; namespace Fort23.Mono { [UIBinding(prefab = "BackgroundPanel")] public partial class BackgroundPanel : UIPanel { // public RawImage backImage; public UnityAction callback; protected Material Material; /// /// 是否激活背景开关 /// public bool EnableBGBtn { get { return _enableBGBtn; } set { _enableBGBtn = value; } } private bool _enableBGBtn = true; public void Init() { isAddStack = false; IsShowAppBar = false; } protected override void AddEvent() { } private RenderTexture renderTexture { get { if (_renderTexture == null) { _renderTexture = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.Default); } return _renderTexture; } } private RenderTexture _renderTexture; public override CTask Show() { if (GObjectPoolInterface == null) { return null; } CTask cTask = CTask.Create(); _isShow = true; GObjectPoolInterface.SetActive(true); if (timerEntity != null) { TimerComponent.Instance.Remove(timerEntity); } if (openTimerEntity != null) { TimerComponent.Instance.Remove(openTimerEntity); } ShowAnimator(); cTask.SetResult(); return cTask; } protected override async CTask ProOpen() { ManualAsyncTask ct = ManualAsyncTask.Create(); // if (GObjectPoolInterface != null) // { // GObjectPoolInterface.SetActive(false); // } IsClose = true; isFullUI = true; UIManager.Instance.RefreshFull(); IsClose = false; // Shader.SetGlobalTexture(CameraTransparentColorTexture, renderTexture); InterceptGamePass.SetRenderTexture(renderTexture, delegate { ct.SetResult(); }, executeCallBack: Execute); await ct.Wait(); LogTool.Log("完成背景图加载"); if (RawImage.texture != renderTexture) { RawImage.texture = renderTexture; } if (GObjectPoolInterface != null) { GObjectPoolInterface.SetActive(true); } UIManager.Instance.RefreshFull(); // TimerComponent.Instance.AddTimer(500, delegate { UIManager.Instance.RefreshFull(); }); } protected void Execute(ScriptableRenderContext context, RenderingData renderingData, RenderTexture renderTargetHandle, RenderTargetIdentifier source, RenderTextureDescriptor cameraTextureDescriptor) { if (Material == null) { Material = new Material(Shader.Find("Unlit/MoHu")); } // return; // LogTool.Log("回调背景图加载"); CommandBuffer cmd = CommandBufferPool.Get("background"); int w = cameraTextureDescriptor.width; int h = cameraTextureDescriptor.height; int randerIndex = -255; RenderTargetIdentifier lasetIdentifier = default; int lasetranderIndex = 10000; for (int i = 0; i < 4; i++) { w /= 2; h /= 2; if (w <= 1 || h <= 1) { break; } int index = Shader.PropertyToID("back_tu" + i); // isTu1 = !isTu1; cmd.GetTemporaryRT(index, w, h, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32); RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(index); if (lasetranderIndex != 10000) { cmd.Blit(lasetIdentifier, renderTargetIdentifier, Material, 0); cmd.ReleaseTemporaryRT(lasetranderIndex); } else { cmd.Blit(source, renderTargetIdentifier, Material, 0); } lasetIdentifier = renderTargetIdentifier; lasetranderIndex = index; } for (int i = 0; i < 4; i++) { w *= 2; h *= 2; if (w > cameraTextureDescriptor.width || h > cameraTextureDescriptor.height) { break; } int index = Shader.PropertyToID("back_fd" + i); cmd.GetTemporaryRT(index, w, h, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32); RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(index); if (lasetranderIndex != 10000) { cmd.Blit(lasetIdentifier, renderTargetIdentifier, Material, 1); cmd.ReleaseTemporaryRT(lasetranderIndex); } lasetIdentifier = renderTargetIdentifier; lasetranderIndex = index; } // int index = Shader.PropertyToID("back_tu"); // isTu1 = !isTu1; // cmd.GetTemporaryRT(index, w, h, 0, FilterMode.Bilinear, // RenderTextureFormat.ARGB32); // RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(index); // cmd.Blit(source, renderTargetIdentifier,Material,0); cmd.Blit(lasetIdentifier, renderTargetHandle, Material, 2); cmd.ReleaseTemporaryRT(lasetranderIndex); context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } /// /// 关闭当前有背景的面板 /// public void CloseTopPanel() { if (!EnableBGBtn) { return; } if (UIManager.Instance.AllShowBGUIs.Count > 0 && UIManager.Instance.AllShowBGUIs[^1] != null) { UIPanel uiPanel = UIManager.Instance.AllShowBGUIs[^1]; if (!uiPanel.IsHindBackground()) { return; } } UnityAction action = callback; callback = null; if (action != null) action?.Invoke(); Close(); if (UIManager.Instance.AllShowBGUIs.Count > 0 && UIManager.Instance.AllShowBGUIs[^1] != null) { UIPanel uiPanel = UIManager.Instance.AllShowBGUIs[^1]; uiPanel.BackgroundCallBack(); UIManager.Instance.HideUIUIPanel(uiPanel); } } public override void AddButtonEvent() { Btn_BG.onClick.AddListener(CloseTopPanel); } public void CustomInit() { } protected override void DelEvent() { } public override void Close() { EnableBGBtn = true; base.Close(); } } }