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();
}
}
}