155 lines
4.9 KiB
C#
155 lines
4.9 KiB
C#
using System;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
|
|
public class ApexWeaponHudControllerBase : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
protected ComputeShader cptShader;
|
|
[SerializeField, Range(0, 100)]
|
|
protected int interPerc;
|
|
[SerializeField]
|
|
protected TMP_Text boundText;
|
|
[SerializeField]
|
|
protected TMP_Text[] miscText;
|
|
[SerializeField]
|
|
protected Renderer screenRenderer;
|
|
[SerializeField]
|
|
protected Texture maskTexture;
|
|
[SerializeField]
|
|
protected int matIndex;
|
|
[SerializeField, Range(0, 32)]
|
|
protected int depth = 0;
|
|
[SerializeField]
|
|
protected RenderTextureFormat renderTextureFormat = RenderTextureFormat.Default;
|
|
[SerializeField]
|
|
protected FilterMode filterMode = FilterMode.Point;
|
|
[SerializeField]
|
|
protected UnityEngine.Experimental.Rendering.GraphicsFormat graphicsFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_SRGB;
|
|
[SerializeField]
|
|
private string kernalName;
|
|
[SerializeField, Range(0, 1)]
|
|
protected float xScale = 1, yScale = 1;
|
|
protected int kernalIndex = -1;
|
|
protected Material mat;
|
|
protected int xGroupCount, yGroupCount;
|
|
protected CustomRenderTexture targetTexture;
|
|
protected static bool shaderEnabled;
|
|
protected static bool stateChecked = false;
|
|
//max count, elem count, inter pixels, map size
|
|
protected readonly int[] dataArray = new int[3];
|
|
protected Color color = Color.white;
|
|
|
|
protected static readonly int id_color = Shader.PropertyToID("color");
|
|
protected static readonly int id_dataArray = Shader.PropertyToID("dataArray");
|
|
protected static readonly int id_Mask = Shader.PropertyToID("Mask");
|
|
protected static readonly int id_EmissionMap = Shader.PropertyToID("EmissionMap");
|
|
protected static readonly int id_EmissionColor = Shader.PropertyToID("_EmissionColor");
|
|
|
|
protected virtual void Awake()
|
|
{
|
|
if (!stateChecked)
|
|
{
|
|
shaderEnabled = SystemInfo.supportsComputeShaders && SystemInfo.graphicsDeviceType != UnityEngine.Rendering.GraphicsDeviceType.Null && !Application.isBatchMode;
|
|
stateChecked = true;
|
|
Console.WriteLine("Compute shader support: " + shaderEnabled);
|
|
}
|
|
|
|
dataArray[0] = 1;
|
|
dataArray[1] = 0;
|
|
dataArray[2] = interPerc;
|
|
xGroupCount = (int)(maskTexture.width * xScale / 8);
|
|
yGroupCount = (int)(maskTexture.height * yScale / 8);
|
|
mat = screenRenderer.materials[matIndex];
|
|
}
|
|
|
|
protected virtual void OnEnable()
|
|
{
|
|
if (!shaderEnabled)
|
|
return;
|
|
|
|
if (targetTexture == null)
|
|
{
|
|
targetTexture = new CustomRenderTexture(maskTexture.width, maskTexture.height, renderTextureFormat)
|
|
{
|
|
enableRandomWrite = true,
|
|
updateMode = CustomRenderTextureUpdateMode.OnDemand,
|
|
depth = depth,
|
|
useMipMap = false,
|
|
autoGenerateMips = false,
|
|
filterMode = filterMode,
|
|
graphicsFormat = graphicsFormat,
|
|
wrapMode = TextureWrapMode.Clamp
|
|
};
|
|
}
|
|
|
|
if (!targetTexture.IsCreated())
|
|
targetTexture.Create();
|
|
|
|
mat.SetTexture("_EmissionMap", targetTexture);
|
|
mat.SetColor(id_EmissionColor, Color.white);
|
|
mat.EnableKeyword("_EMISSION");
|
|
if (cptShader.HasKernel(kernalName))
|
|
kernalIndex = cptShader.FindKernel(kernalName);
|
|
}
|
|
|
|
protected virtual void OnDisable()
|
|
{
|
|
|
|
}
|
|
|
|
protected virtual void OnDestroy()
|
|
{
|
|
OnDisable();
|
|
if (targetTexture != null)
|
|
targetTexture.Release();
|
|
}
|
|
|
|
public virtual void SetColor(Color color)
|
|
{
|
|
if (boundText != null)
|
|
boundText.color = color;
|
|
if (miscText != null)
|
|
foreach (var t in miscText)
|
|
t.color = color;
|
|
|
|
this.color = color;
|
|
//mat.SetColor(id_EmissionColor, color);
|
|
if (CanDispatch())
|
|
Dispatch(dataArray);
|
|
}
|
|
|
|
public virtual void SetText(string text)
|
|
{
|
|
if (text.StartsWith("#"))
|
|
{
|
|
dataArray[0] = Mathf.Max(int.Parse(text.Substring(1)), 1);
|
|
}
|
|
else
|
|
{
|
|
if (boundText != null)
|
|
boundText.SetText(text);
|
|
dataArray[1] = int.Parse(text);
|
|
}
|
|
|
|
if (CanDispatch())
|
|
Dispatch(dataArray);
|
|
}
|
|
|
|
protected virtual bool CanDispatch()
|
|
{
|
|
return shaderEnabled && kernalIndex >= 0;
|
|
}
|
|
|
|
protected virtual void Dispatch(int[] dataArray)
|
|
{
|
|
cptShader.SetInts(id_dataArray, dataArray);
|
|
cptShader.SetVector(id_color, color);
|
|
cptShader.SetTexture(kernalIndex, id_Mask, maskTexture);
|
|
cptShader.SetTexture(kernalIndex, id_EmissionMap, targetTexture, 0);
|
|
cptShader.Dispatch(kernalIndex, xGroupCount, yGroupCount, 1);
|
|
//targetTexture.GenerateMips();
|
|
//targetTexture.Update();
|
|
}
|
|
}
|