Files
2026-02-21 16:45:37 +08:00

114 lines
2.7 KiB
C#

using UnityEngine;
public class rtp_functions
{
public static Texture2D PrepareHeights(int num, int numLayers, Texture2D[] Heights)
{
if (Heights == null)
{
return null;
}
for (int i = 0; i < Heights.Length; i++)
{
int num2 = 9999;
for (int j = i / 4 * 4; j < i / 4 * 4 + 4 && j < Heights.Length; j++)
{
if ((bool)Heights[j] && Heights[j].width < num2)
{
num2 = Heights[j].width;
}
}
}
Texture2D[] array = new Texture2D[4];
int num3 = 256;
int num4 = ((numLayers >= 12) ? 12 : numLayers);
if (num >= num4)
{
return null;
}
num = (num >> 2) * 4;
for (int k = num; k < num + 4; k++)
{
if (num < 4)
{
array[k] = ((k >= Heights.Length) ? null : Heights[k]);
if ((bool)array[k])
{
num3 = array[k].width;
}
}
else if (num < 8)
{
array[k - 4] = ((k >= Heights.Length) ? null : Heights[k]);
if ((bool)array[k - 4])
{
num3 = array[k - 4].width;
}
}
else
{
array[k - 8] = ((k >= Heights.Length) ? null : Heights[k]);
if ((bool)array[k - 8])
{
num3 = array[k - 8].width;
}
}
}
for (int k = 0; k < 4; k++)
{
if (!array[k])
{
array[k] = new Texture2D(num3, num3);
FillTex(array[k], new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue));
}
}
return CombineHeights(array[0], array[1], array[2], array[3]);
}
public static Texture2D CombineHeights(Texture2D source_tex0, Texture2D source_tex1, Texture2D source_tex2, Texture2D source_tex3)
{
Texture2D texture2D = new Texture2D(source_tex0.width, source_tex0.height, TextureFormat.ARGB32, true, true);
byte[] array = get_alpha_channel(source_tex0);
byte[] array2 = get_alpha_channel(source_tex1);
byte[] array3 = get_alpha_channel(source_tex2);
byte[] array4 = get_alpha_channel(source_tex3);
Color32[] pixels = texture2D.GetPixels32();
for (int i = 0; i < pixels.Length; i++)
{
pixels[i].r = array[i];
pixels[i].g = array2[i];
pixels[i].b = array3[i];
pixels[i].a = array4[i];
}
texture2D.SetPixels32(pixels);
texture2D.Apply(true, false);
texture2D.Compress(true);
texture2D.filterMode = FilterMode.Trilinear;
return texture2D;
}
private static byte[] get_alpha_channel(Texture2D source_tex)
{
Color32[] pixels = source_tex.GetPixels32();
byte[] array = new byte[pixels.Length];
for (int i = 0; i < pixels.Length; i++)
{
array[i] = pixels[i].a;
}
return array;
}
private static void FillTex(Texture2D tex, Color32 col)
{
Color32[] pixels = tex.GetPixels32();
for (int i = 0; i < pixels.Length; i++)
{
pixels[i].r = col.r;
pixels[i].g = col.g;
pixels[i].b = col.b;
pixels[i].a = col.a;
}
tex.SetPixels32(pixels);
}
}