Files
SimUL/Assets/UMA/Editor/ConvertToSubstance.cs
2025-01-07 18:54:46 +02:00

92 lines
2.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System;
public class ConvertToSubstance : EditorWindow
{
private MonoScript targetMonoScript;
private Vector2 scrollPos;
Texture2D texture;
[MenuItem("UMA/Tools/Convert ZB Alpha to Substance Alpha")]
public static void ShowWindow()
{
GetWindow<ConvertToSubstance>(true, "Convert Grayscale to Subtance Alpha", true);
}
void OnGUI()
{
texture = (Texture2D)EditorGUILayout.ObjectField("Texture (2D)", texture, typeof(Texture2D), false);
if (GUILayout.Button("Convert"))
{
if (texture == null)
{
EditorUtility.DisplayDialog("Error", "Please select a texture", "OK");
return;
}
string path = EditorUtility.SaveFilePanel("Save Texture", "","file.png", "png");
if (!string.IsNullOrEmpty(path))
{
var newTex = ConvertTexture(texture);
if (newTex == null)
{
EditorUtility.DisplayDialog("Error", "Texture is not readable", "OK");
return;
}
byte[] bytes = newTex.EncodeToPNG();
System.IO.File.WriteAllBytes(path, bytes);
GameObject.DestroyImmediate(newTex);
}
}
}
private static Texture2D ConvertTexture(Texture TextureToConvert)
{
if (TextureToConvert != null)
{
Texture2D tex = (Texture2D)TextureToConvert;
Color32[] pixels = tex.GetPixels32();
byte alphabase = pixels[0].r;
for (int i = 0; i < pixels.Length; i++)
{
Color32 pixel = pixels[i];
float alpha = 1.0f;
float dist = Mathf.Abs(pixel.r - alphabase);
if (pixel.r > alphabase)
{
float upperRange = 255 - alphabase;
if (upperRange == 0)
{
alpha = 1;
}
else
{
alpha = dist / upperRange;
}
}
else
{
float lowerRange = alphabase;
if (lowerRange == 0)
{
alpha = 0;
}
else
{
alpha = dist / lowerRange;
}
}
pixels[i].a = (byte)(alpha * 255);
}
Texture2D newTex = new Texture2D(tex.width, tex.height, TextureFormat.RGBA32,false);
newTex.SetPixels32(pixels);
newTex.Apply();
}
return null;
}
}