1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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<Matrix4x4> instData = new BetterList<Matrix4x4>(100);
- BetterList<Matrix4x4> animtionStata = new BetterList<Matrix4x4>(100);
- BetterList<float> enableAnimations = new BetterList<float>(100);
- BetterList<Vector4> edgeColor = new BetterList<Vector4>(100);
- BetterList<float> edgeStrength = new BetterList<float>(100);
- BetterList<float> injuriedStrength = new BetterList<float>(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<HeroGPUMono> 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);
- }
- }
- }
|