Files
0A-KFCommonUtilityLib/KFAttached/KFUtilAttached/ApexWeaponHudControllerBase.cs
2025-06-04 16:13:32 +09:30

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();
}
}