using System; using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using UnityEngine; namespace GameLogic.Combat.Hero.HeroGPU { public class GPURender { private static readonly int shader_enableShaderId = Shader.PropertyToID("_EnableAnimation"); readonly int shader_animtionStateId = Shader.PropertyToID("_AnimationState"); readonly int shader_edgeColor = Shader.PropertyToID("_edgeColor"); readonly int shader_edgeStrength = Shader.PropertyToID("_edgeStrength"); readonly int shader_injuriedStrength = Shader.PropertyToID("_injuriedStrength"); public Material Material; public Mesh Mesh; public MaterialPropertyBlock _materialPropertyBlock; BetterList instData = new BetterList(100); BetterList animtionStata = new BetterList(100); BetterList enableAnimations = new BetterList(100); BetterList edgeColor = new BetterList(100); BetterList edgeStrength = new BetterList(100); BetterList injuriedStrength = new BetterList(100); private RenderParams rp; public void Init(Material Material, Mesh Mesh) { this.Material = Material; this.Mesh = Mesh; _materialPropertyBlock = new MaterialPropertyBlock(); rp = new RenderParams(Material); rp.matProps = _materialPropertyBlock; rp.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; rp.receiveShadows = false; } public void Render(BetterList gpuMonoList) { int count = gpuMonoList.Count; if (count <= 0) { return; } _materialPropertyBlock.Clear(); // 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]; instData.Clear(); animtionStata.Clear(); enableAnimations.Clear(); edgeColor.Clear(); edgeStrength.Clear(); injuriedStrength.Clear(); int rendCombat = 0; for (int i = 0; i < count; i++) { HeroGPUMono heroGPUMono = gpuMonoList[i]; if (!heroGPUMono.gameObject.activeSelf) { continue; } rendCombat++; instData.Add(heroGPUMono.rootTrans.localToWorldMatrix); animtionStata.Add(heroGPUMono.animtionState); edgeColor.Add(heroGPUMono.edgecolor); edgeStrength.Add(heroGPUMono.edgeStength); injuriedStrength.Add(heroGPUMono.injuriedStrength); enableAnimations.Add(1); } _materialPropertyBlock.SetFloatArray(shader_enableShaderId, enableAnimations.ToArray(true)); _materialPropertyBlock.SetMatrixArray(shader_animtionStateId, animtionStata.ToArray(true)); _materialPropertyBlock.SetVectorArray(shader_edgeColor, edgeColor.ToArray(true)); _materialPropertyBlock.SetFloatArray(shader_edgeStrength, edgeStrength.ToArray(true)); _materialPropertyBlock.SetFloatArray(shader_injuriedStrength, injuriedStrength.ToArray(true)); Graphics.RenderMeshInstanced(rp, Mesh, 0, instData.ToArray(true), rendCombat, 0); } } }