213 lines
4.6 KiB
C#
213 lines
4.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
|
|
namespace Mtree
|
|
{
|
|
public class Utils
|
|
{
|
|
public static string GetCurrentPipeline()
|
|
{
|
|
string result = "legacy";
|
|
if (GraphicsSettings.renderPipelineAsset != null)
|
|
{
|
|
if (GraphicsSettings.renderPipelineAsset.GetType().ToString().Contains("LightweightRenderPipelineAsset"))
|
|
{
|
|
result = "lwrp";
|
|
}
|
|
if (GraphicsSettings.renderPipelineAsset.GetType().ToString().Contains("UniversalRenderPipelineAsset"))
|
|
{
|
|
result = "urp";
|
|
}
|
|
if (GraphicsSettings.renderPipelineAsset.GetType().ToString().Contains("HDRenderPipelineAsset"))
|
|
{
|
|
result = "hdrp";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
result = "legacy";
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static Shader GetBarkShader()
|
|
{
|
|
Shader result = null;
|
|
switch (GetCurrentPipeline())
|
|
{
|
|
case "legacy":
|
|
result = Shader.Find("Mtree/Bark");
|
|
break;
|
|
case "lwrp":
|
|
result = Shader.Find("Mtree/SRP/Bark LWRP");
|
|
break;
|
|
case "hdrp":
|
|
result = Shader.Find("Mtree/SRP/Bark HDRP");
|
|
break;
|
|
case "urp":
|
|
result = Shader.Find("Mtree/SRP/Bark URP");
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static Shader GetLeafShader()
|
|
{
|
|
Shader result = null;
|
|
switch (GetCurrentPipeline())
|
|
{
|
|
case "legacy":
|
|
result = Shader.Find("Mtree/Leafs");
|
|
break;
|
|
case "lwrp":
|
|
result = Shader.Find("Mtree/SRP/Leafs LWRP");
|
|
break;
|
|
case "hdrp":
|
|
result = Shader.Find("Mtree/SRP/Leafs HDRP");
|
|
break;
|
|
case "urp":
|
|
result = Shader.Find("Mtree/SRP/Leafs URP");
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static Shader GetBillboardShader()
|
|
{
|
|
Shader result = null;
|
|
switch (GetCurrentPipeline())
|
|
{
|
|
case "legacy":
|
|
result = Shader.Find("Mtree/Billboard");
|
|
break;
|
|
case "lwrp":
|
|
result = Shader.Find("Mtree/SRP/Billboard LWRP");
|
|
break;
|
|
case "hdrp":
|
|
result = Shader.Find("Mtree/SRP/Billboard HDRP");
|
|
break;
|
|
case "urp":
|
|
result = Shader.Find("Mtree/SRP/Billboard URP");
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static Shader GetVertexColorShader()
|
|
{
|
|
Shader result = null;
|
|
switch (GetCurrentPipeline())
|
|
{
|
|
case "legacy":
|
|
result = Shader.Find("Hidden/Mtree/VertexColorShader");
|
|
break;
|
|
case "lwrp":
|
|
result = Shader.Find("Hidden/Mtree/SRP/VertexColorShader LWRP");
|
|
break;
|
|
case "hdrp":
|
|
result = Shader.Find("Hidden/Mtree/SRP/VertexColorShader HDRP");
|
|
break;
|
|
case "urp":
|
|
result = Shader.Find("Hidden/Mtree/SRP/VertexColorShader URP");
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static T[] SampleArray<T>(T[] array, int number)
|
|
{
|
|
number = Mathf.Max(0, Mathf.Min(array.Length, number));
|
|
T[] array2 = new T[number];
|
|
for (int i = 0; i < number; i++)
|
|
{
|
|
int num = UnityEngine.Random.Range(i, array.Length - 1);
|
|
array2[i] = array[num];
|
|
array[num] = array[i];
|
|
}
|
|
return array2;
|
|
}
|
|
|
|
public static void DilateTexture(Texture2D texture, int iterations)
|
|
{
|
|
Color[] pixels = texture.GetPixels();
|
|
Color[] array = new Color[pixels.Length];
|
|
Array.Copy(pixels, array, pixels.Length);
|
|
HashSet<int> hashSet = new HashSet<int>();
|
|
HashSet<int> hashSet2 = new HashSet<int>();
|
|
int width = texture.width;
|
|
int height = texture.height;
|
|
for (int i = 0; i < pixels.Length; i++)
|
|
{
|
|
if (!(pixels[i].a < 0.5f))
|
|
{
|
|
continue;
|
|
}
|
|
for (int j = -1; j < 2; j++)
|
|
{
|
|
int num = -1;
|
|
while (num < 2)
|
|
{
|
|
int num2 = i + num * width + j;
|
|
if (num2 < 0 || num2 >= pixels.Length || !(pixels[num2].a > 0.5f))
|
|
{
|
|
num++;
|
|
continue;
|
|
}
|
|
goto IL_009b;
|
|
}
|
|
continue;
|
|
IL_009b:
|
|
hashSet.Add(i);
|
|
break;
|
|
}
|
|
}
|
|
for (int k = 0; k < iterations; k++)
|
|
{
|
|
foreach (int item in hashSet)
|
|
{
|
|
Color black = Color.black;
|
|
int num3 = 0;
|
|
for (int l = -1; l < 2; l++)
|
|
{
|
|
for (int m = -1; m < 2; m++)
|
|
{
|
|
int num4 = item + m * width + l;
|
|
if (num4 >= 0 && num4 < pixels.Length && num4 != item)
|
|
{
|
|
if (pixels[num4].a > 0.5f)
|
|
{
|
|
pixels[num4].a = 1f;
|
|
black += pixels[num4];
|
|
num3++;
|
|
}
|
|
else
|
|
{
|
|
hashSet2.Add(num4);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
pixels[item] = black / num3;
|
|
}
|
|
hashSet2.ExceptWith(hashSet);
|
|
hashSet = hashSet2;
|
|
hashSet2 = new HashSet<int>();
|
|
}
|
|
for (int n = 0; n < pixels.Length; n++)
|
|
{
|
|
pixels[n].a = array[n].a;
|
|
}
|
|
texture.SetPixels(pixels);
|
|
}
|
|
|
|
public static void AddTriangle(Queue<int> triangles, int i1, int i2, int i3)
|
|
{
|
|
triangles.Enqueue(i1);
|
|
triangles.Enqueue(i2);
|
|
triangles.Enqueue(i3);
|
|
}
|
|
}
|
|
}
|