holopy3/Assets/UniGLTF/Core/Scripts/IO/TextureConverter.cs
Lena Biresch 490ef558ef CleanUp
2021-01-28 13:07:52 +01:00

177 lines
No EOL
5.1 KiB
C#

using System.Linq;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace UniGLTF
{
public interface ITextureConverter
{
Texture2D GetImportTexture(Texture2D texture);
Texture2D GetExportTexture(Texture2D texture);
}
public static class TextureConverter
{
public delegate Color32 ColorConversion(Color32 color);
public static Texture2D Convert(Texture2D texture, glTFTextureTypes textureType, ColorConversion colorConversion, Material convertMaterial)
{
var copyTexture = TextureItem.CopyTexture(texture, TextureIO.GetColorSpace(textureType), convertMaterial);
if (colorConversion != null)
{
copyTexture.SetPixels32(copyTexture.GetPixels32().Select(x => colorConversion(x)).ToArray());
copyTexture.Apply();
}
copyTexture.name = texture.name;
return copyTexture;
}
public static void AppendTextureExtension(Texture texture, string extension)
{
if (!texture.name.EndsWith(extension))
{
texture.name = texture.name + extension;
}
}
public static void RemoveTextureExtension(Texture texture, string extension)
{
if (texture.name.EndsWith(extension))
{
texture.name = texture.name.Replace(extension, "");
}
}
}
class MetallicRoughnessConverter : ITextureConverter
{
private const string m_extension = ".metallicRoughness";
public Texture2D GetImportTexture(Texture2D texture)
{
var converted = TextureConverter.Convert(texture, glTFTextureTypes.Metallic, Import, null);
TextureConverter.AppendTextureExtension(converted, m_extension);
return converted;
}
public Texture2D GetExportTexture(Texture2D texture)
{
var converted = TextureConverter.Convert(texture, glTFTextureTypes.Metallic, Export, null);
TextureConverter.RemoveTextureExtension(converted, m_extension);
return converted;
}
public Color32 Import(Color32 src)
{
return new Color32
{
r = src.b,
g = 0,
b = 0,
a = (byte)(255 - src.g),
};
}
public Color32 Export(Color32 src)
{
return new Color32
{
r = 0,
g = (byte)(255 - src.a),
b = src.r,
a = 255,
};
}
}
class NormalConverter : ITextureConverter
{
private const string m_extension = ".normal";
private Material m_decoder;
private Material GetDecoder()
{
if (m_decoder == null)
{
m_decoder = new Material(Shader.Find("UniGLTF/NormalMapDecoder"));
}
return m_decoder;
}
private Material m_encoder;
private Material GetEncoder()
{
if (m_encoder == null)
{
m_encoder = new Material(Shader.Find("UniGLTF/NormalMapEncoder"));
}
return m_encoder;
}
public Texture2D GetImportTexture(Texture2D texture)
{
#if UNITY_WEBGL && !UNITY_EDITOR
return texture;
#endif
var mat = GetEncoder();
var converted = TextureConverter.Convert(texture, glTFTextureTypes.Normal, null, mat);
TextureConverter.AppendTextureExtension(converted, m_extension);
return converted;
}
public Texture2D GetExportTexture(Texture2D texture)
{
#if UNITY_WEBGL && !UNITY_EDITOR
return texture;
#endif
var mat = GetDecoder();
var converted = TextureConverter.Convert(texture, glTFTextureTypes.Normal, null, mat);
TextureConverter.RemoveTextureExtension(converted, m_extension);
return converted;
}
}
class OcclusionConverter : ITextureConverter
{
private const string m_extension = ".occlusion";
public Texture2D GetImportTexture(Texture2D texture)
{
var converted = TextureConverter.Convert(texture, glTFTextureTypes.Occlusion, Import, null);
TextureConverter.AppendTextureExtension(converted, m_extension);
return converted;
}
public Texture2D GetExportTexture(Texture2D texture)
{
var converted = TextureConverter.Convert(texture, glTFTextureTypes.Occlusion, Export, null);
TextureConverter.RemoveTextureExtension(converted, m_extension);
return converted;
}
public Color32 Import(Color32 src)
{
return new Color32
{
r = 0,
g = src.r,
b = 0,
a = 255,
};
}
public Color32 Export(Color32 src)
{
return new Color32
{
r = src.g,
g = 0,
b = 0,
a = 255,
};
}
}
}