using UnityEngine; using Utility; namespace GameLogic.Combat.Hero.HeroGPU { public class HeroGPURenderManager : Singleton { protected Map> gpuRenderMap = new Map>(); protected Map gpuRender = new Map(); // MaterialPropertyBlock _materialPropertyBlock = new MaterialPropertyBlock(); public HeroGPURenderManager() { StaticUpdater.Instance.AddRenderUpdateCallBack(Update); } public void AddHeroGpuRender(HeroGPUMono gpuMono) { if (gpuRenderMap.TryGetValue(gpuMono.gameObject.name, out BetterList list)) { list.Add(gpuMono); } else { list = new BetterList(); list.Add(gpuMono); gpuRenderMap.Add(gpuMono.gameObject.name, list); } } public void RemoveHeroGpuRender(HeroGPUMono gpuMono) { if (gpuRenderMap.TryGetValue(gpuMono.gameObject.name, out BetterList list)) { list.Remove(gpuMono); } } public void Update() { for (gpuRenderMap.Begin(); gpuRenderMap.Next();) { int count = gpuRenderMap.Value.Count; if (count <= 0) { continue; } if (!gpuRender.TryGetValue(gpuRenderMap.Key, out GPURender render)) { render = new GPURender(); render.Init(gpuRenderMap.Value[0].Material,gpuRenderMap.Value[0].Mesh); gpuRender.Add(gpuRenderMap.Key, render); } render.Render(gpuRenderMap.Value); // RenderParams rp = new RenderParams(gpuRenderMap.Value[0].Material); // rp.matProps = _materialPropertyBlock; // rp.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; // rp.receiveShadows = false; // Matrix4x4[] instData = new Matrix4x4[count]; // Matrix4x4[] animtionStata = new Matrix4x4[count]; // float[] enableAnimations = new float[count]; // Vector4[] edgeColor = new Vector4[count]; // float[] edgeStrength = new float[count]; // float[] injuriedStrength = new float[count]; // for (int i = 0; i < count; i++) // { // HeroGPUMono heroGPUMono = gpuRenderMap.Value[i]; // instData[i] = heroGPUMono.rootTrans.localToWorldMatrix; // animtionStata[i] = heroGPUMono.animtionState; // edgeColor[i] = heroGPUMono.edgecolor; // edgeStrength[i] = heroGPUMono.edgeStength; // injuriedStrength[i] = heroGPUMono.injuriedStrength; // enableAnimations[i] = 1; // } // // _materialPropertyBlock.SetFloatArray(enableShaderId, enableAnimations); // _materialPropertyBlock.SetMatrixArray(animtionStateId, animtionStata); // _materialPropertyBlock.SetVectorArray(this.edgeColor, edgeColor); // _materialPropertyBlock.SetFloatArray(this.edgeStrength, edgeStrength); // _materialPropertyBlock.SetFloatArray(this.injuriedStrength, injuriedStrength); // Graphics.RenderMeshInstanced(rp, gpuRenderMap.Value[0].Mesh, 0, instData); } } } }