HeroGPURenderManager.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using UnityEngine;
  2. using Utility;
  3. namespace GameLogic.Combat.Hero.HeroGPU
  4. {
  5. public class HeroGPURenderManager : Singleton<HeroGPURenderManager>
  6. {
  7. protected Map<string, BetterList<HeroGPUMono>> gpuRenderMap = new Map<string, BetterList<HeroGPUMono>>();
  8. readonly int enableShaderId = Shader.PropertyToID("_EnableAnimation");
  9. readonly int animtionStateId = Shader.PropertyToID("_AnimationState");
  10. readonly int edgeColor = Shader.PropertyToID("_edgeColor");
  11. readonly int edgeStrength = Shader.PropertyToID("_edgeStrength");
  12. readonly int injuriedStrength = Shader.PropertyToID("_injuriedStrength");
  13. public HeroGPURenderManager()
  14. {
  15. StaticUpdater.Instance.AddRenderUpdateCallBack(Update);
  16. }
  17. public void AddHeroGpuRender(HeroGPUMono gpuMono)
  18. {
  19. if (gpuRenderMap.TryGetValue(gpuMono.gameObject.name, out BetterList<HeroGPUMono> list))
  20. {
  21. list.Add(gpuMono);
  22. }
  23. else
  24. {
  25. list = new BetterList<HeroGPUMono>();
  26. list.Add(gpuMono);
  27. gpuRenderMap.Add(gpuMono.gameObject.name, list);
  28. }
  29. }
  30. public void RemoveHeroGpuRender(HeroGPUMono gpuMono)
  31. {
  32. if (gpuRenderMap.TryGetValue(gpuMono.gameObject.name, out BetterList<HeroGPUMono> list))
  33. {
  34. list.Remove(gpuMono);
  35. }
  36. }
  37. public void Update()
  38. {
  39. for (gpuRenderMap.Begin(); gpuRenderMap.Next();)
  40. {
  41. int count = gpuRenderMap.Value.Count;
  42. if (count <= 0)
  43. {
  44. continue;
  45. }
  46. MaterialPropertyBlock _materialPropertyBlock = new MaterialPropertyBlock();
  47. RenderParams rp = new RenderParams(gpuRenderMap.Value[0].Material);
  48. rp.matProps = _materialPropertyBlock;
  49. rp.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
  50. rp.receiveShadows = false;
  51. Matrix4x4[] instData = new Matrix4x4[count];
  52. Matrix4x4[] animtionStata = new Matrix4x4[count];
  53. float[] enableAnimations = new float[count];
  54. Vector4[] edgeColor = new Vector4[count];
  55. float[] edgeStrength = new float[count];
  56. float[] injuriedStrength = new float[count];
  57. for (int i = 0; i < count; i++)
  58. {
  59. HeroGPUMono heroGPUMono = gpuRenderMap.Value[i];
  60. instData[i] = heroGPUMono.rootTrans.localToWorldMatrix;
  61. animtionStata[i] = heroGPUMono.animtionState;
  62. edgeColor[i] = heroGPUMono.edgecolor;
  63. edgeStrength[i] = heroGPUMono.edgeStength;
  64. injuriedStrength[i] = heroGPUMono.injuriedStrength;
  65. enableAnimations[i] = 1;
  66. }
  67. _materialPropertyBlock.SetFloatArray(enableShaderId, enableAnimations);
  68. _materialPropertyBlock.SetMatrixArray(animtionStateId, animtionStata);
  69. _materialPropertyBlock.SetVectorArray(this.edgeColor, edgeColor);
  70. _materialPropertyBlock.SetFloatArray(this.edgeStrength, edgeStrength);
  71. _materialPropertyBlock.SetFloatArray(this.injuriedStrength, injuriedStrength);
  72. Graphics.RenderMeshInstanced(rp, gpuRenderMap.Value[0].Mesh, 0, instData);
  73. }
  74. }
  75. }
  76. }