114 lines
2.7 KiB
C#
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);
|
|
}
|
|
}
|