BackgroundPanel.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. using Fort23.Core;
  2. using Fort23.Mono.Test;
  3. using Fort23.UTool;
  4. using UnityEngine;
  5. using UnityEngine.Events;
  6. using UnityEngine.Rendering;
  7. using UnityEngine.Rendering.Universal;
  8. namespace Fort23.Mono
  9. {
  10. [UIBinding(prefab = "BackgroundPanel")]
  11. public partial class BackgroundPanel : UIPanel
  12. {
  13. // public RawImage backImage;
  14. public UnityAction callback;
  15. protected Material Material;
  16. /// <summary>
  17. /// 是否激活背景开关
  18. /// </summary>
  19. public bool EnableBGBtn
  20. {
  21. get { return _enableBGBtn; }
  22. set { _enableBGBtn = value; }
  23. }
  24. private bool _enableBGBtn = true;
  25. public void Init()
  26. {
  27. isAddStack = false;
  28. IsShowAppBar = false;
  29. }
  30. protected override void AddEvent()
  31. {
  32. }
  33. private RenderTexture renderTexture
  34. {
  35. get
  36. {
  37. if (_renderTexture == null)
  38. {
  39. _renderTexture = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.Default);
  40. }
  41. return _renderTexture;
  42. }
  43. }
  44. private RenderTexture _renderTexture;
  45. public override CTask Show()
  46. {
  47. if (GObjectPoolInterface == null)
  48. {
  49. return null;
  50. }
  51. CTask cTask = CTask.Create();
  52. _isShow = true;
  53. GObjectPoolInterface.SetActive(true);
  54. if (timerEntity != null)
  55. {
  56. TimerComponent.Instance.Remove(timerEntity);
  57. }
  58. if (openTimerEntity != null)
  59. {
  60. TimerComponent.Instance.Remove(openTimerEntity);
  61. }
  62. ShowAnimator();
  63. cTask.SetResult();
  64. return cTask;
  65. }
  66. protected override async CTask ProOpen()
  67. {
  68. LogTool.Log("start backgroud");
  69. ManualAsyncTask ct = ManualAsyncTask.Create();
  70. // if (GObjectPoolInterface != null)
  71. // {
  72. // GObjectPoolInterface.SetActive(false);
  73. // }
  74. IsClose = true;
  75. isFullUI = true;
  76. UIManager.Instance.RefreshFull();
  77. IsClose = false;
  78. // Shader.SetGlobalTexture(CameraTransparentColorTexture, renderTexture);
  79. InterceptGamePass.SetRenderTexture(renderTexture, delegate { ct.SetResult(); }, executeCallBack: Execute);
  80. await ct.Wait();
  81. LogTool.Log("finish backgroud");
  82. if (RawImage.texture != renderTexture)
  83. {
  84. RawImage.texture = renderTexture;
  85. }
  86. if (GObjectPoolInterface != null)
  87. {
  88. GObjectPoolInterface.SetActive(true);
  89. }
  90. UIManager.Instance.RefreshFull();
  91. // TimerComponent.Instance.AddTimer(500, delegate { UIManager.Instance.RefreshFull(); });
  92. }
  93. protected void Execute(ScriptableRenderContext context, RenderingData renderingData,
  94. RenderTexture renderTargetHandle, RenderTargetIdentifier source,
  95. RenderTextureDescriptor cameraTextureDescriptor)
  96. {
  97. if (Material == null)
  98. {
  99. Material = new Material(Shader.Find("Unlit/MoHu"));
  100. }
  101. // return;
  102. // LogTool.Log("回调背景图加载");
  103. CommandBuffer cmd = CommandBufferPool.Get("background");
  104. int w = cameraTextureDescriptor.width;
  105. int h = cameraTextureDescriptor.height;
  106. int randerIndex = -255;
  107. RenderTargetIdentifier lasetIdentifier = default;
  108. int lasetranderIndex = 10000;
  109. for (int i = 0; i < 4; i++)
  110. {
  111. w /= 2;
  112. h /= 2;
  113. if (w <= 1 || h <= 1)
  114. {
  115. break;
  116. }
  117. int index = Shader.PropertyToID("back_tu" + i);
  118. // isTu1 = !isTu1;
  119. cmd.GetTemporaryRT(index, w, h, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32);
  120. RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(index);
  121. if (lasetranderIndex != 10000)
  122. {
  123. cmd.Blit(lasetIdentifier, renderTargetIdentifier, Material, 0);
  124. cmd.ReleaseTemporaryRT(lasetranderIndex);
  125. }
  126. else
  127. {
  128. cmd.Blit(source, renderTargetIdentifier, Material, 0);
  129. }
  130. lasetIdentifier = renderTargetIdentifier;
  131. lasetranderIndex = index;
  132. }
  133. for (int i = 0; i < 4; i++)
  134. {
  135. w *= 2;
  136. h *= 2;
  137. if (w > cameraTextureDescriptor.width || h > cameraTextureDescriptor.height)
  138. {
  139. break;
  140. }
  141. int index = Shader.PropertyToID("back_fd" + i);
  142. cmd.GetTemporaryRT(index, w, h, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32);
  143. RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(index);
  144. if (lasetranderIndex != 10000)
  145. {
  146. cmd.Blit(lasetIdentifier, renderTargetIdentifier, Material, 1);
  147. cmd.ReleaseTemporaryRT(lasetranderIndex);
  148. }
  149. lasetIdentifier = renderTargetIdentifier;
  150. lasetranderIndex = index;
  151. }
  152. // int index = Shader.PropertyToID("back_tu");
  153. // isTu1 = !isTu1;
  154. // cmd.GetTemporaryRT(index, w, h, 0, FilterMode.Bilinear,
  155. // RenderTextureFormat.ARGB32);
  156. // RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(index);
  157. // cmd.Blit(source, renderTargetIdentifier,Material,0);
  158. cmd.Blit(lasetIdentifier, renderTargetHandle, Material, 2);
  159. cmd.ReleaseTemporaryRT(lasetranderIndex);
  160. context.ExecuteCommandBuffer(cmd);
  161. CommandBufferPool.Release(cmd);
  162. }
  163. /// <summary>
  164. /// 关闭当前有背景的面板
  165. /// </summary>
  166. public void CloseTopPanel()
  167. {
  168. if (!EnableBGBtn)
  169. {
  170. return;
  171. }
  172. if (UIManager.Instance.AllShowBGUIs.Count > 0 && UIManager.Instance.AllShowBGUIs[^1] != null)
  173. {
  174. UIPanel uiPanel = UIManager.Instance.AllShowBGUIs[^1];
  175. if (!uiPanel.IsHindBackground())
  176. {
  177. return;
  178. }
  179. }
  180. UnityAction action = callback;
  181. callback = null;
  182. if (action != null)
  183. action?.Invoke();
  184. Close();
  185. if (UIManager.Instance.AllShowBGUIs.Count > 0 && UIManager.Instance.AllShowBGUIs[^1] != null)
  186. {
  187. UIPanel uiPanel = UIManager.Instance.AllShowBGUIs[^1];
  188. uiPanel.BackgroundCallBack();
  189. UIManager.Instance.HideUIUIPanel(uiPanel);
  190. }
  191. }
  192. public override void AddButtonEvent()
  193. {
  194. Btn_BG.onClick.AddListener(CloseTopPanel);
  195. }
  196. public void CustomInit()
  197. {
  198. }
  199. protected override void DelEvent()
  200. {
  201. }
  202. public async override CTask Close()
  203. {
  204. EnableBGBtn = true;
  205. await base.Close();
  206. }
  207. }
  208. }